summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2023-11-12 11:44:58 +0800
committerPo Lu <luangruo@yahoo.com>2023-11-12 11:44:58 +0800
commite56e9c19545f43c35dec85fa650f3799c6e9c308 (patch)
treed94351fc316ffbaca9ba0e82b29b65f51b1d8923 /java
parentfff9b6e37aaf7da22cf803441b96f47ddd92a027 (diff)
downloademacs-e56e9c19545f43c35dec85fa650f3799c6e9c308.tar.gz
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.
Diffstat (limited to 'java')
-rw-r--r--java/org/gnu/emacs/EmacsApplication.java73
-rw-r--r--java/org/gnu/emacs/EmacsService.java34
2 files changed, 71 insertions, 36 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