【发布时间】:2014-10-21 13:19:37
【问题描述】:
在 Android 4.x 中,将 APK 文件放入 /system/priv-app 就足够了,包管理器会识别新文件并(卸载)安装相应的应用程序或服务。
自 Android L 以来,仅将文件放入该目录似乎是不够的 - 需要重新启动系统才能强制 Android 识别该更改。
有人知道如何规避这个问题吗?可能使用任何setprop ctl.restart xxx 或通过终止专用服务?
编辑:
以下是 logcat 的一些日志:
1。将 APK 从 /system 移动到 /system/priv-app(=安装)
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 未加载且未在 app-list 中列出 -> 与预期不同,APK 将在 Android 4.4 上的 priv-app 文件夹中自动安装。
2。重启设备,在 /system/priv-app 中有 APK
reboot
I/PackageManager( 567): /system/priv-app/AARSCService.apk changed; collecting certs
-> APK 已加载并在 app-list 中列出 -> 符合预期
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 仍然加载并列在应用列表中,应用内的服务仍然可以从另一个应用绑定 -> 不像预期的那样,APK 将在 Android 4.4 上从 priv-app 文件夹中删除后自动卸载。
4。重启设备,APK 不在 /system/priv-app 中
reboot
W/PackageManager( 570): System package eu.airaudio.aarscservice no longer exists; wiping its data
-> APK 不再加载,也不再列在 app-list 中 -> 符合预期
编辑 2:
在无根的 Android L (21) 模拟器上存在相同的行为 - 当然,没有 SELinux 警告。 但是 APK 也只是(卸载)在重启后安装(=kill zygote)。
【问题讨论】:
-
嗨,菲利普,是的,没错,这让我更加困惑。但是我已经认识到,只需将提供服务的 APK 放置/删除到“/system/priv-app”目录中,就不会再安装/卸载它了。但 APK 会在设备重启后安装。它不仅影响我当前的应用程序,而且影响我的竞争对手曾经在理论上做同样的事情。神秘 - 我会在接下来的几天里尝试在 PackageManagerService 上附加调试器。
-
@MartinM。你能添加来自
PackageManagerService的日志消息吗? -
嘿 ashoke,我添加了一个完整的添加和删除 APK 的工作流程,感谢您的支持 :)
标签: android android-5.0-lollipop