Android 5.0 / Lollipop:强制重新扫描/ system / priv-app

时间:2014-10-21 13:19:38

标签: 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(=安装)

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将自动安装。

2。重新启动设备,有APK内部/ system / priv-app

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的root命令!)

- > APK仍然加载并列在app-list中,app内的服务仍然可以从另一个应用程序绑定 - >不像预期的那样,从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已不再加载,不再列在app-list中 - >正如预期的那样

编辑2:

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

6 个答案:

答案 0 :(得分:6)

比较KitKat和Lollipop之间PackageManagerService的源代码,您可以看到重大变化,其中一些明显与此变化有关。

PackageManagerService.java on Lollipop

PackageManagerService.java on KitKat

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

仍然没有找到解决方案,但可能有助于有人弄明白。

答案 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)

  1. 将apk推送至/ system / priv-app /
  2. 运行命令:adb shell> su>我重新启动(使用此命令,您不会松开adb连接)
  3. 等待系统启动 - 安装脚本可以等待命令的干净输出:" adb shell dumpsys phone"
  4. 段:

    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