您的位置:首页 > 其它

获取APK文件的签名信息,反射实现

2012-11-17 01:41 351 查看
private String showUninstallAPKSignatures(String apkPath) {

String PATH_PackageParser = "php?type=keyword&keyword=android
style=text-decoration:underline;font-size:14px;color:#F70968; target=_blank>android.content.pm.PackageParser";

try {

// apk包的文件路径

// 这是一个Package 解释器, 是隐藏的

// 构造函数的参数只有一个, apk文件的路径

// PackageParser packageParser = new PackageParser(apkPath);

Class pkgParserCls = Class.forName(PATH_PackageParser);

Class[] typeArgs = new Class[1];

typeArgs[0] = String.class;

Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);

Object[] valueArgs = new Object[1];

valueArgs[0] = apkPath;

Object pkgParser = pkgParserCt.newInstance(valueArgs);

MediaApplication.logD(DownloadApk.class, "pkgParser:" + pkgParser.toString());

// 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况

DisplayMetrics metrics = new DisplayMetrics();

metrics.setToDefaults();

// PackageParser.Package mPkgInfo = packageParser.parsePackage(new

// File(apkPath), apkPath,

// metrics, 0);

typeArgs = new Class[4];

typeArgs[0] = File.class;

typeArgs[1] = String.class;

typeArgs[2] = DisplayMetrics.class;

typeArgs[3] = Integer.TYPE;

Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",

typeArgs);

valueArgs = new Object[4];

valueArgs[0] = new File(apkPath);

valueArgs[1] = apkPath;

valueArgs[2] = metrics;

valueArgs[3] = PackageManager.GET_SIGNATURES;

Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);

typeArgs = new Class[2];

typeArgs[0] = pkgParserPkg.getClass();

typeArgs[1] = Integer.TYPE;

Method pkgParser_collectCertificatesMtd = pkgParserCls.getDeclaredMethod("collectCertificates",

typeArgs);

valueArgs = new Object[2];

valueArgs[0] = pkgParserPkg;

valueArgs[1] = PackageManager.GET_SIGNATURES;

pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs);

// 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开

  Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField("mSignatures");

Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg);

MediaApplication.logD(DownloadApk.class, "size:"+info.length);

MediaApplication.logD(DownloadApk.class, info[0].toCharsString());

return info[0].toCharsString();

} catch (Exception e) {

e.printStackTrace();

}

return null;

} 获取程序自身的签名:private String getSign(Context context) {

PackageManager pm = context.getPackageManager();

List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);

Iterator<PackageInfo> iter = apps.iterator();

while(iter.hasNext()) {

PackageInfo packageinfo = iter.next();

String packageName = packageinfo.packageName;

if (packageName.equals(instance.getPackageName())) {

MediaApplication.logD(DownloadApk.class, packageinfo.signatures[0].toCharsString());

return packageinfo.signatures[0].toCharsString();

}

}

return null;

} 对比2个方法的返回值来判断APK升级包的签名是否一致,一致就提示可以安装。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: