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

时间:2017-09-04 12:17:02

标签: java android runtime.exec packageinstaller

我尝试使用常规<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <button type="button" class="btn btn-primary btn-lg" id="logOut" data-request-url="http://www.google.it"> Launch demo modal </button> <div id="modalLogout" class="modal fade" role="dialog"> <div class="modal-dialog modal-sm" role="document"> <div class="modal-content"> <div class="modal-body"> <p>Do you want to log out?</p> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal" id="LogoutCancel">Cancel</button> <button type="button" class="btn btn-warning" data-dismiss="modal" id="LogoutOk">OK</button> </div> </div> </div> </div>例程在android 7(samsung和sony)中安装APK。 安装失败,logcat中出现以下异常:

Runtime.getRuntime.exec()

我试着这样做:

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");

但两种情况都会发生异常。

在小于7的机器人中它起作用。

权限是:

Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/sh","-c","/system/bin/pm install /sdcard/imo.apk"});

安装确实通过shell成功。 提前致谢

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,但是我以不同的方式解决了它。我的应用程序是启动器,它具有系统特权。这是我的解决方法。

添加到清单标头 android:sharedUserId =“ android.uid.system”

将此权限添加到清单 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应用。

答案 1 :(得分:2)

我找到了答案。虽然我不确定究竟是什么原因,但这有效。我提到了这个博客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的文档但是没有足够的时间深入研究它。如果您有兴趣,可以自己搜索。