Android 7: NullPointerException при установке APK с помощью Runtime.getRuntime().exec
Я пытаюсь установить APK в Android 7 (Samsung и Sony) с помощью обычного Runtime.getRuntime.exec()
рутина. Сбой установки со следующим исключением в logcat:
09-04 14:14:33.932 16623-16623/? D/AndroidRuntime: Calling main entry com.android.commands.pm.Pm
09-04 14:14:33.939 3695-3876/? D/PackageInstaller: installation of android.content.pm.PackageInstaller$SessionParams@a4d2f0e for non-container user 0
09-04 14:14:33.940 16623-16623/? E/Pm: Error
java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java:1699)
at android.os.Parcel.readException(Parcel.java:1646)
at android.content.pm.IPackageInstaller$Stub$Proxy.createSession(IPackageInstaller.java:249)
at com.android.commands.pm.Pm.doCreateSession(Pm.java:530)
at com.android.commands.pm.Pm.runInstall(Pm.java:369)
at com.android.commands.pm.Pm.run(Pm.java:142)
at com.android.commands.pm.Pm.main(Pm.java:99)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:301)
09-04 14:14:33.941 16623-16623/? I/art: System.exit called, status: 1
09-04 14:14:33.941 16623-16623/? I/AndroidRuntime: VM exiting with result code 1
Я пытаюсь реализовать это так:
Process proc = Runtime.getRuntime().exec("pm install /sdcard/imo.apk");
так что:
Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/sh","-c","/system/bin/pm install /sdcard/imo.apk"});
Но исключение происходит в обоих случаях.
В андроидах меньше 7 это работает.
Разрешения:
declared permissions:
android.permission.INTERACT_ACROSS_USERS_FULL: prot=normal
requested permissions:
android.permission.BIND_NOTIFICATION_LISTENER_SERVICE
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_LOGS
User 0: ceDataInode=393939 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0
gids=[1007]
runtime permissions:
android.permission.CLEAR_APP_USER_DATA: granted=true
android.permission.INSTALL_PACKAGES: granted=true
android.permission.READ_EXTERNAL_STORAGE: granted=true
android.permission.INTERACT_ACROSS_USERS_FULL: granted=true
android.permission.READ_LOGS: granted=true
android.permission.CLEAR_APP_CACHE: granted=true
android.permission.WRITE_EXTERNAL_STORAGE: granted=true
Установка прошла успешно через оболочку. заранее спасибо
2 ответа
У меня была такая же проблема, но я решил ее другим способом. Мое приложение запускается и имеет системные привилегии. Это мое решение.
Добавить в манифест заголовок android:sharedUserId="android.uid.system"
Добавьте это разрешение на mainifest android: name = "android.permission.INSTALL_PACKAGES"
Добавьте этот код в некоторый фоновый поток
пытаться { String cmd = "pm install -r -i " + LAUNCHER_PACKAGE_ID + " " + activity.getFileStreamPath(apkPath); Процесс p = Runtime.getRuntime(). Exec(cmd); p.waitFor(); } поймать (исключение е) { Log.d(TAG, "Ошибка SilentInstallActivity: " + e); }
Подпишите ваше приложение для Android системным ключом.
Я нашел ответ. Хотя я не уверен, какова точная причина, но это работает. Я ссылался на этот блог https://shoewann0402.github.io/2017/06/27/android-n-installSilent-and-uninstallSilent/, но это все на китайском языке. Если вы также понимаете китайский язык или используете перевод Google.
Новая команда должна быть такой:
pm install -i <you installer package name> --user 0 /sdcard/com.ifeng.news2.apk
Это новый механизм безопасности, добавленный Google, и он требует установки с использованием userId 0. Также вам необходимо указать имя пакета установщика.
Затем в файле манифеста вашего установщика добавьте android.permission.INTERACT_ACROSS_USERS_FULL
это разрешение. Тогда это должно работать. Я видел, что есть некоторые документы по userId, но просто не хватает времени, чтобы в них разобраться. Если вы заинтересованы, вы можете искать самостоятельно.