android 7.0 静默安装实现方式源码解析

第一种方法:通过 getPackageManager()拿到系统的packageManager对象。通过packagemanger类去直接反射调用installPackage方法就行。输入相应的参数。Invoke调用方法。就能实现了。具体方法如图。

其实反射调用了packageManager类的

这个方法。这个packageManager是个抽象类。他的实现类其实是ApplicationPackageManager这个类。

 

实际上是调用这个类的installCommon方法。我们继续追这个方法。找到这个方法了。重点看这句。

 

这时候大家可能会问mPm是什么。

是一个aidl的接口类。我们接下来接着找到aidl这个文件。IPackageManager.aidl
我们去找下上面的这个方法installPackageAsUser();

一般大多数人会选择直接调用这个aidl文件的这个方法去执行静默安装。追到这大家可能会问哪个类实现的这个方法。我找了好久找到了。

 

就是这个类。

 

 

其实就是这个类的这个方法最终实现了静默安装的功能。最后一个userid是检测是否有uid权限的。一般是root是0权限。System是1000 普通用户是10000以上的权限。权限数越大权限越小。

 

第二种方法用的是通过反射调PackageManagerService服务的installPackageAsUser()
。其实第一种方法算是包装了一层。利用系统packageManager类去调用。
第二种直接上图。

解析一下此方法直接通过Activitythread类去反射getPackageManager()调用此方法如图。

 

这个返回来的是一个aidl对象。就是IPackageManager
,通过IPackageManager.getClass()方法获取PackageManagerService这个对象,有了这个对象我们就可以直接调用installPackageAsUser()方法了。
第三种方法:

调用了ServiceManager类的

 

这个方法,返回的是一个ibinder对象,其实就是IPackageManager的aidl对象,直接拿过来转换一下。mPm=IPackageManager.Stub.asInterface(iBinder)
这样就拿到IPackageManager对象了。直接调用aidl文件里面的这个方法就可以了。

这个是6.0以上才有这个方法。好像6.0以下用installPackage()这个方法。

 

总结:
其实不管怎样什么方法最终调用的还是

Pms这个类的installPackageAsUser()方法。

https://download.csdn.net/download/a916879788/10560731

附上源码下载地址。

如果有什么错误的地方,还请大家指出来。留言给我。谢谢                                                              by:piracy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值