博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取APK文件的签名信息,反射实现
阅读量:7240 次
发布时间:2019-06-29

本文共 2833 字,大约阅读时间需要 9 分钟。

 1 
private String showUninstallAPKSignatures(String apkPath) {
 2         String PATH_PackageParser = "android.content.pm.PackageParser";
 3         
try {
 4             
//
 apk包的文件路径
 5 
            
//
 这是一个Package 解释器, 是隐藏的
 6 
            
//
 构造函数的参数只有一个, apk文件的路径
 7 
            
//
 PackageParser packageParser = new PackageParser(apkPath);
 8 
            Class pkgParserCls = Class.forName(PATH_PackageParser);
 9             Class[] typeArgs = 
new Class[1];
10             typeArgs[0] = String.
class;
11             Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
12             Object[] valueArgs = 
new Object[1];
13             valueArgs[0] = apkPath;
14             Object pkgParser = pkgParserCt.newInstance(valueArgs);
15             MediaApplication.logD(DownloadApk.
class, "pkgParser:" + pkgParser.toString());
16             
//
 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
17 
            DisplayMetrics metrics = 
new DisplayMetrics();
18             metrics.setToDefaults();
19             
//
 PackageParser.Package mPkgInfo = packageParser.parsePackage(new
20 
            
//
 File(apkPath), apkPath,
21 
            
//
 metrics, 0);
22 
            typeArgs = 
new Class[4];
23             typeArgs[0] = File.
class;
24             typeArgs[1] = String.
class;
25             typeArgs[2] = DisplayMetrics.
class;
26             typeArgs[3] = Integer.TYPE;
27             Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",
28                     typeArgs);
29             valueArgs = 
new Object[4];
30             valueArgs[0] = 
new File(apkPath);
31             valueArgs[1] = apkPath;
32             valueArgs[2] = metrics;
33             valueArgs[3] = PackageManager.GET_SIGNATURES;
34             Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);
35             
36             typeArgs = 
new Class[2];
37             typeArgs[0] = pkgParserPkg.getClass();
38             typeArgs[1] = Integer.TYPE;
39             Method pkgParser_collectCertificatesMtd = pkgParserCls.getDeclaredMethod("collectCertificates",
40                     typeArgs);
41             valueArgs = 
new Object[2];
42             valueArgs[0] = pkgParserPkg;
43             valueArgs[1] = PackageManager.GET_SIGNATURES;
44             pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs);
45             
//
 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
46 
            Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField("mSignatures");
47             Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg);
48             MediaApplication.logD(DownloadApk.
class, "size:"+info.length);
49             MediaApplication.logD(DownloadApk.
class, info[0].toCharsString());
50             
return info[0].toCharsString();
51         } 
catch (Exception e) {
52             e.printStackTrace();
53         }
54         
return 
null;
55     }

 

获取程序自身的签名:

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升级包的签名是否一致,一致就提示可以安装。

 

转载地址:http://sgybm.baihongyu.com/

你可能感兴趣的文章
第43条:返回零长度的数组或者集合,而不是null
查看>>
初识numpy的多维数组对象ndarray
查看>>
java代码随机数100个,10个一输出显示======
查看>>
初始化代码块
查看>>
[NOI2008]志愿者招募
查看>>
Linux——网络端口的状态netstat、ifconfig
查看>>
canvas元素简易教程(5)(大部分转自火狐,自己只写了简单的代码分析)
查看>>
ArcCore重构-生成%_offset.h文件
查看>>
关于kafka的新的group无法订阅到topic中历史消息的问题
查看>>
zp_bj_03
查看>>
Idea 实时编译 和 热部署
查看>>
如何javascript获取css中的样式
查看>>
mysql INFORMATION_SCHEMA (转)
查看>>
多线程之异步编程: 经典和最新的异步编程模型,async与await
查看>>
length
查看>>
JDK源码阅读--HashMap
查看>>
Adroid 展开收起效果实现
查看>>
PHP:第五章——字符串转换与比较
查看>>
0阶 无符号指数哥伦布编码
查看>>
18、配置嵌入式servlet容器(2)
查看>>