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

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

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

      抛开android获取app的签名 —— 一次源码探索之旅_第1张图片

      可以看的是在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内核开发:系统分区与镜像文件的烧写
  2. 关于Android 动态加载 jar 文件
  3. android 在android中教你一行代码判断是不是主线程
  4. 在Android设备上运行纯java代码
  5. Android系统编译―Android.mk文件的简单介绍
  6. Android应用程序进程启动过程的源代码分析
  7. android 工程中重新生成gen文件夹或R.java 文件
  8. Android Studio如何设置自己主动提示代码

随机推荐

  1. Android(安卓)控件布局常用属性
  2. android 电容屏(三):驱动调试之驱动程序分析
  3. Android系统启动流程(2) —— 解析Zygote
  4. Android(安卓)自定义View自定义属性的声
  5. android 学习笔记(一):1 环境搭建
  6. android 的webview调用php服务器js , js
  7. Android控件布局常用属性
  8. Android(安卓)面试必备 - 线程
  9. Android(安卓)远程调试 JNI 实现 ( Androi
  10. Android(安卓)常用UI控件的一些属性设置(