A user asked me about a crash while using the app on the sd card. My app was not movable to the sdcard so I added to the manifest android:installLocation="auto" and tried to move it to the external memory. Using it on my real device (34 gb/ 47 gb free on internal/external memory) I get the space not sufficient error. I understood that this is a generic error used for other issues so I fired up the emulator and checked the logcat.
Partial manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.user.app"
android:installLocation="auto"
>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.VIBRATE" />
<queries>
<package android:name="org...." />
</queries>
On my device with android 11 I get
D/PackageManager: START MOVE PACKAGE: pkg{com.github.user.app.debug}
volumeUuid{3231-6462}
I/ActivityTaskManager: START u0 {flg=0x24000000 cmp=com.android.settings/.deviceinfo.StorageWizardMoveProgress (has extras)} from uid 1000
D/RestrictionPolicy: isSettingsChangesAllowedAsUser, userId 0 : true
E/LockGuard: Calling thread PackageManager is holding PACKAGES while trying to acquire DPMS
java.lang.RuntimeException: Calling thread PackageManager is holding PACKAGES while trying to acquire DPMS
at com.android.server.LockGuard.doLog(LockGuard.java:179)
at com.android.server.LockGuard.guard(LockGuard.java:166)
at com.android.server.devicepolicy.DevicePolicyManagerService.getLockObject(DevicePolicyManagerService.java:779)
at com.android.server.devicepolicy.DevicePolicyManagerService.packageHasActiveAdmins(DevicePolicyManagerService.java:5158)
at com.android.server.pm.PackageManagerService.isPackageDeviceAdmin(PackageManagerService.java:22599)
at com.android.server.pm.PackageManagerService.isPackageDeviceAdminOnAnyUser(PackageManagerService.java:22572)
at com.android.server.pm.PackageManagerService.movePackageInternal(PackageManagerService.java:28919)
at com.android.server.pm.PackageManagerService.lambda$movePackage$45$PackageManagerService(PackageManagerService.java:28837)
at com.android.server.pm.-$$Lambda$PackageManagerService$fXZo1oAlF-92gGHcSdrHuC0WLPc.run(Unknown Source:12)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:44)
...
V/PackageManager: Move 6 created Bundle[{android.intent.extra.PACKAGE_NAME=com.github.user.app.debug, android.intent.extra.TITLE=App-dev}]
I/PackageManager: measurePath: /storage/3231-6462
...
V/PackageManager: Move 6 status 53
...
D/PackageManager: result of install: -15{120868786}
V/PackageManager: Move 6 status -6
On an android api 30 emulator
W/PackageManager: Failed to move com.github.user.app.debug
com.android.server.pm.PackageManagerException: Move only supported for modern cluster style installs
at com.android.server.pm.PackageManagerService.movePackageInternal(PackageManagerService.java:23180)
at com.android.server.pm.PackageManagerService.lambda$movePackage$41$PackageManagerService(PackageManagerService.java:23125)
at com.android.server.pm.-$$Lambda$PackageManagerService$ECakc05vOVsUm8ydpi2Z-HghH4w.run(Unknown Source:12)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:44)
This is the interested part in PackageManager:
final File probe = new File(pkg.codePath);
final File probeOat = new File(probe, "oat");
if (!probe.isDirectory() || !probeOat.isDirectory()) {
throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
"Move only supported for modern cluster style installs");
}
I tried again on a fresh api 25 emulator and I get the same error, different exception:
W/installd: type=1400 audit(0.0:879): avc: denied { sys_admin } for capability=21 scontext=u:r:installd:s0 tcontext=u:r:installd:s0 tclass=capability permissive=0
D/installd: Detected label change from u:object_r:system_data_file:s0 to u:object_r:app_data_file:s0:c512,c768 at /mnt/expand/2e6f3762-8f82-4c9f-9633-f74b10070b25/user/0/com.github. user.app.debug; running recursive restorecon
D/installd: Detected label change from u:object_r:system_data_file:s0 to u:object_r:app_data_file:s0:c512,c768 at /mnt/expand/2e6f3762-8f82-4c9f-9633-f74b10070b25/user_de/0/com.github. user.app.debug; running recursive restorecon
D/installd: Copying /data/user_de/0/com.github. user.app.debug to /mnt/expand/2e6f3762-8f82-4c9f-9633-f74b10070b25/user_de/0
D/installd: Copying /data/data/com.github. user.app.debug to /mnt/expand/2e6f3762-8f82-4c9f-9633-f74b10070b25/user/0
W/PackageParser: Unknown element under <manifest>: queries at /mnt/expand/2e6f3762-8f82-4c9f-9633-f74b10070b25/app/com.github.user.app.debug-1/base.apk Binary XML file line #18
W/PackageManager: installPackageLI
D/PackageManager: Cleaning up com.github.user.app.debug on 2e6f3762-8f82-4c9f-9633-f74b10070b25
V/PackageManager: Move 0 status -6
D/StorageSettings: Finished with status -6
W/ActivityManager: Duplicate finish request
I tried to upload an apk instead of letting Android Studio do it but it did not work. Googling the errors only brought me to the soure code links. Any help is appreciated.