某些时候需要获取已安装的apk或者是未安装的apk的签名信息,以下代码片段将会很有用。
1.通过app的packageName获取已安装的apk的签名信息
public Signature getPackageSignature(Context context, String packageName){ PackageManager pm = context.getPackageManager(); List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES); Iterator<PackageInfo> it = apps.iterator(); while(it.hasNext()){ PackageInfo info = it.next(); if(info.packageName.equals(packageName)){ return info.signatures[0]; } } return null; }
2.根据文件路径获取未安装的apk的签名信息
由于android平台本身的一个小bug,使用PackageManager方式获取未安装的apk文件的签名会稍微费事一点。
(android平台的这个小bug有些狗血,是因为PackageManager的的getPackageArchiveInfo中少了如下代码的原因导致)
缺少的代码:
if ((flags & GET_SIGNATURES) != 0) packageParser.collectCertificates(pkg, 0);
问题的详细信息可以查看以下链接:
https://code.google.com/p/android/issues/detail?id=9151#c8
https://android-review.googlesource.com/#/c/18769/1/core/java/android/content/pm/PackageManager.java
这样一来,获取apk文件的签名方式将会变得稍微啰嗦一点
(1)首先自定义一个getPackageArchiveInfo函数,如下:
@SuppressWarnings("unchecked") public PackageInfo getPackageArchiveInfo(String archiveFilePath, int flags){ // Workaround for https://code.google.com/p/android/issues/detail?id=9151#c8 try{ Class packageParserClass = Class.forName( "android.content.pm.PackageParser"); Class[] innerClasses = packageParserClass.getDeclaredClasses(); Class packageParserPackageClass = null; for (Class innerClass : innerClasses){ if (0 == innerClass.getName().compareTo("android.content.pm.PackageParser$Package")){ packageParserPackageClass = innerClass; break; } } Constructor packageParserConstructor = packageParserClass.getConstructor( String.class); Method parsePackageMethod = packageParserClass.getDeclaredMethod( "parsePackage", File.class, String.class, DisplayMetrics.class, int.class); Method collectCertificatesMethod = packageParserClass.getDeclaredMethod( "collectCertificates", packageParserPackageClass, int.class); Method generatePackageInfoMethod = packageParserClass.getDeclaredMethod( "generatePackageInfo", packageParserPackageClass, int[].class, int.class, long.class, long.class); packageParserConstructor.setAccessible(true); parsePackageMethod.setAccessible(true); collectCertificatesMethod.setAccessible(true); generatePackageInfoMethod.setAccessible(true); Object packageParser = packageParserConstructor.newInstance(archiveFilePath); DisplayMetrics metrics = new DisplayMetrics(); metrics.setToDefaults(); final File sourceFile = new File(archiveFilePath); Object pkg = parsePackageMethod.invoke( packageParser, sourceFile, archiveFilePath, metrics, 0); if (pkg == null){ return null; } if ((flags & android.content.pm.PackageManager.GET_SIGNATURES) != 0){ collectCertificatesMethod.invoke(packageParser, pkg, 0); } return (PackageInfo)generatePackageInfoMethod.invoke(null, pkg, null, flags, 0, 0); } catch (Exception e) { Log.e("Signature Monitor", "android.content.pm.PackageParser reflection failed: " + e.toString()); } return null; }
(2)使用自定义的getPackageArchiveInfo函数获取PackageInfo,从而获取签名信息,如下:
/** * * @param context * @param apkFile 文件的全路径信息(包括apk文件的名称),如果是无效的apk文件,返回值为null * @return */ public Signature getApkSignatureByFilePath(Context context, String apkFile){ PackageInfo newInfo = getPackageArchiveInfo(apkFile, PackageManager.GET_ACTIVITIES | PackageManager.GET_SIGNATURES); if(newInfo != null){ if(newInfo.signatures != null && newInfo.signatures.length >0){ return newInfo.signatures[0]; } } return null; }
相关推荐
这个是一个获取apk文件签名的一个小工具,是我从我同事那弄来的分享给大家,请大家不要喷我哈。
接入微信开发时需要签名,这个apk是官方提供的获取签名工具, 微信工具 apk签名获取 接入微信开发时需要签名,这个apk是官方提供的获取签名工具, 微信工具 apk签名获取
)手机端获取安卓软件apk包的signature签名信息。包括发布者、拥有者、证书有效期、公钥、摘要(MD5)。纯手机端获取,无需电脑。程序员朋友的好帮手,截止目前(2020-04-11)没发现可在手机端获取签名信息的同类软件...
新浪微博的签名工具类,分享时输入使用。1 打包发布版apk 2 安装签名apk 3输入包名(注意,包名一个字母都不能错),自动检测apk生成签名
需要JAVA环境 直接拖拽APK 或者改名的rar文件到面板 ,也可以直接选择文件
android10 apk签名文件,签名后可以获取系统权限
通过重新签名Apk,使之获得系统权限,无需在服务器上来进行编译
OPPO获取应用SignAPK,用于OPPO平台创建应用
不需要输入包名,可以获得手机上全部apk的包名和签名,自测过,谢谢!
主要介绍了java获取手机已安装APK的签名摘要的相关资料,需要的朋友可以参考下
GAS签名获取工具1.1.apk
应用签名查看apk
具体使用方法可以参考相关博客:http://blog.csdn.net/i5suoi/article/details/19036975
android 应用签名工具,微信开放平台要求填写签名,获取手机应用的数字签名,用于对当前应用进行二次身份校验,开发者可以使用签名生成工具直接从安装当前应用的手机中获取。应用签名由开发者签名该应用的keystore...
使用此apk可获得应用签名,帮助我们完成微信分享的准备工作
android安卓获取apk签名工具
该APP提供了获取手机上已安装的所有应用的签名信息,并支持直接复制。
adb脚本,android批处理,用于批量处理android相关操作,用于批量自动化处理。用于批量测试,用于批量群控基础
微信官方的下载链接失效了。可以用这个下载。