From e56e9c19545f43c35dec85fa650f3799c6e9c308 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sun, 12 Nov 2023 11:44:58 +0800 Subject: [PATCH] Adjust dump file location under Android * java/org/gnu/emacs/EmacsApplication.java (EmacsApplication) : 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 -- 2.39.2