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

来源:互联网 发布:淘宝排行榜页面在哪 编辑:程序博客网 时间:2024/06/08 07:52
private String showUninstallAPKSignatures(String apkPath) {        String PATH_PackageParser = "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升级包的签名是否一致,一致就提示可以安装。

0 0