App的静默安装和卸载(有系统签名)

Android系统本身提供了安装卸载功能,但是api接口是@hide的,不是公开的接口,所以在应用级别是无法实现静默安装和卸载的,要实现静默安装和卸载需要是系统应用,要有系统签名和相应的权限

简单思路如下:

  1. 通过反射获得安装接口installPackage和 卸载接口 deletePackage
  2. 在自己的包中引入两个接口IPackageInstallObserverIPackageDeleteObserver的空实现
  3. 调用安装卸载的方法,回调上面的两个接口
  4. 添加权限
android:sharedUserId="android.uid.system"
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
  1. 进行系统签名
  2. 将应用push到系统中,作为系统应用

引入两个回掉的空实现

在自己应用的工程中新建一个包android.content.pm,并添加两个文件

  • IPackageDeleteObserver
package android.content.pm;
public interface IPackageDeleteObserver extends android.os.IInterface {public abstract static class Stub extends android.os.Binder implements android.content.pm.IPackageDeleteObserver {public Stub() {throw new RuntimeException("Stub!");}public static android.content.pm.IPackageDeleteObserver asInterface(android.os.IBinder obj) {throw new RuntimeException("Stub!");}public android.os.IBinder asBinder() {throw new RuntimeException("Stub!");}public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags)throws android.os.RemoteException {throw new RuntimeException("Stub!");}}public abstract void packageDeleted(java.lang.String packageName, int returnCode)throws android.os.RemoteException;
}
  • IPackageInstallObserver
package android.content.pm;
public interface IPackageInstallObserver extends android.os.IInterface {public abstract static class Stub extends android.os.Binder implements android.content.pm.IPackageInstallObserver {public Stub() {throw new RuntimeException("Stub!");}public static android.content.pm.IPackageInstallObserver asInterface(android.os.IBinder obj) {throw new RuntimeException("Stub!");}public android.os.IBinder asBinder() {throw new RuntimeException("Stub!");}public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags)throws android.os.RemoteException {throw new RuntimeException("Stub!");}}public abstract void packageInstalled(java.lang.String packageName, int returnCode)throws android.os.RemoteException;
}

自定义接口回调

  • OnPackagedObserver
public interface OnPackagedObserver {void PackageInstalled(String packageName, int returnCode);void PackageDeleted(String packageName,int returnCode);}

实现方法

  • 接口实现
 private OnPackagedObserver onInstallOrDeleteObserver = new OnPackagedObserver() {@Overridepublic void PackageInstalled(String packageName, int returnCode) {Log.d("test","onPackageInstalled");}@Overridepublic void PackageDeleted(String packageName, int returnCode) {Log.d("test","onPackageDeleted");}};class PackageInstallObserver extends IPackageInstallObserver.Stub {public void packageInstalled(String packageName, int returnCode) throws RemoteException {if (onInstallOrDeleteObserver != null) {onInstallOrDeleteObserver.PackageInstalled(packageName, returnCode);}}}class PackageDeleteObserver extends IPackageDeleteObserver.Stub {public void packageDeleted(String packageName, int returnCode) throws RemoteException {if (onInstallOrDeleteObserver != null) {onInstallOrDeleteObserver.PackageDeleted(packageName, returnCode);}}}
  • 反射调用

卸载接口只需要提供要卸载的应用的包名packagename

 public static final int INSTALL_ALL_USERS = 0x00000040;/*** 静默卸载*/public void deleteApk(){PackageManager pm = getPackageManager();Class<?>[] uninstalltypes = new Class[] {String.class, IPackageDeleteObserver.class, int.class};try {Method uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);uninstallmethod.invoke(pm, "your packagename", new PackageDeleteObserver(), 0);}catch (Exception e){e.printStackTrace();}}

安装方法一

  /*** 静默安装* @param filename*/public void installapk(File filename){PackageManager pm = getPackageManager();Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class};try {Method method = pm.getClass().getMethod("installPackage", types);Uri packageURI=Uri.fromFile(filename);method.invoke(pm,packageURI, new PackageInstallObserver(), INSTALL_ALL_USERS, null);}catch (Exception e){e.printStackTrace();}}

安装方法二

    /*** 静默安装* @param installPath* @param packageName*/public void installApkInSilence(String installPath,String packageName) {Class<?> pmService;Class<?> activityTherad;Method method;try {activityTherad = Class.forName("android.app.ActivityThread");Class<?> paramTypes[] = getParamTypes(activityTherad, "getPackageManager");method = activityTherad.getMethod("getPackageManager", paramTypes);Object PackageManagerService = method.invoke(activityTherad);pmService = PackageManagerService.getClass();Class<?> paramTypes1[] = getParamTypes(pmService, "installPackageAsUser");method = pmService.getMethod("installPackageAsUser", paramTypes1);method.invoke(PackageManagerService, installPath, null, 0x00000040, packageName, getUserId(Binder.getCallingUid()));//getUserId} catch (Exception e) {e.printStackTrace();}}private Class<?>[] getParamTypes(Class<?> cls, String mName) {Class<?> cs[] = null;Method[] mtd = cls.getMethods();for (int i = 0; i < mtd.length; i++) {if (!mtd[i].getName().equals(mName)) {continue;}cs = mtd[i].getParameterTypes();}return cs;}public static final int PER_USER_RANGE = 100000;public static int getUserId(int uid) {return uid / PER_USER_RANGE;}

这两个安装方法区别是调用时传入的地址不同。

记录开发经历-----Android静默安装卸载相关推荐

  1. Android 9 P静默安装/卸载App适配终极指南

          Android 9 (P)静默安装/卸载App适配终极指南 Android 9 (P)开发适配指南系列博客目录: Adnroid 9 (P) recovery升级Map of '@/cac ...

  2. Android开发入门与实战之Android应用安装卸载

    当一个Android开发者完整的开发完毕一个程序应用软件结束后要进行软件测试,这就是软件测试员的来历,那么在这之前,要进行Android开发应用的安装与卸载. Android开发入门与实战之Andro ...

  3. APP静默安装卸载管理器实现与上架到应用宝和豌豆荚

    APP静默安装卸载管理器是本花了两天时间开发的第一个上架到应用宝和豌豆荚Android App 程序, 并集成了豌豆荚广告SDK, 腾讯广告SDK还在审批中.APP静默安装卸载管理器主要包含如下功能 ...

  4. Vue3安装配置、开发环境搭建(组件安装卸载)(图文详细)

    Vue3安装配置.开发环境搭建(组件安装卸载)(图文详细) 本文目录: 一.vue的主要安装使用方式 二.node.js安装和配置 1.支持运行 Node.js的平台 2.Node.js 版本开发发布 ...

  5. android实现后台静默安装,Android 静默安装实现方法

    Android静默安装的方法,静默安装就是绕过安装程序时的提示窗口,直接在后台安装. 注意:静默安装的前提是设备有ROOT权限. 代码如下: /** * 静默安装 * @param file * @r ...

  6. 静默删除oracle,静默安装卸载 ORACLE

    静默安装: 使用 dbca.rsp 模板 # 修改第78 行的全局数据库的名字=SID+主机域名 DBNAME="orcl.sczq" # 修改第149行的ORACLE SID S ...

  7. android静默卸载,Android实践 -- Android静默安装和卸载

    App的静默安装和卸载 Android系统本身提供了安装卸载功能,但是api接口是@hide的,不是公开的接口,所以在应用级别 是无法实现静默安装和卸载的,要实现静默安装和卸载需要是系统应用,要有系统 ...

  8. Android 静默安装和智能安装的实现方法

    1 简介 最近研究了Android的静默安装和智能安装,于是写博客记录一下. 静默安装就是无声无息的在后台安装apk,没有任何界面提示. 智能安装就是有安装界面,但全部是自动的,不需要用户去点击. 首 ...

  9. android 静默升级 卸载功能实现

    一.近期需要实现一个apk静默升级卸载自启动功能,首先需要获取系统root权限才能执行静默升级,下面不墨迹直接上代码. 首先是MainActivity 页面 package com.example.t ...

最新文章

  1. COCO新记录:60.6AP!微软提出采用注意力机制进行检测头统一的Dynamic Head
  2. Nat. Commun. | msiPL:质谱数据分析的新工具
  3. RequireJs入门(一)
  4. Centos7安装Oracle JDK
  5. Discuz!NT博客非官方升级!!
  6. java造型_java造型_java向上造型有什么作用为什么要造型有什么效果_彩妆阁
  7. 网站域名解析端口_环境测试必备,无需注册域名,免费动态IP解析一键解析本地网站...
  8. bios设置_bios怎么设置显存 bios设置显存教程【图文】
  9. Linux下内存使用率、CPU使用率、以及运行原理-转
  10. 让你的Android应用与外部元素互动起来
  11. 天国近了(一) -- 揭穿OOP神话
  12. Qt动态映射qobject_cast()
  13. 微信小程序开发入门篇
  14. 16. 收款(Accepting Money)
  15. 体系建模系统软件:体系结构建模工具攻略
  16. 此语言无法安装在此计算机上win7,win7系统无法安装英文语言包解决方法
  17. 常用的Wi-Fi产品调试测试工具
  18. java新手代码翻译成中文_急!老师让我把以下代码翻译成中文的
  19. Python脚本实现对Linux服务器CPU、内存、磁盘空间以及负载情况的监测
  20. wex5 新建mysql数据库_wex5新增数据库

热门文章

  1. 第7章用户界面设计工具
  2. FPGA学习(1)NCO产生任意三角波、方波
  3. 峰度(kurtosis)的c/c++实现
  4. 如何从Mac轻松清理其他存储文件?
  5. Hitchhiker 部署
  6. argparse库的使用
  7. 4+1视图方法的3大特点——4+1视图剖析系列
  8. 华为机试HJ107:求解立方根
  9. 【已解决】烂泥:域中的打印机无法打印……
  10. 数字城市厦门1+N联动执法管理系统平台测试用例【软件测试与工程】