APK體積減少攻略
整體7zip壓縮
- 將APK包解壓到文件夾
- 全選所有文件,右鍵“添加到壓縮包”
3.“壓縮格式”必須“zip”
4.“壓縮等級”選擇“極限壓縮”
5.“壓縮方法”必須“Deflate”(試了Deflate64,BZip2,LZMA,PPMd都無法正常安裝)
6.“單詞大小”選擇“256” - 將后綴改為APK即可
apksigner簽名
原理:
jarsigner是對apk文件里面的每一個路徑都會簽名,而apksigner只對整體文件簽名,并將結果保存到METF中
制作jks簽名文件
cmd 命令 C:\Program Files\Java\jre1.8.0_111\bin>keytool -genkeypair -alias shy_debug.jks
-keyalg RSA -validity 7 -keystore shy_debug.jks
keytool: 是一個Java數(shù)據(jù)證書的管理工具,keytool 將密鑰(key)和證書(certificates)
存在一個keystore的文件中,或者是jks的文件
keystore:其中包含密鑰和公鑰,指定導出的證書位置和名稱
genkey: 在用戶目錄中創(chuàng)建一個默認.keystore文件
alias:指定別名名稱,不區(qū)分大小寫
keyalg: 指定密鑰算法,例如:RSA、DSA等。默認采用DSA
validity:指定證書有效期多少天
keysize:指定密鑰長度
storepass:指定密鑰庫的密碼(獲取keystroe信息所需的密碼)
keypass:指定別名條目的密碼(私鑰的密碼)
dname:證書擁有者的信息??梢圆挥迷诿钪凶⒚?,會提示你輸入
list:顯示密鑰庫中的證書信息
v:顯示密鑰庫中的證書詳細信息
export:將別名指定的證書導出到文件
file:指定導出到文件的文件名稱
deltete:刪除密鑰庫中的某條目
printcert:查看導出的信息
例子
keytool -genkey -alias fanle -keypass 123456 -keyalg RSA -keysize 1024 -validity 3650 -keystore D:\fanle.jks -storepass 123456 -dname "CN=fanle, OU=xx, O=xx, L=xx, ST=xx, C=xx"
簽名
java -jar /Users/sever1/shell/third/apksigner.jar sign --ks /Users/sever1/shell/third/boxing.jks --ks-key-alias jackzhous --ks-pass pass:wsdyi100 --key-pass pass:wsdyi100 --out out.apk input.apk
剛剛試了一把,發(fā)現(xiàn)apk少了5M
刪除部分R文件
隨著項目越來越大,資源文件R會越來越大,大家都知道Android讀取資源文件時java里面都是通過R.x.x讀取的,再到R.java里面得到資源對應的ID,再回通過ID去resource.asrc里面找到我們的資源顯示即可;看看這個讀取過程,其實我們可
以省去java的R.x.x讀取方式,直接在Java里面用ID讀取,這里我們可以用Python自己寫個腳本完成;現(xiàn)在Android studio新版本應該是做了腳本這一步,我們所需要做的就是拿到打好的apk,然后完成以下幾步
- apktool解包
- 解開包后,刪除掉smali目錄下R文件除R.smali R$style.smali R$stleable.smali之外的其他幾個R文件
- apktool和包簽名即可

最后,能減小apk不少的體積
其它資源策略
1.首先考慮能否不用圖片,比如使用shape代碼實現(xiàn)。
2.其次如果用圖片的話,能否優(yōu)先使用.9圖來簡化圖片。
3.采用svg矢量圖和VectorDrawable類來替換傳統(tǒng)的圖片。
4.如果圖片只是旋轉角度或者顏色不同,可以用代碼實現(xiàn)變換。