上文分析了 mContext.getPackageManager() 调用流程,本文再简单说下 mPM.getPacakgeInfo()调用流程。
这里就涉及到了 binder 知识。
mPM 是 ApplicationPackageManager.java 类型,此类封装了 IPackageManager 的实现。
@Override
public PackageInfo getPackageInfo(String packageName, int flags)
throws NameNotFoundException {
return getPackageInfoAsUser(packageName, flags, mContext.getUserId());
}
@Override
public PackageInfo getPackageInfoAsUser(String packageName, int flags, int userId)
throws NameNotFoundException {
try {
PackageInfo pi = mPM.getPackageInfo(packageName, flags, userId);
if (pi != null) {
return pi;
}
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
throw new NameNotFoundException(packageName);
}
这里我们就要分析 IPacakgeManager.java,这个java文件是编译时