在android中的利用PackageManager可以很轻松得到一个app的签名哈希值,但是需要在android下弄一次比较麻烦。其实完全可以抛开android获取,很多软件之类的都实现了,只是不知道怎么实现的。今天正好有兴趣,小小的探索了一下。

       签名哈希值是PackageManager的getPackageInfo方法获取的,但是PackageManager是一个抽象类。。。而且找了半天也没找到子类之类的东西,上来就卡住了。。。。

       只好求组万能的百度,原来有个PackageManagerService,在com\android\server\pm下,不过关于位置网上说法不一样。PackageManagerService近万行代码,看的脑袋痛。还好网上有高手进行了详细分析http://www.open-open.com/lib/view/open1328776151311.html。大概看了看,我最关心的还是签名,直接看有关签名的部分。

     

      可以看的是在collectCertificatesLI这个方法里,这里调用android\content\pm\PackageParser的CollectCertificates方法,在这个方法里就可以看的通过JarFile来解析apk包,遍历里面的JarEntry,再调用JarEntry的getCertificates()来获取签名。这里就可以将代码简单修改一下脱离android直接用JarFile来解析apk包获取签名。

      其实呢,JarEntry的getCertificates()实质上是得到apk包里的签名文件CERT.RAS解析出签名的,也可以直接把这个文件拿出来,用更简单的方法解析获取签名,不过感觉没什么必要,而且好像不仅仅需要这一个文件就够了。

      整个过程很简单,只是在PackageManagerService上花了一些时间,但还是没太看明白,看了那个高人写的也比较茫然,看来只能等以后再研究了。后来又接着向下研究签名,发现签名文件所关联的JarEntry每个apk包都不同,研究很久没发现那个JarEntry有什么特别的代码,而且有关的源码是不全的。。。

      这样的话就可以写一个小工具了,十几行代码就可以了,可以很轻松的获取一个apk包的签名哈希值,其实也可以获得签名的具体内容。

更多相关文章

  1. android UI更新问题 Thread和Looper以及Handler和Message详解 An
  2. Handler与异步消息处理
  3. Android(安卓)View 的工作流程和原理
  4. Android(安卓)开发艺术探索读书笔记 10 -- Android(安卓)的消息
  5. android 流量统计实现思路
  6. [Android]基本概念
  7. Android(安卓)之 Window、WindowManager 与窗口管理
  8. 利用HTML5开发Android笔记(中篇)
  9. 从头学Android之Android的数据存储--SQLite

随机推荐

  1. MySQL存储全角字符和半角字符的区别
  2. my.cnf参数配置实现InnoDB引擎性能优化
  3. MySQL使用UNIQUE实现数据不重复插入
  4. 快速解决mysql57服务突然不见了的问题
  5. 查找MySQL中查询慢的SQL语句方法
  6. mysql指定某行或者某列的排序实现方法
  7. linux服务器下查看mysql的安装信息
  8. MySQL日志设置及查看方法
  9. MYSQL 一个巧用字符函数做数据筛选的题
  10. ubuntu系统中Mysql ERROR 1045 (28000):