第一种方法:通过 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