Rk3399上App静默安装并自动打开(亲自验证成功)

首先,必须得是Rk3399的系统应用,即有系统权限,并有系统签名

    android:sharedUserId="android.uid.system"
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name= "android.permission.RESTART_PACKAGES" />
//app的gradle里系统签名
signingConfigs {
        debug {
            storeFile file('xxxx.jks')
            storePassword 'xxxxx'
            keyAlias 'xxxxxx'
            keyPassword 'xxxxxx'
        }
    }

下面,就是重点安装和自动打开的功能,主要是命令安装和打开


    // 赋予权限
    public boolean givePermission(String path) {
        Log.e("sx", "赋予权限 " + path);
        String[] commands = {"su", "0", "chmod", "777", path};
        return execCommand(commands);
    }
    //静默安装并自动打开
    public void silentInstall(String apkPath) {
        givePermission(apkPath);
        install(apkPath);
    }
    //命令执行
    private static boolean execCommand(String[] commands) {
        ProcessBuilder processBuilder = new ProcessBuilder(commands);
        Process process = null;
        BufferedReader successResult = null;
        BufferedReader errorResult = null;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder errorMsg = new StringBuilder();
        boolean result = false;
        try {
            process = processBuilder.start();
            successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
            errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String s;
            while ((s = successResult.readLine()) != null) {
                successMsg.append(s);
            }
            while ((s = errorResult.readLine()) != null) {
                errorMsg.append(s);
            }
        } catch (Exception e) {
            Log.e("log", "命令异常,"+e.toString());
        } finally {
            try {
                if (successResult != null) {
                    successResult.close();
                }
                if (errorResult != null) {
                    errorResult.close();
                }
            } catch (IOException e) {
                Log.e("log", "IOException异常,"+e.toString());
            }
            if (process != null) {
                process.destroy();
            }
        }

        Log.e("log", "命令执行结果 = " + "\nsuccessMsg:" + successMsg + "\nErrorMsg:" + errorMsg);
        String success = successMsg.toString();
        String error = errorMsg.toString();
        //如果执行结果中,包含Success/success,或者无错误信息返回,则认为执行成功
        if (success.contains("Success") || success.contains("success") || TextUtils.isEmpty(error)) {
            result = true;
        }

        return result;
    }

    public static void install(String apkPath){
        //cmd2 是执行安装apk, cmd1是安装后自动打开app
    //String cmd1= "am start -s 包名/"+ 启动Activity.class.getCanonicalName()+ " \n";//可能不行
        String cmd1= "am start -n 包名/"+"包名.启动的Activity"+" \n";
        String cmd2 = "pm install -r " + apkPath + " && ";
        String cmd = cmd2 + cmd1;
        
        Runtime runtime = Runtime.getRuntime();
        try {
            Process localProcess = runtime.exec("su");
            OutputStream localOutputStream = localProcess.getOutputStream();
            DataOutputStream localDataOutputStream = new DataOutputStream(localOutputStream);
            localDataOutputStream.writeBytes(cmd);
            localDataOutputStream.flush();
            Log.e("log", "安装成功了");
        } catch (IOException e) {
            Log.e("log", "安装失败,"+e.toString());
        }

    }

最后,android的gradle编译和目标版本是

compileSdkVersion 29
buildToolsVersion "29.0.3"

 minSdkVersion 22
 targetSdkVersion 29

最后的最后,希望大家都能尝试成功,主要还是要有系统权限

猜你喜欢

转载自blog.csdn.net/qq_19822039/article/details/128544358