Android 8 系统应用程序更新仅在重启后生效
Android 8 System App update effective only after reboot
TL;DR: 在 android 上更新系统应用程序时,更新后的应用程序仅在重启后启动。
我正在为基于 Rockchip RK3126c 的自定义设备开发基于 Android 8.1.2 的自定义 ROM。我从主板制造商那里获取了 AOSP 源,只修改了平台密钥并添加了两个自定义应用程序作为系统应用程序;一个是特权用户(共享 system
用户),一个不是,即第一个位于 /system/priv-app
并使用平台密钥签名,第二个位于 /system/app
并使用其签名自己的钥匙。
这两个应用程序都可以工作,但是当我尝试更新这两个应用程序中的任何一个时(通过 adb shell pm install -r ...
或通过 Android Studio),更新没有生效;旧版本仍在运行,即使在终止(adb shell kill -9 ...
或抛出空指针异常)并重新启动后也是如此。只有在完全重启后才会启动新版本。我确实增加了 versionCode
。在重新启动之前,getPackageManager().getPackageInfo(...).versionCode
生成 new 版本号,而 BuildConfig.VERSION_CODE
给出旧版本。这适用于 eng
和 user
构建。
更新时,adb logcat
显示:
10-17 15:45:19.706 1048 1048 D AndroidRuntime: Calling main entry com.android.commands.pm.Pm
10-17 15:45:19.725 1058 1058 E asset : setgid: Operation not permitted
10-17 15:45:22.563 336 362 I ActivityManager: Start proc 1062:com.android.defcontainer/u0a11 for service com.android.defcontainer/.DefaultContainerService
10-17 15:45:22.617 1062 1062 I zygote : The ClassLoaderContext is a special shared library.
10-17 15:45:22.739 336 362 I chatty : uid=1000(system) PackageManager expire 1 line
10-17 15:45:22.820 1077 1077 I dex2oat : /system/bin/dex2oat --input-vdex-fd=-1 --output-vdex-fd=14 --compiler-filter=quicken --classpath-dir=/data/app/com.example.myapp-cdF84NESHVxl5UTZHVbRdg== --class-loader-context=PCL[]
10-17 15:45:22.832 1077 1077 W dex2oat : Could not reserve sentinel fault page
10-17 15:45:26.117 1077 1080 W dex2oat : Verification of boolean ao0.a(java.lang.String, long) took 130.568ms
10-17 15:45:28.960 1077 1077 I dex2oat : dex2oat took 6.142s (10.744s cpu) (threads: 4) arena alloc=17KB (17568B) java alloc=4MB (4274432B) native alloc=6MB (6543768B) free=1801KB (1844840B)
10-17 15:45:28.997 336 350 I ActivityManager: Force stopping com.example.myapp appid=1000 user=-1: installPackageLI
10-17 15:45:29.009 336 362 W PackageManager: Trying to update system app code path from /system/priv-app/MyApp to /data/app/MyApp-cdF84NESHVxl5UTZHVbRdg==
10-17 15:45:29.010 336 362 W PackageManager: Code path for com.example.myapp changing from /system/priv-app/MyApp to /data/app/MyApp-cdF84NESHVxl5UTZHVbRdg==
10-17 15:45:29.010 336 362 W PackageManager: Resource path com.example.myapp changing from /system/priv-app/MyApp to /data/app/MyApp-cdF84NESHVxl5UTZHVbRdg==
10-17 15:45:29.205 242 242 E : Couldn't opendir /data/app/vmdl1968223466.tmp: No such file or directory
10-17 15:45:29.205 242 242 E installd: Failed to delete /data/app/vmdl1968223466.tmp: No such file or directory
10-17 15:45:29.213 336 362 I ActivityManager: Force stopping com.example.myapp appid=1000 user=0: pkg removed
10-17 15:45:29.214 1048 1048 I Pm : Package com.example.myapp installed in 9500 ms
10-17 15:45:29.239 1048 1048 I app_process: System.exit called, status: 0
10-17 15:45:29.239 1048 1048 I AndroidRuntime: VM exiting with result code 0.
重新启动后,对应用程序的进一步更新 执行 工作 - 显然,问题仅在将代码路径从 /system/[priv-]app
更改为 /data/app
时存在, 但不是当路径已经是 /data/app
.
同样的事情在 Android 7.1.2 上运行良好。在 android 框架的深处,可能有一些应用程序代码路径的缓存,这些缓存在应用程序被覆盖后不会得到更新。任何人都知道它位于何处以及如何解决此问题?
经过大量摆弄后,我自己发现:该应用程序在 manifest 中被标记为 persistent
,这导致了上述行为。它只适用于 Android 7.1.2,因为有一个特定于供应商的修改忽略了 persistent
标志。
TL;DR: 在 android 上更新系统应用程序时,更新后的应用程序仅在重启后启动。
我正在为基于 Rockchip RK3126c 的自定义设备开发基于 Android 8.1.2 的自定义 ROM。我从主板制造商那里获取了 AOSP 源,只修改了平台密钥并添加了两个自定义应用程序作为系统应用程序;一个是特权用户(共享 system
用户),一个不是,即第一个位于 /system/priv-app
并使用平台密钥签名,第二个位于 /system/app
并使用其签名自己的钥匙。
这两个应用程序都可以工作,但是当我尝试更新这两个应用程序中的任何一个时(通过 adb shell pm install -r ...
或通过 Android Studio),更新没有生效;旧版本仍在运行,即使在终止(adb shell kill -9 ...
或抛出空指针异常)并重新启动后也是如此。只有在完全重启后才会启动新版本。我确实增加了 versionCode
。在重新启动之前,getPackageManager().getPackageInfo(...).versionCode
生成 new 版本号,而 BuildConfig.VERSION_CODE
给出旧版本。这适用于 eng
和 user
构建。
更新时,adb logcat
显示:
10-17 15:45:19.706 1048 1048 D AndroidRuntime: Calling main entry com.android.commands.pm.Pm
10-17 15:45:19.725 1058 1058 E asset : setgid: Operation not permitted
10-17 15:45:22.563 336 362 I ActivityManager: Start proc 1062:com.android.defcontainer/u0a11 for service com.android.defcontainer/.DefaultContainerService
10-17 15:45:22.617 1062 1062 I zygote : The ClassLoaderContext is a special shared library.
10-17 15:45:22.739 336 362 I chatty : uid=1000(system) PackageManager expire 1 line
10-17 15:45:22.820 1077 1077 I dex2oat : /system/bin/dex2oat --input-vdex-fd=-1 --output-vdex-fd=14 --compiler-filter=quicken --classpath-dir=/data/app/com.example.myapp-cdF84NESHVxl5UTZHVbRdg== --class-loader-context=PCL[]
10-17 15:45:22.832 1077 1077 W dex2oat : Could not reserve sentinel fault page
10-17 15:45:26.117 1077 1080 W dex2oat : Verification of boolean ao0.a(java.lang.String, long) took 130.568ms
10-17 15:45:28.960 1077 1077 I dex2oat : dex2oat took 6.142s (10.744s cpu) (threads: 4) arena alloc=17KB (17568B) java alloc=4MB (4274432B) native alloc=6MB (6543768B) free=1801KB (1844840B)
10-17 15:45:28.997 336 350 I ActivityManager: Force stopping com.example.myapp appid=1000 user=-1: installPackageLI
10-17 15:45:29.009 336 362 W PackageManager: Trying to update system app code path from /system/priv-app/MyApp to /data/app/MyApp-cdF84NESHVxl5UTZHVbRdg==
10-17 15:45:29.010 336 362 W PackageManager: Code path for com.example.myapp changing from /system/priv-app/MyApp to /data/app/MyApp-cdF84NESHVxl5UTZHVbRdg==
10-17 15:45:29.010 336 362 W PackageManager: Resource path com.example.myapp changing from /system/priv-app/MyApp to /data/app/MyApp-cdF84NESHVxl5UTZHVbRdg==
10-17 15:45:29.205 242 242 E : Couldn't opendir /data/app/vmdl1968223466.tmp: No such file or directory
10-17 15:45:29.205 242 242 E installd: Failed to delete /data/app/vmdl1968223466.tmp: No such file or directory
10-17 15:45:29.213 336 362 I ActivityManager: Force stopping com.example.myapp appid=1000 user=0: pkg removed
10-17 15:45:29.214 1048 1048 I Pm : Package com.example.myapp installed in 9500 ms
10-17 15:45:29.239 1048 1048 I app_process: System.exit called, status: 0
10-17 15:45:29.239 1048 1048 I AndroidRuntime: VM exiting with result code 0.
重新启动后,对应用程序的进一步更新 执行 工作 - 显然,问题仅在将代码路径从 /system/[priv-]app
更改为 /data/app
时存在, 但不是当路径已经是 /data/app
.
同样的事情在 Android 7.1.2 上运行良好。在 android 框架的深处,可能有一些应用程序代码路径的缓存,这些缓存在应用程序被覆盖后不会得到更新。任何人都知道它位于何处以及如何解决此问题?
经过大量摆弄后,我自己发现:该应用程序在 manifest 中被标记为 persistent
,这导致了上述行为。它只适用于 Android 7.1.2,因为有一个特定于供应商的修改忽略了 persistent
标志。