在Android应用外获取app的签名
?????? 在android中的利用PackageManager可以很輕松得到一個(gè)app的簽名哈希值,但是需要在android下弄一次比較麻煩。其實(shí)完全可以拋開android獲取,很多軟件之類的都實(shí)現(xiàn)了,只是不知道怎么實(shí)現(xiàn)的。今天正好有興趣,小小的探索了一下。
?????? 簽名哈希值是PackageManager的getPackageInfo方法獲取的,但是PackageManager是一個(gè)抽象類。。。而且找了半天也沒找到子類之類的東西,上來就卡住了。。。。
?????? 只好求組萬能的百度,原來有個(gè)PackageManagerService,在com\android\server\pm下,不過關(guān)于位置網(wǎng)上說法不一樣。PackageManagerService近萬行代碼,看的腦袋痛。還好網(wǎng)上有高手進(jìn)行了詳細(xì)分析http://www.open-open.com/lib/view/open1328776151311.html。大概看了看,我最關(guān)心的還是簽名,直接看有關(guān)簽名的部分。
?????
????? 可以看的是在collectCertificatesLI這個(gè)方法里,這里調(diào)用android\content\pm\PackageParser的CollectCertificates方法,在這個(gè)方法里就可以看的通過JarFile來解析apk包,遍歷里面的JarEntry,再調(diào)用JarEntry的getCertificates()來獲取簽名。這里就可以將代碼簡單修改一下脫離android直接用JarFile來解析apk包獲取簽名。
????? 其實(shí)呢,JarEntry的getCertificates()實(shí)質(zhì)上是得到apk包里的簽名文件CERT.RAS解析出簽名的,也可以直接把這個(gè)文件拿出來,用更簡單的方法解析獲取簽名,不過感覺沒什么必要,而且好像不僅僅需要這一個(gè)文件就夠了。
????? 整個(gè)過程很簡單,只是在PackageManagerService上花了一些時(shí)間,但還是沒太看明白,看了那個(gè)高人寫的也比較茫然,看來只能等以后再研究了。后來又接著向下研究簽名,發(fā)現(xiàn)簽名文件所關(guān)聯(lián)的JarEntry每個(gè)apk包都不同,研究很久沒發(fā)現(xiàn)那個(gè)JarEntry有什么特別的代碼,而且有關(guān)的源碼是不全的。。。
????? 這樣的話就可以寫一個(gè)小工具了,十幾行代碼就可以了,可以很輕松的獲取一個(gè)apk包的簽名哈希值,其實(shí)也可以獲得簽名的具體內(nèi)容。
?
總結(jié)
以上是生活随笔為你收集整理的在Android应用外获取app的签名的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Notification大图标修改问题种
- 下一篇: android中layout、drawa