直接上干货:
PackageManager pm = mContext.getPackageManager();
PackageInfo pi = pm.getPackageArchiveInfo(mFilename, 0);
mNewResources = pm.getResourcesForApplication(pi.applicationInfo);
要获取插件的资源信息我们采用的是通过实例packageInfo,并动态的更改里边的sourceDir和publicSourceDir为插件Apk路径地址。
而这里关键的是什么时候去加载的资源信息呢:
1,pm.getPackageArchiveInfo
public PackageInfo getPackageArchiveInfo(String archiveFilePath, int flags) {
PackageParser packageParser = new PackageParser(archiveFilePath);
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
final File sourceFile = new File(archiveFilePath);
PackageParser.Package pkg = packageParser.parsePackage(
sourceFile, archiveFilePath, metrics, 0);
if (pkg == null) {
return null;
}
if ((flags & GET_SIGNATURES) != 0) {
packageParser.collectCertificates(pkg, 0);
}
PackageUserState state = new PackageUserState();
return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0, null, state);
}
如图,在执行取packageArchiveInfo的时候,回去解析包文件,具体看源码:
这样在后边调用的时候无论是实例新的ContextThemeWrapper,还是取用资源对象都可以通过getResources()拿到,供动态加载插件资源所用。