emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master e56e9c19545: Adjust dump file location under Android


From: Po Lu
Subject: master e56e9c19545: Adjust dump file location under Android
Date: Sat, 11 Nov 2023 22:45:14 -0500 (EST)

branch: master
commit e56e9c19545f43c35dec85fa650f3799c6e9c308
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Adjust dump file location under Android
    
    * java/org/gnu/emacs/EmacsApplication.java (EmacsApplication)
    <apkFileName>: New field.
    (getApkFile): Move from EmacsService.java.
    (findDumpFile): If the dump file is older than the APK, delete
    it irrespective of whether the checksums agree.
    (onCreate): Initialize apkFileName.
    
    * java/org/gnu/emacs/EmacsService.java (onCreate): Use
    EmacsApplication.apkFileName.
    
    * src/android.c (android_on_low_memory): Correct arguments to
    Fclear_image_cache.
    
    * src/image.c (Fclear_image_cache): Check that animation_cache
    is always a cons.
---
 java/org/gnu/emacs/EmacsApplication.java | 73 ++++++++++++++++++++++++++++++--
 java/org/gnu/emacs/EmacsService.java     | 34 +--------------
 src/android.c                            |  2 +-
 src/image.c                              |  1 +
 4 files changed, 73 insertions(+), 37 deletions(-)

diff --git a/java/org/gnu/emacs/EmacsApplication.java 
b/java/org/gnu/emacs/EmacsApplication.java
index 8afa5bcedb4..d70f16346e5 100644
--- a/java/org/gnu/emacs/EmacsApplication.java
+++ b/java/org/gnu/emacs/EmacsApplication.java
@@ -25,19 +25,61 @@ import java.io.FileFilter;
 import android.content.Context;
 
 import android.app.Application;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager.ApplicationInfoFlags;
+import android.content.pm.PackageManager;
+
+import android.os.Build;
+
 import android.util.Log;
 
 public final class EmacsApplication extends Application
 {
   private static final String TAG = "EmacsApplication";
 
-  /* The name of the dump file to use.  */
+  /* The name of the dump file to use, or NULL if this Emacs binary
+     has yet to be dumped.  */
   public static String dumpFileName;
 
+  /* The name of the APK file housing Emacs, or NULL if it could not
+     be ascertained.  */
+  public static String apkFileName;
+
+  @SuppressWarnings ("deprecation")
+  private String
+  getApkFile ()
+  {
+    PackageManager manager;
+    ApplicationInfo info;
+
+    manager = getPackageManager ();
+
+    try
+      {
+       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU)
+         info = manager.getApplicationInfo ("org.gnu.emacs", 0);
+       else
+         info = manager.getApplicationInfo ("org.gnu.emacs",
+                                            ApplicationInfoFlags.of (0));
+
+       /* Return an empty string upon failure.  */
+
+       if (info.sourceDir != null)
+         return info.sourceDir;
+
+       return null;
+      }
+    catch (Exception e)
+      {
+       return null;
+      }
+  }
+
   public static void
   findDumpFile (Context context)
   {
-    File filesDirectory;
+    File filesDirectory, apk;
     File[] allFiles;
     String wantedDumpFile;
     int i;
@@ -67,7 +109,29 @@ public final class EmacsApplication extends Application
     for (i = 0; i < allFiles.length; ++i)
       {
        if (allFiles[i].getName ().equals (wantedDumpFile))
-         dumpFileName = allFiles[i].getAbsolutePath ();
+         {
+           /* Compare the last modified time of the dumpfile with
+              that of apkFileName, the time at which Emacs was
+              installed.  Delete it if the dump file was created
+              before Emacs was installed, even if the C signature
+              (representing libemacs.so) remains identical.  */
+
+           if (apkFileName != null)
+             {
+               apk = new File (apkFileName);
+
+               if (apk.lastModified ()
+                   > allFiles[i].lastModified ())
+                 {
+                   allFiles[i].delete ();
+
+                   /* Don't set the dump file name in this case.  */
+                   continue;
+                 }
+             }
+
+           dumpFileName = allFiles[i].getAbsolutePath ();
+         }
        else
          /* Delete this outdated dump file.  */
          allFiles[i].delete ();
@@ -83,6 +147,9 @@ public final class EmacsApplication extends Application
        will be restored for the Emacs thread in `initEmacs'.  */
     EmacsNative.setupSystemThread ();
 
+    /* Establish the name of the APK.  */
+    apkFileName = getApkFile ();
+
     /* Locate a suitable dump file.  */
     findDumpFile (this);
 
diff --git a/java/org/gnu/emacs/EmacsService.java 
b/java/org/gnu/emacs/EmacsService.java
index 1aac1a6c4dd..5bd1dcc5a88 100644
--- a/java/org/gnu/emacs/EmacsService.java
+++ b/java/org/gnu/emacs/EmacsService.java
@@ -53,8 +53,6 @@ import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.UriPermission;
 
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager.ApplicationInfoFlags;
 import android.content.pm.PackageManager;
 
 import android.content.res.AssetManager;
@@ -193,36 +191,6 @@ public final class EmacsService extends Service
     return null;
   }
 
-  @SuppressWarnings ("deprecation")
-  private String
-  getApkFile ()
-  {
-    PackageManager manager;
-    ApplicationInfo info;
-
-    manager = getPackageManager ();
-
-    try
-      {
-       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU)
-         info = manager.getApplicationInfo ("org.gnu.emacs", 0);
-       else
-         info = manager.getApplicationInfo ("org.gnu.emacs",
-                                            ApplicationInfoFlags.of (0));
-
-       /* Return an empty string upon failure.  */
-
-       if (info.sourceDir != null)
-         return info.sourceDir;
-
-       return "";
-      }
-    catch (Exception e)
-      {
-       return "";
-      }
-  }
-
   /* Return the display density, adjusted in accord with the user's
      text scaling preferences.  */
 
@@ -288,7 +256,7 @@ public final class EmacsService extends Service
        /* Now provide this application's apk file, so a recursive
           invocation of app_process (through android-emacs) can
           find EmacsNoninteractive.  */
-       classPath = getApkFile ();
+       classPath = EmacsApplication.apkFileName;
 
        Log.d (TAG, "Initializing Emacs, where filesDir = " + filesDir
               + ", libDir = " + libDir + ", and classPath = " + classPath
diff --git a/src/android.c b/src/android.c
index 7a670cb507f..e116426ca05 100644
--- a/src/android.c
+++ b/src/android.c
@@ -1965,7 +1965,7 @@ NATIVE_NAME (shutDownEmacs) (JNIEnv *env, jobject object)
 static void
 android_on_low_memory (void *closure)
 {
-  Fclear_image_cache (Qt, Qt);
+  Fclear_image_cache (Qt, Qnil);
   garbage_collect ();
 }
 
diff --git a/src/image.c b/src/image.c
index 9a465f0b180..9c0f5f0fb37 100644
--- a/src/image.c
+++ b/src/image.c
@@ -2342,6 +2342,7 @@ evicted.  */)
 {
   if (!NILP (animation_cache))
     {
+      CHECK_CONS (animation_cache);
 #if defined (HAVE_WEBP) || defined (HAVE_GIF)
       anim_prune_animation_cache (XCDR (animation_cache));
 #endif



reply via email to

[Prev in Thread] Current Thread [Next in Thread]