Android 静默安装卸载

首先开头感谢这两篇文章,参考他们两个的改出来的(刚接触formwork):

Android 7.1.1 Framework 修改记录(一) 静默安装/卸载 (pm命令抛异常的过来看看) - 知乎

 java - 使用 Runtime.getRuntime 在 Android 上运行 shell 命令 - IT工具网

改formwork成的两个文件:

路径:frameworks\base\services\core\java\com\android\server\pm

文件名:

PackageInstallerSession.java


PackageInstallerService.java

代码如下:

 /**
     * @param context
     * @param apkPath  文件路径
     * @param installListener  安装监听
     */
    public synchronized static void installApk(Context context, String apkPath, ApkInstallListener installListener){
        try {
            PackageInfo info = getApkInfo(context, apkPath);
            String[] args = {"pm", "install", "-i", info.packageName, "--user", "0", "-r", apkPath};
            ProcessBuilder processBuilder = new ProcessBuilder(args);
            Log.e(TAG, "installApk: "+info.toString());
            Process process = null;
            BufferedReader successResult = null;
            BufferedReader errorResult = null;
            StringBuilder successMsg = new StringBuilder();
            StringBuilder errorMsg = new StringBuilder();

            try {
                process = processBuilder.start();
                successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
                errorResult = new BufferedReader(new InputStreamReader( process.getErrorStream()));
                String line;

                while ((line = successResult.readLine()) != null) {
                    successMsg.append(line);
                }

                while ((line = errorResult.readLine()) != null) {
                    errorMsg.append(line);
                }

                Log.i(TAG, "install success_msg " + successMsg.toString());
                Log.i(TAG, "install error_msg " + errorMsg.toString());
                if(successMsg.toString().contains("Success")){
                    if(installListener != null) {
                        installListener.onSuccess(info.packageName);
                    }
                }else{
                    if(installListener != null) {
                        installListener.onFail(new RuntimeException(errorMsg.toString()));
                    }
                }
            }catch (Exception e) {
                Log.i(TAG, "install fail ", e);
                if(installListener != null) {
                    installListener.onFail(e);
                }
            } finally {
                try {
                    if(successResult != null){
                        successResult.close();
                    }
                } catch (IOException e) {
                }

                try {
                    if(errorResult != null){
                        errorResult.close();
                    }
                } catch (IOException e) {
                }

                try {
                    if(process != null){
                        process.destroy();
                    }
                } catch (Exception e) {
                }
            }

        } catch (Exception e) {
            installListener.onFail(e);
        }
    }

    /**
     * 获取apk包的信息:版本号,名称,图标等
     * @param absPath apk包的绝对路径
     * @param context
     */
    private static PackageInfo getApkInfo(Context context, String absPath) {
        PackageInfo pkgInfo = null;
        try {
            PackageManager pm = context.getPackageManager();
            pkgInfo = pm.getPackageArchiveInfo(absPath, PackageManager.GET_ACTIVITIES);
            if (pkgInfo != null) {
                ApplicationInfo appInfo = pkgInfo.applicationInfo;
                /* 必须加这两句,不然下面icon获取是default icon而不是应用包的icon */

                appInfo.sourceDir = absPath;
                appInfo.publicSourceDir = absPath;
                String appName = pm.getApplicationLabel(appInfo).toString();// 得到应用名
                String packageName = appInfo.packageName;   // 得到包名
                String version = pkgInfo.versionName;       // 得到版本信息

                /* icon1和icon2其实是一样的
                Drawable icon1 = pm.getApplicationIcon(appInfo);// 得到图标信息
                Drawable icon2 = appInfo.loadIcon(pm);
                */

                String pkgInfoStr = String.format("PackageName:%s, Vesion: %s, AppName: %s", packageName, version, appName);
                Log.i("YTUtils", String.format("PkgInfo: %s", pkgInfoStr));
            }
        } catch (Exception e) {
            Log.e("YTUtils", "apk文件信息读取失败" + absPath, e);
        }

        return pkgInfo;
    }

    /**
     * 卸载apk
     * @param context  
     * @param packageName  包名
     * @param installListener  卸载监听
     */
    public synchronized static void uninstallApk(Context context, String packageName, ApkInstallListener installListener){
        try {

            String[] args = {"pm", "uninstall", "-k", "--user", "0", packageName};
            ProcessBuilder processBuilder = new ProcessBuilder(args);

            Process process = null;
            BufferedReader successResult = null;
            BufferedReader errorResult = null;
            StringBuilder successMsg = new StringBuilder();
            StringBuilder errorMsg = new StringBuilder();

            try {
                process = processBuilder.start();
                successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
                errorResult = new BufferedReader(new InputStreamReader( process.getErrorStream()));
                String line;

                while ((line = successResult.readLine()) != null) {
                    successMsg.append(line);
                }

                while ((line = errorResult.readLine()) != null) {
                    errorMsg.append(line);
                }

                Log.i(TAG, "uninstall success_msg " + successMsg.toString());
                Log.i(TAG, "uninstall error_msg " + errorMsg.toString());
                if(successMsg.toString().contains("Success")){
                    if(installListener != null) {
                        installListener.onSuccess(packageName);
                    }
                }else{
                    if(installListener != null) {
                        installListener.onFail(new RuntimeException(errorMsg.toString()));
                    }
                }
            }catch (Exception e) {
                Log.i(TAG, "install fail ", e);
                if(installListener != null) {
                    installListener.onFail(e);
                }
            } finally {
                try {
                    if(successResult != null){
                        successResult.close();
                    }
                } catch (IOException e) {
                }

                try {
                    if(errorResult != null){
                        errorResult.close();
                    }
                } catch (IOException e) {
                }

                try {
                    if(process != null){
                        process.destroy();
                    }
                } catch (Exception e) {
                }
            }

        } catch (Exception e) {
            installListener.onFail(e);
        }
    }

ApkInstallListener.java 

/***
* 安装卸载结果回调
*/
public interface ApkInstallListener {
    public void onSuccess(String packageName);

    public void onFail(Exception e);
}

安装卸载代码copy此文章:

Android 7.1.1 Framework 修改记录(一) 静默安装/卸载 (pm命令抛异常的过来看看) - 知乎

当前在9.0系统试试可以的,其他系统没试不知道

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值