Android 5.0/ Lollipop : Force rescan of/system/priv-app

标签 android android-5.0-lollipop

在 Android 4.x 中,将 APK 文件放入/system/priv-app 就足够了,包管理器会识别该新文件并(卸载)安装相应的应用程序或服务。

从 Android L 开始,仅将文件放入该目录似乎是不够的 - 需要重新启动系统才能强制 Android 识别该更改。

有没有人知道如何规避这个问题?也许使用任何 setprop ctl.restart xxx 或通过终止专用服务?

编辑:

以下是 logcat 的一些日志:

1。将 APK 从/system 移动到/system/priv-app (=installation)

su
mount -o remount rw /system
cd /system/priv-app
mv ../AARSCService.apk . // move from /system to /system/priv-app

W/mv      ( 3268): type=1400 audit(0.0:53): avc: denied { rename } for name="AARSCService.apk" dev="mmcblk0p22" ino=23041 scontext=u:r:init:s0 tcontext=u:object_r:system_file:s0 tclass=file

(但文件已被移动,因为 Nexus 7 Android Android L P2 的当前根实现禁用了根命令的 SELinux!)

-> APK 未加载且未在应用列表中列出 -> 与预期不同,APK 将在 Android 4.4 上的 priv-app 文件夹中自动安装。

2。重启设备,在/system/priv-app 中有 APK

reboot

I/PackageManager(  567): /system/priv-app/AARSCService.apk changed; collecting certs

-> APK 已加载并列在应用列表中 -> 符合预期

3。将 APK 从/system/priv-app 移动到/system (=deinstallation)

su
mount -o remount rw /system
cd /system/priv-app
mv AARSCService.apk .. // move from /system/priv-app to /system

W/mv      ( 3189): type=1400 audit(0.0:31): avc: denied { rename } for name="AARSCService.apk" dev="mmcblk0p22" ino=23041 scontext=u:r:init:s0 tcontext=u:object_r:system_file:s0 tclass=file

(但文件已被移动,因为 Nexus 7 Android Android L P2 的当前根实现禁用了根命令的 SELinux!)

-> APK 仍然加载并列在应用程序列表中,应用程序中的服务仍然可以从另一个应用程序绑定(bind) -> 与预期不同,一旦从 Android 4.4 上的 priv-app 文件夹中删除,APK 将自动卸载。

4。重启设备,让 APK 不在/system/priv-app

reboot 

W/PackageManager(  570): System package eu.airaudio.aarscservice no longer exists; wiping its data

-> APK 不再加载,也不再列在应用列表中 -> 正如预期的那样

编辑 2:

在无根的 Android L (21) 模拟器上有相同的行为 - 当然,没有 SELinux 警告。 但是 APK 在重启后也只是(未)安装(=kill zygote)。

最佳答案

比较 KitKat 和 Lollipop 的 PackageManagerService 的源代码可以看到显着的变化,并且一些明显与此变化相关。

PackageManagerService.java on Lollipop

PackageManagerService.java on KitKat

问题主题最重要的变化是删除了对 AppDirObserver(PackageManagerService 的嵌套类)的所有引用,这些引用已初始化以监视所有目录(附件图像显示了使用它的相关代码的比较。右侧显示 KitKat 代码,左侧显示 Lollipop) enter image description here

仍未找到解决方案,但可能会帮助其他人解决问题。

关于Android 5.0/ Lollipop : Force rescan of/system/priv-app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26487750/

相关文章:

java - 无法导入@Inject 注释

android - 推特登录的变化

Android 5.0 API 21 应用程序文件包含 AppCompat 引用

Android L SoundPool.load() 回归

android - 如何检查 Android Lollipop 电池保护程序是否已打开

java - 自定义 ListView setOnItemClickListener 不起作用

java - Android 处理程序泄漏

android - Clear Data on App Settings 是否会清除为该特定应用程序存储的所有 Android KeyStore?

android - Lollipop 商店中的抽屉指示器

android - 向下滑动刷新 Material Design