欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 静默安装和卸载的方法

程序员文章站 2023-12-18 08:15:58
本文介绍了android 静默安装和卸载的方法,分享给大家,具体如下: 一. 条件 系统签名 需要放到 /system/app里作为系统app...

本文介绍了android 静默安装和卸载的方法,分享给大家,具体如下:

一. 条件

  1. 系统签名
  2. 需要放到 /system/app里作为系统app

二. 适用环境

机顶盒开发,系统开发,车机开发,智能设备开发。

三. 步骤

1. 在 androidmanifest.xml 中

1.1. 在清单文件 androidmanifest.xml 添加 android.uid.system 声明为系统应用。

1.2. 权限

 <uses-permission android:name="android.permission.install_packages" />
 <uses-permission android:name="android.permission.delete_packages" />
 <uses-permission android:name="android.permission.mount_unmount_filesystems" />

再添加读写权限这个可以实现安装时读取路径

 <uses-permission android:name="android.permission.read_external_storage" />
 <uses-permission android:name="android.permission.write_external_storage" />

1.3 总配置步骤图

Android 静默安装和卸载的方法

2. 代码部分 (两种方法都可以实现,现在项目选择了第二种)

方法一

之前公司开发时机器是api 17 ,获取了系统里pm的代码通过aidl实现加反射实现 这个方法也是比较正规的做法
去你们系统的源码里找到android.content.pm把里面的代码拷拷出来看图这几个就够了。

Android 静默安装和卸载的方法

代码段

安装

 public void installapp(final string path, final string packagenames){
  file apkfile = new file(path);
    /* 当前app无法访问外置sd卡文件,exists()会为false所以直接抛异常最好
   if(!apkfile.exists()){
      sendbroadcastmsg(packagenames,false,"路径错误");
      return;
   }*/
    try {
      class<?> clazz = class.forname("android.os.servicemanager");
      method method_getservice = clazz.getmethod("getservice", string.class);
     ibinder bind = (ibinder) method_getservice.invoke(null, "package");
      ipackagemanager ipm = ipackagemanager.stub.asinterface(bind);
      ipm.installpackage(uri.fromfile(apkfile), new ipackageinstallobserver.stub(){
        @override
        public void packageinstalled(string packagename, int returncode) throws remoteexception {
         
        }
      }, 2, apkfile.getname());
    } catch (exception e) {
      sendbroadcastmsg(packagenames,false,"安装异常");
      e.printstacktrace();
    }
  }

 卸载

public void uninstallapp(string packagename){
    try {
      class<?> clazz = class.forname("android.os.servicemanager");
      method method_getservice = clazz.getmethod("getservice",string.class);
      ibinder bind = (ibinder) method_getservice.invoke(null, "package");
      ipackagemanager ipm = ipackagemanager.stub.asinterface(bind);
      ipm.deletepackageasuser(packagename,null,0,2);
      system.out.println("=================>>卸载成功");
    } catch (exception e) {
      e.printstacktrace();
      system.out.println("=================>>卸载失败");
    }
  }

方法二 (兼容到6.0,6.0以上没测过,现在用的是这种没一点问题兼容公司所以系统,无需aidl)

1. rxjava版 安装如果不要rxjava可以new thread但要记住线程里不要有刷新ui操作

  private void install(final string packagename, final string filepath) {
    observable.create(new observableonsubscribe<integer>() {
      @override
      public void subscribe(observableemitter<integer> e) throws exception {
        file file = new file(filepath);
        if (filepath == null || filepath.length() == 0 || file == null) {
          e.onnext(0);
          return;
        }
        string[] args = { "pm", "install", "-r", filepath };
        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 s;
          while ((s = successresult.readline()) != null) {
            successmsg.append(s);
          }
          while ((s = errorresult.readline()) != null) {
            errormsg.append(s);
          }
        } catch (ioexception e1) {
          e1.printstacktrace();
        } finally {
          try {
            if (successresult != null) {
              successresult.close();
            }
            if (errorresult != null) {
              errorresult.close();
            }
          } catch (ioexception e1) {
            e1.printstacktrace();
          }
          if (process != null) {
            process.destroy();
          }
        }
   if (successmsg.tostring().contains("success") || successmsg.tostring().contains("success")) {
          e.onnext(2);
        } else {
          e.onnext(1);
        }
      }
    }).subscribeon(schedulers.newthread())
        .observeon(androidschedulers.mainthread())
        .subscribe(new observer<integer>() {
          @override
          public void onsubscribe(disposable d) {

          }
          @override
          public void onnext(integer value) {
            if (value==2) {
               //安装成功
            } else {
               //安装错误
            }
          }

          @override
          public void onerror(throwable e) {
            //安装错误
          }

          @override
          public void oncomplete() {

          }
        });
}

2.卸载

  private void uninstall(string packagename) {
    try {
      packagemanager pm = context.getpackagemanager();
      method[] methods = pm!=null?pm.getclass().getdeclaredmethods():null;
      method mdel = null;
      if (methods != null && methods.length>0) {
        for (method method : methods) {
          if (method.getname().tostring().equals("deletepackage")) {
            mdel = method;
            break;
          }
        }
      }
      if (mdel != null) {
        mdel.setaccessible(true);
        mdel.invoke(pm,packagename,null,0);
      }
    } catch (exception e) {
      e.printstacktrace();
    }
  }

3.记得签名和打到system/app里去 前面需要的文件 下面是我们公司的文件名称一般文件都是一样的,对系统编译后是可以获取的。

  1. platform.pk8
  2. platform.x509.pem
  3. signapk.jar

下面是我的工具图

Android 静默安装和卸载的方法

4.可能出现的问题

  1. 方法一如果使用时如果缺少类就把缺少的类复制进去,如果参数不同记得随机应变,一般原生系统是这 样,一般开发不会改动太大pm.
  2. 方法二是比较好的方便快捷而且兼容性好点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: