java 读取apk签名信息_获取APK签名

java 读取apk签名信息_获取APK签名importandroi content Context importandroi content pm PackageInfo importandroi content pm PackageManag importandroi content pm Signature importandroi os Build importandroi util DisplayMetri i

importandroid.content.Context;importandroid.content.pm.PackageInfo;importandroid.content.pm.PackageManager;importandroid.content.pm.Signature;importandroid.os.Build;importandroid.util.DisplayMetrics;importjava.io.File;importjava.io.UnsupportedEncodingException;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.util.Iterator;importjava.util.List;/* apk 签名工具类*/

public classSignUtils {/* 获取未安装Apk的签名

*

*@paramapkPath

*@return

*/

public staticString getApkSignature(String apkPath) {

String PATH_PackageParser= “android.content.pm.PackageParser”;try{//apk包的文件路径//这是一个Package 解释器, 是隐藏的//构造函数的参数只有一个, apk文件的路径

Class> pkgParserCls =Class.forName(PATH_PackageParser);

Class>[] typeArgs = new Class[1];

typeArgs[0] = String.class;

Object[] valueArgs= new Object[1];

valueArgs[0] =apkPath;

Object pkgParser;if (Build.VERSION.SDK_INT > 19) {

pkgParser=pkgParserCls.newInstance();

}else{

Constructor constructor=pkgParserCls.getConstructor(typeArgs);

pkgParser=constructor.newInstance(valueArgs);

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

DisplayMetrics metrics = newDisplayMetrics();

metrics.setToDefaults();//PackageParser.Package mPkgInfo = packageParser.parsePackage(new//File(apkPath), apkPath,//metrics, 0);

Object pkgParserPkg = null;if (Build.VERSION.SDK_INT > 19) {

valueArgs= new Object[2];

valueArgs[0] = newFile(apkPath);

valueArgs[1] =PackageManager.GET_SIGNATURES;

Method pkgParser_parsePackageMtd=pkgParserCls.getDeclaredMethod(“parsePackage”, typeArgs);

pkgParser_parsePackageMtd.setAccessible(true);

typeArgs= new Class[2];

typeArgs[0] = File.class;

typeArgs[1] = int.class;

pkgParserPkg=pkgParser_parsePackageMtd.invoke(pkgParser,

valueArgs);

}else{

typeArgs= new Class[4];

typeArgs[0] = File.class;

typeArgs[1] = String.class;

typeArgs[2] = DisplayMetrics.class;

typeArgs[3] = int.class;

Method pkgParser_parsePackageMtd=pkgParserCls.getDeclaredMethod(“parsePackage”, typeArgs);

pkgParser_parsePackageMtd.setAccessible(true);

valueArgs= new Object[4];

valueArgs[0] = newFile(apkPath);

valueArgs[1] =apkPath;

valueArgs[2] =metrics;

valueArgs[3] =PackageManager.GET_SIGNATURES;

pkgParserPkg=pkgParser_parsePackageMtd.invoke(pkgParser,

valueArgs);

}

typeArgs= new Class[2];

typeArgs[0] =pkgParserPkg.getClass();

typeArgs[1] = int.class;

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);return info[0].toCharsString();

}catch(Exception e) {

e.printStackTrace();

}return null;

}/* 获取已安装apk签名

*

*@paramcontext

*@parampackageName

*@return

*/

public staticString getInstallPackageSignature(Context context,

String packageName) {

PackageManager pm=context.getPackageManager();

List apps =pm

.getInstalledPackages(PackageManager.GET_SIGNATURES);

Iterator iter =apps.iterator();while(iter.hasNext()) {

PackageInfo packageinfo=iter.next();

String thisName=packageinfo.packageName;if(thisName.equals(packageName)) {return packageinfo.signatures[0].toCharsString();

}

}return null;

}public staticString md5(String string) {byte[] hash;try{

hash= MessageDigest.getInstance(“MD5”).digest(string.getBytes(“UTF-8”));

}catch(NoSuchAlgorithmException e) {throw new RuntimeException(“Huh, MD5 should be supported?”, e);

}catch(UnsupportedEncodingException e) {throw new RuntimeException(“Huh, UTF-8 should be supported?”, e);

}

StringBuilder hex= new StringBuilder(hash.length * 2);for (byteb : hash) {if ((b & 0xFF) < 0x10) hex.append("0");

hex.append(Integer.toHexString(b& 0xFF));

}returnhex.toString();

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199566.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午12:42
下一篇 2026年3月20日 下午12:43


相关推荐

  • windows 添加开机启动项

    windows 添加开机启动项目录输入 C ProgramData Microsoft Windows StartMenu Programs StartUp 复制启动的软件到此目录下 开机就能自动启动

    2026年3月20日
    2
  • 好看的热血动漫番剧_评价高好看的动漫

    好看的热血动漫番剧_评价高好看的动漫大家好,我是辣条。最近被室友安利热血动漫番《终末的女武神》和《拳愿阿修罗》,太上头了周末休息熬夜看完了。不过资源不太好找,辣条一怒爬取了资源,这下可以看个够了。室友崇拜连连,想起了我的班花,快点开学,阿西吧…Python爬虫-vip动漫采集效果展示爬取目标网站目标:樱花动漫工具使用开发工具:pycharm开发环境:python3.7,Windows10使用工具包:requests,lxml,re,tqdm重点学习内容正则的使用tqdm的.

    2022年8月23日
    8
  • PyCharm中文指南2.0

    PyCharm中文指南2.0目录第一章 下载与安装第二章 调试与运行第三章 界面与排版第四章 代码的编辑第五章 快捷与效率第六章 搜索与导航第七章 版本与管理第八章 插件与工具第九章 常用的技巧免费下载 不需要 C 币不需要积分 关注即可下载 下载链接 https download csdn net download m0

    2026年3月26日
    2
  • PyCharm中出现unresolved reference的解决办法

    PyCharm中出现unresolved reference的解决办法最近研究 HuaweiOCR 时 下载的 SDK 前两行导入有红色波浪线 但运行代码没问题 参照染血白衣的方法 成功解决 https blog csdn net YeziTong article details 在目录上右键 选择 MarkDirector 把你的项目目录添加到 sourcesroot 里做完这一步红色波浪线就已经消失了 问题解决 原博主的第二步没做 发现我的 PyCharm 里面已经勾选了 而且我用的 Pycharm 跟博主不一样 Sett

    2026年3月27日
    2
  • Arm CPU已适配千问3

    Arm CPU已适配千问3

    2026年3月13日
    1
  • python3.7官网下载步骤_python下载(python官网下载步骤)「建议收藏」

    python3.7官网下载步骤_python下载(python官网下载步骤)「建议收藏」1.打开官方网站,光标移到Downloads,选择windows2.2018年2月28日,python发布了3.7版本。根据不同的操作系统,选择不同版本的安装包。每一个版本提供了三个下载链接,依次是基于网页的安装程序、可执行的安装程序、程序的压缩文件。通常选择下载可执行的安装程序。32位的操作系统请选择windowsx86,64位操作系统请选择windowsx86-64。3.双击打开下载好的安装包…

    2022年6月12日
    64

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号