Android 静默安装和卸载的方法

本文介绍了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 总配置步骤图

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

方法一

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

代码段

安装

 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

下面是我的工具图

4.可能出现的问题

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

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

(0)

相关推荐

  • 使用python编写批量卸载手机中安装的android应用脚本

    该脚本的功能是卸载android手机中安装的所有第三方应用,主要是使用adb shell pm.adb uninstall 命令,所以使用的前提是需要配好adb的环境变量,下面上代码: #!/usr/bin/env python import os def uninstall(): os.popen("adb wait-for-device") print "start uninstall..." for packages in os.popen("adb

  • Android 静默方式实现批量安装卸载应用程序的深入分析

    前段时间做了一个批量安装卸载应用程序的小应用,由于安装卸载应用程序的部分API是隐藏的,所以必须在ubuntu下下载Android系统源码,并编译之后使用MM命令编译生成APK文件,其实也难. 思路是这样的,在XX/packages/apps目录下有一个PackageInstaller的应用程序,Android机器中安装卸载都是由这个应用程序完成的.但是它没有批量安装和卸载的功能,如果要在自己的应用程序中添加批量安装和卸载的功能,其实很简单,只需要参考PakcageInstaller里面的安装卸

  • android监听安装和卸载示例

    BroadcastReceiver 是系统全局广播监听类, 其主要方法是onReceive(),自定义的广播类继承于它并实现自己的onReceive()处理逻辑BroadcastReceiver 使用前,需要进行注册监听(xml和代码两种方式),不使用时需要注销监听,其生命周期一般为整个应用的生命周期 1, 自定义广播自定义广播MyInstalledReceiver继承自BroadcastReceiver,实现其onReceive()方式,具体代码如下: 复制代码 代码如下: public cl

  • Android编程实现监控apk安装,卸载,替换的方法

    本文实例讲述了Android编程实现监控apk安装,卸载,替换的方法.分享给大家供大家参考,具体如下: public class GetBroadcast extends BroadcastReceiver { private static GetBroadcast mReceiver = new GetBroadcast(); private static IntentFilter mIntentFilter; public static void registerReceiver(Conte

  • 在Android 模拟器上安装和卸载APK包的方法

    模拟器(emulator.exe) 可以在 Android SDK 的安装目录下的 tools 文件夹找到运行文件(F:GPhoneandroid-sdk-windows-1.0_r1 ools),双击运行模拟器. 安装 APK 包 adb install [-l] [-r] - push this package file to the device and install it<'-l' means forward-lock the app><'-r' means reinstall

  • Android 监听apk安装替换卸载广播的实现代码

    首先是要获取应用的安装状态,通过广播的形式以下是和应用程序相关的Broadcast ActionACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本ACTION_PACKAGE_CHANGED 一个已存在的应用程序包已经改变,包括包名ACTION_PACKAGE_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正

  • android实现静默安装与卸载的方法

    本文实例讲述了android实现静默安装与卸载的方法.分享给大家供大家参考.具体如下: 方法1:[使用调用接口方法,由于安装卸载应用程序的部分API是隐藏的,所以必须下载Android系统源码,在源码下开发并编译之后使用MM命令编译生成APK文件] import java.io.File; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.con

  • Android实现用代码简单安装和卸载APK的方法

    本文实例讲述了Android实现用代码简单安装和卸载APK的方法.分享给大家供大家参考,具体如下: public class TestInstallAPK extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); // this.unInstallFi

  • Android编程之软件的安装和卸载方法

    本文实例讲述了Android编程之软件的安装和卸载方法.分享给大家供大家参考,具体如下: 安装:从sdcard String fileName = Environment.getExternalStorageDirectory() + "/myApp.apk"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://" + filePath),&

  • Android编程监听APK安装与删除等过程的方法

    本文实例讲述了Android编程监听APK安装与删除等过程的方法.分享给大家供大家参考,具体如下: 软件下载后的一系列动作监听:先前是通过Service监听扫描获取状态,以后用这个方法测试使用 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class getBro

随机推荐