ApkCanary介紹
APK Checker 是針對(duì) Android 安裝包的分析檢測(cè)工具,根據(jù)一系列設(shè)定好的規(guī)則檢測(cè) APK 是否存在特定的問(wèn)題,并輸出較為詳細(xì)的檢測(cè)結(jié)果報(bào)告,用于分析排查問(wèn)題以及版本追蹤。當(dāng)前,APK Checker 主要包含以下功能:
- 讀取 manifest 的信息
- 按文件大小排序列出 APK 中的所有文件
- 統(tǒng)計(jì)方法數(shù)
- 統(tǒng)計(jì) class 數(shù)目
- 檢查是否經(jīng)過(guò)資源混淆(AndResguard)
- 搜索不含 alpha 通道的 png 文件
- 搜索未經(jīng)壓縮的文件類(lèi)型
- 檢查是否包含多 ABI 版本的動(dòng)態(tài)庫(kù)
- 統(tǒng)計(jì) APK 中包含的 R 類(lèi)以及 R 類(lèi)中的 field count
- 搜索冗余的文件
- 檢查是否有多個(gè)動(dòng)態(tài)庫(kù)靜態(tài)鏈接了 STL
- 搜索 APK 中包含的無(wú)用資源
- 搜索 APK 中包含的無(wú)用 assets 文件
- 搜索 APK 中未經(jīng)裁剪的動(dòng)態(tài)庫(kù)
這些功能具體都是各個(gè)Task執(zhí)行的任務(wù),并且在任務(wù)結(jié)束后,格式化成JSON或者HTML輸出的。具體的任務(wù)都在com.tencent.matrix.apk.model.task這個(gè)包下。

ApkCanary
統(tǒng)計(jì)方法數(shù)與Class數(shù)目
- unzip安裝包
- 在解壓的目錄中,找到所有以
.dex結(jié)尾的文件 - 解析每個(gè)dex文件,找到對(duì)應(yīng)的類(lèi)名以及R$的類(lèi)解析

CountClassTask
搜索無(wú)Alpha通道的png文件
- 遞歸遍歷文件夾,找到以.png以及.9.png結(jié)尾的文件
- 通過(guò)
BufferedImage的ColorModel來(lái)判斷是否有alpha通道
FindNonAlphaPngTask
搜索APK中無(wú)用資源與assets文件
- 遍歷DexFile,并且將DexFile通過(guò)
Baksmali庫(kù)編譯成Smali的文件

編譯成smali文件
-
遍歷Smali文件,找到
const-string定義的字符串常量,匹配Assets目錄下的文件
image.png -
資源文件也差不多,只是資源文件包括了
style,value等等,不只會(huì)在代碼中出現(xiàn),所以除了Smali之外,還需要遍歷XML、resources.arsc等
image.png
STL檢查
通過(guò)nm工具來(lái)查看目標(biāo)文件的符號(hào)表,加入-D參數(shù)將低級(jí)符號(hào)名解析(demangle)成用戶(hù)級(jí)名字,加入-C參數(shù)顯示動(dòng)態(tài)符號(hào)。將該命令執(zhí)行的結(jié)果進(jìn)行解析,如果使用了std::的庫(kù),則認(rèn)為使用了STL的靜態(tài)庫(kù)。

MultiSTLCheckTask


