Android静默安装与静默卸载(系统应用)

2019-03-27  本文已影响0人  MiHomes

一.轰隆一声雳响,小编闪亮登场。

本篇基于已有系统证书(从Android设备厂家获得)的情况下实现静默安装与静默卸载,可分为三部分讲解:将apk内置为系统应用,apk静默安装与apk静默卸载。

1.将apk内置为系统应用。内置的方法有共性,也有区别。基础操作是共性,区别就在于Android4.4以上版本与Android4.4以下版本。

  A.内置为系统应用要做的第一步,就是在清单文件的根节点manifest上添加声明:android:sharedUserId="android.uid.system" 如下图
image.png
    B.内置为系统应用要做的第二步,就是给没有签名过的apk文件签名。

      a.若设备厂家有提供.keystore(系统证书)文件,则利用Android Studio的Build选项下Grnerate Signed Bundle/apk方式直接指定
      签名文件给apk签名即可。默认密码一般都为 android 

      b.若没有设备厂家提供的系统证书,那么也可以从对应的Android版本中提取签名文件,只是适配性会有很大的局限。
      可参考https://blog.csdn.net/starhosea/article/details/78696460

    C.内置为系统应用要做的第三步,就是将声明好,签名过的apk,内置到Android系统中(划重点:内置操作所需的adb命令需要先将手机/设备
    ROOT):

      a. Android 4.4以下:4.4以下可利用adb命令将apk内置到 system/app 目录下,再重启系统即可生效。
      详情可参考 https://blog.csdn.net/m0_37135879/article/details/81134472

      b. Android 4.4以上:4.4以上版本将主要的系统应用更改到了system/priv-app目录下,导致很多小伙伴用4.4以下的方式尝试内置系统
      应用时产生了内置无效的情况。4.4以上版本与4.4以下版本内置apk为系统应用的方式是大同小异的,利用adb命令将apk内置到
      system/priv-app 目录下,再重启系统即可生效。
      详情可参考 https://blog.csdn.net/starhosea/article/details/78697007

    D.此步为知识补充,基础adb命令:

      安装:adb install apk路径

      重装:adb install -r 已安装过带签名的apk重装

      卸载:adb uninstall apk包名

      启动:adb shell am start -n 包名/包名.activity

      关闭:adb shell am force-stop 包名

2.apk静默安装。

 /**
 * 21      * APK静默安装
 * 22      *
 * 23      * @param apkPath
 * 24      *            APK安装包路径
 * 25      * @return true 静默安装成功 false 静默安装失败
 * 26
 */
public static boolean install(String apkPath) {
    String[] args = {"pm", INSTALL_CMD, "-r", apkPath};
    String result = apkProcess(args);
    Log.e(TAG, "install log:" + result);
    if (result != null
            && (result.endsWith("Success") || result.endsWith("Success\n"))) {
        return true;
    }
    return false;
}

 /**
 * 57      * 应用安装、卸载处理
 * 58      *
 * 59      * @param args
 * 60      *            安装、卸载参数
 * 61      * @return Apk安装、卸载结果
 * 62
 */
public static String apkProcess(String[] args) {
    String result = null;
    ProcessBuilder processBuilder = new ProcessBuilder(args);
    Process process = null;
    InputStream errIs = null;
    InputStream inIs = null;
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int read = -1;
        process = processBuilder.start();
        errIs = process.getErrorStream();
        while ((read = errIs.read()) != -1) {
            baos.write(read);
        }
        baos.write('\n');
        inIs = process.getInputStream();
        while ((read = inIs.read()) != -1) {
            baos.write(read);
        }
        byte[] data = baos.toByteArray();
        result = new String(data);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (errIs != null) {
                errIs.close();
            }
            if (inIs != null) {
                inIs.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (process != null) {
            process.destroy();
        }
    }
    return result;
}

3.apk静默卸载。

 /**
 * 39      * APK静默卸载
 * 40      *
 * 41      * @param packageName
 * 42      *            需要卸载应用的包名
 * 43      * @return true 静默卸载成功 false 静默卸载失败
 * 44
 */
public static boolean uninstall(String packageName) {
    String[] args = {"pm", UNINSTALL_CMD, packageName};
    String result = apkProcess(args);
    Log.e(TAG, "uninstall log:" + result);
    if (result != null
            && (result.endsWith("Success") || result.endsWith("Success\n"))) {
        return true;
    }
    return false;
}

二.若您觉得本文对您有帮助,记得点个关注哟~

上一篇下一篇

猜你喜欢

热点阅读