Android笔记之分别使用Android、Java方式获取应用签名
2018-03-26 14:44
435 查看
一、通过Android方式获取应用签名
使用Android的方式获取签名主要通PackageInfo类直接获取:/** * 获取指定应用的签名 * * @param packageName 包名 * @return 应用对应签名 */ private String getSign(String packageName) { try { PackageInfo info = getPackageManager() .getPackageInfo(packageName, PackageManager.GET_SIGNATURES); byte[] bytes = info.signatures[0].toByteArray(); return byte2hex(bytes); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 二进制转换为十六进制字符 * * @param bytes 二进制数 * @return 十六进制字符 */ private static String byte2hex(byte[] bytes) { String hs = ""; String tmp = ""; for (int i = 0; i < bytes.length; i++) { tmp = (Integer.toHexString(bytes[i] & 0XFF)); if (tmp.length() == 1) hs = hs + "0" + tmp; else hs = hs + tmp; } return hs.toUpperCase(); }
二、使用Java的方式获取应用的签名
使用java的方式获取应用签名主要是通过解析apk文件:/** * 获取指定apk文件签名 * @param apkFilePath apk文件存储路径 * @return apk文件的签名 */ public static String getApkSign(String apkFilePath) { apkFilePath = apkFilePath.trim(); byte[] readBuffer = new byte[8192]; Certificate[] certs = null; try { JarFile jarFile = new JarFile(apkFilePath); Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry je = (JarEntry) entries.nextElement(); // System.out.println("-->" + je.getName()); if (je.isDirectory()) { continue; } if (je.getName().startsWith("META-INF/")) { continue; } Certificate[] localCerts = loadCertificates(jarFile, je, readBuffer); if (certs == null) { certs = localCerts; } else { for (Certificate cert : certs) { boolean found = false; if (localCerts != null) { for (Certificate localCert : localCerts) { if (cert != null && cert.equals(localCert)) { found = true; break; } } } if (!found || certs.length != localCerts.length) { jarFile.close(); return null; } } } } jarFile.close(); if (certs != null) { Certificate cert = certs[0]; // System.out.println(cert.getClass()); // System.out.println("---------------------------------------->"); // System.out.println(cert.toString()); // System.out.println("---------------------------------------->"); byte[] bytes = cert.getEncoded(); String sign = byte2hex(bytes); // System.out.println(sign); return sign; } } catch (Exception e) { e.printStackTrace(); } return null; } private static Certificate[] loadCertificates(JarFile jarFile, JarEntry je, byte[] readBuffer) { try { InputStream is = jarFile.getInputStream(je); while (is.read(readBuffer, 0, readBuffer.length) != -1) { } is.close(); return je.getCertificates(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 二进制转换为十六进制字符 * * @param bytes 二进制数 * @return 十六进制字符 */ private static String 4000 byte2hex(byte[] bytes) { String hs = ""; String tmp = ""; for (int i = 0; i < bytes.length; i++) { tmp = (Integer.toHexString(bytes[i] & 0XFF)); if (tmp.length() == 1) hs = hs + "0" + tmp; else hs = hs + tmp; } return hs.toUpperCase(); }
用这种方法若想获取已安装的应用的签名,只需要:
try { // String packageName = getPackageName(); String packageName = "jackpal.androidterm"; ApplicationInfo ai = getPackageManager().getApplicationInfo(packageName, 0); String sign2 = getApkSign(ai.sourceDir); LogUtils.i("-->signature1 : " + sign2); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
相关文章推荐
- 在Java中使用Jedis操作Redis,在高并发的情况下,应用卡死、报无法获取连接错误的处理方式
- Java基础知识强化之网络编程笔记16:Android网络通信之 使用Http的Get方式读取网络数据(基于HTTP通信技术)
- 【慕课笔记】3-4 应用SAX方式解析XML—使用SAX解析将XML的内容和结构存入JAVA对象
- Java基础知识强化之网络编程笔记18:Android网络通信之 使用HttpClient的Post / Get 方式读取网络数据(基于HTTP通信技术)
- Android签名证书的sha1值获取方式(使用keytool )
- android基础笔记:数据库SQLite应用2(使用java方法)
- Java基础知识强化之网络编程笔记17:Android网络通信之 使用Http的Post方式读取网络数据(基于HTTP通信技术)
- Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用
- Android(java)学习笔记108:通过反射获取私有构造方法并且使用
- Android 面试题笔记-------注册广播的方式有几种,分别是?
- Android应用中使用GridView实现数据网格显示(传智播客视频笔记)
- Android使用achart绘图框架出现java.lang.NoClassDefFoundError错误解决方式
- Android使用achart绘图框架出现java.lang.NoClassDefFoundError错误解决方式
- 在Android应用中使用SQLite数据库(传智播客视频笔记)
- Java笔记——获取当前路径以及System.getProperty()使用
- JAVA使用AXMLPrinter获取APK中Androidmanifest.xml信息
- android应用开发笔记---_Handler的使用
- Android应用中使用ListView实现数据列表显示(传智播客视频笔记)
- Android深入浅出系列之实例应用—弹出消息Toast对象的使用自定义方式(二)
- android 获取应用证书及签名信息