導讀:這是在今年項目體積優化時,記錄的一些實戰筆記,文中主要針對APK的包內容優化.其中優化手段主要有:字節碼,資源,打包配置等優化手段.java
移動網絡從2G->4G->5G,網速一步步提高,網絡資費也逐漸便宜起來了. 記得上高中的時候5塊錢/30M流量,能happy一個月.如今給我300M流量,說不定一會刷完android
前幾年開始Android開發的職業生涯,那會公司對APP的包體積還特別敏感,到了今天,對APP的包體積已經不在是特別敏感了git
可是對於github
因此今天仍是把我以前對APP瘦身的筆記分享給你們,與此共勉(內容不包含插件化,Split APK等動態下發技術,Only客戶端本身的優化)web
APK包結構主要包含安全
下面咱們來講一下優化的具體實施有哪些.微信
咱們知道,Android的Res資源會生成R文件的引用,以下網絡
public final class R {
private R() {
}
public static final class id {
public static final int action_container = 2131165209;
public static final int action_divider = 2131165211;
public static final int action_image = 2131165212;
public static final int action_text = 2131165218;
public static final int actions = 2131165219;
public static final int async = 2131165226;
public static final int blocking = 2131165232;
public static final int chronometer = 2131165246;
public static final int forever = 2131165290;
public static final int icon = 2131165299;
public static final int icon_group = 2131165300;
public static final int info = 2131165305;
public static final int italic = 2131165309;
public static final int normal = 2131165373;
public static final int notification_background = 2131165374;
public static final int notification_main_column = 2131165375;
public static final int notification_main_column_container = 2131165376;
public static final int right_icon = 2131165405;
public static final int right_side = 2131165406;
public static final int tag_transition_group = 2131165453;
public static final int text = 2131165456;
public static final int text2 = 2131165457;
public static final int time = 2131165461;
public static final int title = 2131165462;
private id() {
}
}
public static final class drawable {
.......
}
public static final class dimen {
...
}
....
}
複製代碼
這都是些常量,那咱們有沒有辦法刪除這個文件呢,引用的地方直接使用常量的值?事實是能夠的. 根據APK打包的編譯過程,在編譯過程當中使用Android的Transform替換全部的類裏面的常量. BuildConfig, Rlayout, R$string,AppConstans, etc架構
目前滴滴開源了一個booster 能夠直接使用,不用在本身造輪子
booster-transform-shrinkapp
組件化後或者依賴第三方 R文件愈來愈多,常量比較多時,效果比較顯著 據抖音的一哥們說,他們項目針對此項目優化後,包體積減小2M左右.
在咱們項目上使用,不是很明顯,優化體積1M左右.
由於是刪除常量,全部使用反射的地方也須要keep住,若是使用滴滴的booster,能夠參考 issues
當咱們項目迭代不斷迭代,總有些資源逐漸不在使用,成爲了冗餘,當不少時候又懶得刪,或者怕刪了出問題. Android Studio自帶lint工具能夠幫助咱們清楚這些無用資源.(這裏的清楚和shrinkResources去除無用是不同的)
除了Android Studio Analyze下的Android Lint(Inspect Code) 用來去除無用資源,包體積優化,對於咱們的代碼一些自動優化也有很明顯的效果. (性能,安全,bug預防等)
Lint詳細使用說明:google.cn/studio/lint
還有Code Cleanup也很強大,能夠減小一些人爲代碼review不規範的地方.
針對圖片的優化,主要有一下幾點
使用.9圖片來代替一些可重複區域的大圖,能夠藉助Android Studio或者sdk下的.9工具來製做.9圖片
國內應用除了應用的icon,大部分應用只設置了一套資源xh-dpi,因此推薦使用一套圖片資源
咱們知道Webp的壓縮比例要比 png,jpg/jpeg的壓縮比高,使用webp能減小一些包體積.
也就是說你項目的 minSdk是4.2以上 >= 18 那麼恭喜你,你能夠把全部圖片轉成webp格式,方法直接圖片右鍵就能夠轉換.
圖片壓縮也是隻要的一個環節. 圖片壓縮的工具不少,png,webp均可以很容易的壓縮,對於應用質量體積有較高要求的,建議使用有損壓縮,對圖片視覺上的效果影響不大.
這裏仍是推薦 使用booster的壓縮工具,能夠png和webp壓縮,針對webp的壓縮針對了不一樣minSdk版本,進行了不一樣壓縮策略. booster-task-compression
咱們知道 res裏面的資源文件名引用通常是這樣的,例如將res/drawable/welcome.png那麼打包的時候,是否是能夠改爲這樣r/s/a.png. 事實是能夠的,相似java的混淆規則去混淆資源,這樣,所佔用的字節數就會下降. 可是存在一個問題就是,這些資源資源ID已經被編譯成32位int值,放入了resources.arsc.那麼混淆的同時就要修改resources.arsc. 張紹文 tinker做者,前微信的技術大年,開源了AndResGuard,能夠解決這樣的方案,而且優化還能夠.具體使用詳解 AndResGuard
com.android.tools.build:gradle 是Android打包的工具,在打包時也能夠對生成的APK包,體積優化,這裏列舉了一些常見的優化策略.
buildTypes {
release {
buildConfigField 'String', 'TINKER_APP_ID', '"d499a164a6"'
debuggable false //debug false
shrinkResources true //移除無用資源
zipAlignEnabled true //開啓壓縮
resConfigs "zh" //表示只使用中文
resConfigs "xhdpi" // 表示只是用xhdpi目錄下的資源文件
minifyEnabled true //開啓混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release ndk {
//選擇要添加的對應cpu類型的.so庫。
abiFilters 'armeabi-v7a'
}
}
}
複製代碼
以上是一些經常使用的配置,其中須要注意的是
APP瘦身就介紹完了,上述方案都在項目中實踐過的.若是文中存在錯誤,請各路大神指教.