在Android 4.x中,将APK文件放入/ system / priv-app就足够了,并且包管理器识别出新文件并且(取消)安装了相应的应用程序或服务。
从Android L开始,将文件放入该目录似乎还不够 - 需要重新启动系统才能强制Android识别该更改。
有谁知道如何规避这个?也许使用任何setprop ctl.restart xxx
或通过杀死专用服务?
编辑:
以下是logcat的一些日志:
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的root命令!)
- > APK未加载且未在app-list中列出 - >不像预期的那样,一旦放入Android 4.4上的priv-app文件夹,APK将自动安装。
reboot
I/PackageManager( 567): /system/priv-app/AARSCService.apk changed; collecting certs
- > APK已加载并列在app-list中 - >正如预期的那样
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的root命令!)
- > APK仍然加载并列在app-list中,app内的服务仍然可以从另一个应用程序绑定 - >不像预期的那样,从Android 4.4上的priv-app文件夹中删除后,APK将自动卸载。
reboot
W/PackageManager( 570): System package eu.airaudio.aarscservice no longer exists; wiping its data
- > APK已不再加载,不再列在app-list中 - >正如预期的那样
编辑2:
在无根Android L(21)模拟器上有相同的行为 - 确定没有SELinux警告。 但是在重启(= kill zygote)后,APK也只是(un-)安装。
答案 0 :(得分:6)
比较KitKat和Lollipop之间PackageManagerService
的源代码,您可以看到重大变化,其中一些明显与此变化有关。
PackageManagerService.java
on Lollipop
PackageManagerService.java
on KitKat
对问题主题的最重要更改是删除对AppDirObserver
(嵌套类PackageManagerService
)的所有引用,该引用已初始化为监视所有目录(附加的图像显示了对比使用它的相关代码。右侧显示KitKat代码,左侧显示Lollipop)
仍然没有找到解决方案,但可能有助于有人弄明白。
答案 1 :(得分:3)
根据您的logcat消息,看起来PackageManagerService
甚至看不到文件夹/文件的更改。
这是一种规避/触发重新扫描的方法,模拟a"启动完成"广播行动事件:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
这应该通过PackageManagerService
答案 2 :(得分:1)
pms会在开始时扫描/system/app(priv-app)
。所以只是杀死进程systemserver
:)
它在我的棒棒糖模拟器上工作。只需花一点时间来展示"升级android,选择应用......"
答案 3 :(得分:0)
段:
def am_restart(self):
"""Restarts am waits for complete Android boot."""
self._log.info('Restarting application manager!')
ret, out, err = self.shell('am restart', require_root=True)
if ret != 0:
self.log_failure('am restart', ret, out, err)
return False
on_main_screen = False
while not on_main_screen:
sleep(2)
ret, out, err = self.shell('dumpsys phone')
if ret != 0:
self.log_failure('dumpsys phone', ret, out, err)
return False
if not (out or err):
on_main_screen = True
self._log.info('Application manager successfully restarted!')
return True
答案 4 :(得分:0)
我遇到了完全相同的问题。 当我将软件包处理回priv-app时,它被复制了不同的权限
priv-app(和app)中所有软件包的权限:
rwx-r-x-r-x
我复制的包裹的许可:
rwx--------
一个简单的chmod -R a+rw <path/to/package>
解决了问题
编辑:
通过发布确保您的/ system /不是只读的
mount -o remount,rw /system/
答案 5 :(得分:0)
您在这里:
adb shell cmd package compile -f -r first-boot com.yourpackage.name