如何获取未安装的APK的签名

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;
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值