1,PMS Hook
和一般服务不同的是,AMS和PMS使用了另外一种Hook方式,虽然Hook的代码结构完全相同。
PMS通过getPackageManager这个方法来获取, ContextImpl类的getPackageManager方法如下,
public PackageManager getPackageManager() {
if (mPackageManager != null) {
return mPackageManager;
}
IPackageManager pm = ActivityThread.getPackageManager();
if (pm != null) {
// Doesn't matter if we make more than one instance.
return (mPackageManager = new ApplicationPackageManager(this, pm));
}
return null;
}
可以看到,
1.真正的PMS的代理对象在ActivityThread类里面。
2.ContextImpl通过ApplicationPackageManager对它还进行了一层包装。
ActivityThread类的getPackageManager方法如下,
public static IPackageManager getPackageManager() {
if (sPackageManager != null) {
return sPackageManager;
}
IBinder b = ServiceManager.g