private Signature[] getSignatures(String archiveFilePath) {
//必须使用反射机制才能获取未安装apk的签名信息
final String PACKAGEPARSER_CLASS_NAME = "android.content.pm.PackageParser";
final String PARSEPACKAGE_METHOD_NAME = "parsePackage";
final String SUBCLASS_PACKAGE_CLASS_NAME = "Package";
final String COLLECTCERTIFICATES_METHOD_NAME = "collectCertificates";
final String GENERATEPACKAGEINFO_METHOD_NAME = "generatePackageInfo";
try {
//根据反射获取隐藏类
Class<?> parserClass = Class.forName(PACKAGEPARSER_CLASS_NAME);
//获取类的构造方法
Constructor<?> cons = parserClass.getConstructor(String.class);
//调用构造方法,构造类实例
Object packageParser = cons.newInstance(archiveFilePath);
//获取名为"parsePackage"的方法
Method parseMethod = parserClass.getMethod(PARSEPACKAGE_METHOD_NAME, File.class, String.class, DisplayMetrics.class, int.class);
//遍历类的子类集,找到Package内部类
Class<?>[] subClasses = parserClass.getClasses();
Class<?> packageClass = null;
for(int i=0; i<subClasses.length; i++) {
if(subClasses[i].getName().equals(PACKAGEPARSER_CLASS_NAME+"$"+SUBCLASS_PACKAGE_CLASS_NAME)) {
packageClass = subClasses[i];
}
}
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
//调用parseMethod方法,获取Package的实例
Object pkg = parseMethod.invoke(packageParser, new File(archiveFilePath), archiveFilePath, metrics, 0);
if(pkg == null) {
Log.e("解析apk包失败");
return null;
}
//获取名为"collectCertificates"的方法
Method certMethod = parserClass.getMethod(COLLECTCERTIFICATES_METHOD_NAME, packageClass, int.class);
//调用collectCertificates方法,收集证书
certMethod.invoke(packageParser, pkg, 0);
//获取名为"generatePackageInfo"的方法
Method genMethod = parserClass.getMethod(GENERATEPACKAGEINFO_METHOD_NAME, packageClass, int[].class, int.class, long.class, long.class);
//最后调用generatePackageInfo方法,得到签名信息
PackageInfo pi = (PackageInfo)genMethod.invoke(packageParser, pkg, null, PackageManager.GET_SIGNATURES, 0, 0);
return pi.signatures;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
} catch (SecurityException e) {
// TODO Auto-generated catch block
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
} catch (InstantiationException e) {
// TODO Auto-generated catch block
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
}
return null;
}