簡體   English   中英

android 7:使用Runtime.getRuntime()。exec在APK上安裝NullPointerException

[英]android 7: NullPointerException on APK installing with Runtime.getRuntime().exec

我正在嘗試使用常規的Runtime.getRuntime.exec()例程在android 7(samsung和sony)中安裝APK。 安裝失敗,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

安裝確實通過shell成功。 提前致謝

我有同樣的問題,但我用不同的方式解決了它。 我的應用程序是一個啟動器,它具有系統權限。 這是我的解決方案。

添加到清單頭文件android:sharedUserId =“android.uid.system”

將此權限添加到mainifest android:name =“android.permission.INSTALL_PACKAGES”

將此代碼添加到某個后台線程

try {
        String cmd = "pm install -r -i " + LAUNCHER_PACKAGE_ID + " " + activity.getFileStreamPath(apkPath);
        Process p = Runtime.getRuntime().exec(cmd);
        p.waitFor();
    } 
    catch (Exception e) {
        Log.d(TAG, "SilentInstallActivity error: " + 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的文檔但是沒有足夠的時間深入研究它。 如果您有興趣,可以自己搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM