一、背景和現狀
安裝包的重要性無需多提,針對安裝包質量控制越來越嚴格和規范,包括證書、文件大小、安裝成功率等,APP的證書及混淆是影響APP的安裝成功率及代碼安全性的很大因素,隨着功能迭代,安裝包也會隨之增大,那么用戶下載和app激活轉化率就會越低,同時在提交及發布渠道時的錯誤率也會提升,所以成熟的app會不定期進行安裝包瘦身實踐,通過對於代碼、資源文件等梳理將安裝包大小控制在一個合理的值。(比如有app,iOS安裝包大小控制在55M,Android安裝包大小控制在28M等)。
目前組內針對這一塊已經形成了APP的安裝包的常規檢測,並將其加入到整個研發流程中,參與人員會包含產品、設計、開發和測試同學。
二、安裝包質量目標確立
1、包大小控制
2、資源重復及大小文件檢測及新增控制
3、重復、廢棄及無用代碼檢測
4、基本項檢查
三、檢測技術及度量指標
1、 針對APK的總體大小
1.1 獲取方式:
針對IOS端:開發者證書、企業證書和發布證書打出來的包可能大小不同,並且debug和release也會影響包大小,從第一版本開始,建議選擇發布證書+release版本作為被測包。
安卓端:不存在IOS端的證書問題,建議選擇release版本打出的包作為被測包
1.2 控制方式:
研發工作開始之前,研發負責人給出APP的預估大小值
(1)開發人員在需求評審完成就給出本版本安裝包大小的預估值,產品和測試人員會針對研發負責人給出的預估值和實際值作出比較,並針對實際值與預估值有較大差距的情況,由開發人員給出問題原因。
(2)在整體研發過程中,設計人員給出的UI設計圖根據需要優先做一次無損壓縮,之后研發人員可根據項目情況,再做一次無損壓縮,兩次壓縮之后能夠降低一定量的資源文件的大小。目前安卓端一般會采用.9圖片,能夠有效減少圖片等資源文件的大小。
2、針對資源文件的檢測——避免過大和重復
重復文件的檢測方式:首先根據文件頭判斷文件類型,確認文件類型是資源文件的,會通過大小和md5值進行資源文件是否重復的判斷,之后將重復文件的列表輸出,並且輸出重復文件的占用大小。
對重復文件及大小的約定規則如下:
(1)重復文件的總占用大小超過0.1M時會發出告警;
(2)重復文件的項數不能有增加,歷史重復需要在接下來的版本中進行不斷刪減。
(3)針對資源文件的大小的監控,需要與設計同學一起確定指標,將資源文件分成大中小三種級別,當出現大文件時,需要給出預警。
3、針對引入的第三方sdk的功能判斷——避免sdk本身功能模塊與非sdk有重復
在開發過程中需要對引入的第三方sdk的功能接口熟悉,並且需要了解sdk及非sdk模塊是否存在功能的重復實現情況,是則需要在APP的非sdk的代碼中做刪除。
4、對代碼的檢查及優化:
(1)包括對重復功能的代碼的檢查:有可能在歷史版本迭代積累的過程中,在整個研發過程中導致出現多份重復功能的代碼,或者相似功能代碼
(2)對廢棄功能的代碼檢查:這里可以和測試及產品同學一起,確認版本功能以及case走查,以此來達到對歷史代碼的清理。 建議檢查方式:可以通過代碼覆蓋率的方式,在執行case的過程中統計代碼覆蓋率,對未覆蓋到的代碼進行分析及進一步的處理。
5、對證書、log以及混淆的校驗:
(1)針對打包的證書的校驗:安卓端可通過證書的md5值進行驗證;
(2)混淆可通過smali工具進行解壓后生成的代碼,優先對資源文件做校驗,之后可以獲取LaunchActivity的代碼,對代碼做規則判定以驗證是否混淆;
(3)log的驗證有些apk是通過一個文件記錄開關,則可解壓文件讀取內容得到開關即可,若不滿足此要求,則可通過自動運行app獲取日志信息做校驗。
6、持續優化:
以上幾個指標需要加入到研發管理流程中,堅持N個版本下來,一定能夠有比較好的效果。
安裝包檢查結果輸出模板可見下方:
安裝包常規檢查 |
|
檢查項 |
結果數據 |
大小 / 與上一版本對比 |
23.45MB/20.34MB |
包名 |
com.xx.xx |
名稱 |
xx網 |
證書一致性 |
是 |
版本 |
7.3.0 |
內部版本號 |
160 |
min SDK |
18 |
log是否關閉 |
是 |
是否混淆 |
是 |
重復文件大小 |
80.27KB |
重復文件項數 |
53項 |
重復文件具體列表 |
|
File1 |
File2 |
res\drawable-xxhdpi-v4\xx.png |
res\drawable-xxhdpi-v4\yy.png |
res\raw\m_1.jpg |
res\raw\m_2.jpg |
res\drawable-xxhdpi-v4\a.png |
res\drawable-xxhdpi-v4\b.png |
res\drawable-hdpi-v4\bg.9.png |
res\drawable-xhdpi-v4\normal.9.png |
assets\gif\xiaolv\png\5.png |
assets\gif\xiaolv\png\icon.png |