ApkCanary介紹
APK Checker 是針對 Android 安裝包的分析檢測工具,根據(jù)一系列設(shè)定好的規(guī)則檢測 APK 是否存在特定的問題媒佣,并輸出較為詳細(xì)的檢測結(jié)果報(bào)告特铝,用于分析排查問題以及版本追蹤。當(dāng)前,APK Checker 主要包含以下功能:
- 讀取 manifest 的信息
- 按文件大小排序列出 APK 中的所有文件
- 統(tǒng)計(jì)方法數(shù)
- 統(tǒng)計(jì) class 數(shù)目
- 檢查是否經(jīng)過資源混淆(AndResguard)
- 搜索不含 alpha 通道的 png 文件
- 搜索未經(jīng)壓縮的文件類型
- 檢查是否包含多 ABI 版本的動態(tài)庫
- 統(tǒng)計(jì) APK 中包含的 R 類以及 R 類中的 field count
- 搜索冗余的文件
- 檢查是否有多個動態(tài)庫靜態(tài)鏈接了 STL
- 搜索 APK 中包含的無用資源
- 搜索 APK 中包含的無用 assets 文件
- 搜索 APK 中未經(jīng)裁剪的動態(tài)庫
這些功能具體都是各個Task執(zhí)行的任務(wù)景描,并且在任務(wù)結(jié)束后囱桨,格式化成JSON或者HTML輸出的仓犬。具體的任務(wù)都在com.tencent.matrix.apk.model.task
這個包下。
ApkCanary
統(tǒng)計(jì)方法數(shù)與Class數(shù)目
- unzip安裝包
- 在解壓的目錄中舍肠,找到所有以
.dex
結(jié)尾的文件 - 解析每個dex文件搀继,找到對應(yīng)的類名以及R$的類解析
CountClassTask
搜索無Alpha通道的png文件
- 遞歸遍歷文件夾窘面,找到以.png以及.9.png結(jié)尾的文件
- 通過
BufferedImage
的ColorModel
來判斷是否有alpha通道
FindNonAlphaPngTask
搜索APK中無用資源與assets文件
- 遍歷DexFile,并且將DexFile通過
Baksmali
庫編譯成Smali的文件
編譯成smali文件
-
遍歷Smali文件叽躯,找到
const-string
定義的字符串常量财边,匹配Assets目錄下的文件
image.png -
資源文件也差不多,只是資源文件包括了
style
点骑,value
等等酣难,不只會在代碼中出現(xiàn),所以除了Smali之外黑滴,還需要遍歷XML憨募、resources.arsc等
image.png
STL檢查
通過nm
工具來查看目標(biāo)文件的符號表,加入-D
參數(shù)將低級符號名解析(demangle)成用戶級名字袁辈,加入-C
參數(shù)顯示動態(tài)符號馋嗜。將該命令執(zhí)行的結(jié)果進(jìn)行解析,如果使用了std::
的庫吵瞻,則認(rèn)為使用了STL的靜態(tài)庫葛菇。
MultiSTLCheckTask