In Android 4.x, it was enough to put an APK-file into /system/priv-app, and the package-manager recognized that new file and (un-)installed the corresponding application or service.
Since Android L, it seems to be not enough to just put the file into that directory - a reboot of the system is required to force Android to recognize that change.
Has anyone an idea how to circumvent this? Maybe with any setprop ctl.restart xxx
or by killing a dedicated service?
EDIT:
Here are some logs from 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
(but file HAS been moved as the current root-implementation for Nexus 7 Android Android L P2 disables SELinux for the root-commands!)
-> APK NOT loaded and not listed in app-list -> NOT as expected, APK is going to be automatically installed once put into priv-app folder on Android 4.4.
reboot
I/PackageManager( 567): /system/priv-app/AARSCService.apk changed; collecting certs
-> APK IS loaded and listed in app-list -> as expected
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
(but file HAS been moved as the current root-implementation for Nexus 7 Android Android L P2 disables SELinux for the root-commands!)
-> APK still loaded and listed inside app-list, service inside app can still be bound from another app -> NOT as expected, APK is going to be automatically uninstalled once removed from priv-app folder on Android 4.4.
reboot
W/PackageManager( 570): System package eu.airaudio.aarscservice no longer exists; wiping its data
-> APK is no more loaded and no more listed in app-list -> as expected
EDIT 2:
There's the same behaviour on unrooted Android L (21) emulator - sure, without the SELinux-warning. But the APK is also just (un-)installed after reboot (=kill zygote).
Comparing the source code of PackageManagerService
between KitKat and Lollipop you can see significant changes, and some that are obviously related to this change.
PackageManagerService.java
on Lollipop
PackageManagerService.java
on KitKat
The most significant change to the question topic is the removal of all references to AppDirObserver
(a nested class of PackageManagerService
) that was initialized to monitor all directories (the attached image shows a comparison of the relevant code where it was used. Right side shows KitKat code and left side shows Lollipop)
Still haven't found a solution for this but might help someone figure it out.