由于我们是调用了隐藏的API 。这部分通过反射方法拿到。。在android L 之后版本,这一隐藏API接口的构造方式有所改变,从而导致了该实现方式无法构造Constructor类成功,需要针对版本进行区分调用构造该对象。
Android L版本前的构造方法
Class pkgParserCls = Class.forName(path_packageparser);
Object[] valueArgs = new Object[1];
Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
valueArgs[0] = apkPath;
Object pkgParser = pkgParserCt.newInstance(valueArgs);
Android L版本开始后的构造方法
Class pkgParserCls = Class.forName(path_packageparser);
ConstructorpkgParserCt = null;
pkgParserCt = pkgParserCls.getConstructor(null);
Object pkgParser = pkgParserCt.newInstance(null);
有源码的同学可以对比两个版本去参看一下,它构造方式的改变
ZipResources类内
修改后的方法
public static String getThemePkgFromReflect(String apkPath) {
if (null == apkPath || apkPath.length() < 0) {
return LauncherEnv.Package.PACKAGE_NAME;
}
if (sThemePathMap != null) {
Iterator iter = sThemePathMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if (val != null && ((String) val).equals(apkPath)) {
return (String) key;