1. 程式人生 > >減小apk體積二

減小apk體積二

主流apk大小


一   開啟minifyEnabled程式碼混淆

除了能對程式碼優化混淆,還能對位元組碼檔案進行優化,縮減體積,一般能減小500k左右

Proguard示例程式碼

-optimizationpasses 5          # 指定程式碼的壓縮級別
-dontusemixedcaseclassnames   # 是否使用大小寫混合
-dontpreverify           # 混淆時是否做預校驗
-verbose                # 混淆時是否記錄日誌

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆時所採用的演算法

-keep public class * extends android.app.Activity      # 保持哪些類不被混淆
-keep public class * extends android.app.Application   # 保持哪些類不被混淆
-keep public class * extends android.app.Service       # 保持哪些類不被混淆
-keep public class * extends android.content.BroadcastReceiver  # 保持哪些類不被混淆
-keep public class * extends android.content.ContentProvider    # 保持哪些類不被混淆
-keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些類不被混淆
-keep public class * extends android.preference.Preference        # 保持哪些類不被混淆
-keep public class com.android.vending.licensing.ILicensingService    # 保持哪些類不被混淆

-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆
    native <methods>;
}
-keepclasseswithmembers class * {   # 保持自定義控制元件類不被混淆
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {# 保持自定義控制元件類不被混淆
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { # 保持自定義控制元件類不被混淆
    public void *(android.view.View);
}
-keepclassmembers enum * {     # 保持列舉 enum 類不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
    public static final android.os.Parcelable$Creator *;
}

-keepattributes Signature #過濾泛型

-ignorewarnings #忽略警告

#zxing
-dontwarn com.google.zxing.**
-keep class com.google.zxing.** { *;}

#gson
-dontwarn com.google.gson.**
-keep class com.google.gson.** { *;}

二  開啟 shrinkResources 

能夠刪除無用資源,一些臨時佔位的圖片


這樣開啟上面二個功能就好了

三 使用tinypng有失真壓縮

png無損,jpg有損;jpg會有一定的壓縮,佔體積小;


啟動頁,引導頁,大背景,此類圖片大概130kb左右,可以使用jpg替代;


同一張圖片,jpg比png大概小40%左右,瘦身大概300kb左右;

四 so庫的合理建議

每每整合三方看見一大丟的so庫感覺無法抉擇

只能是參考別人的

armeabi
預設選項
支援所有 ARM* 裝置
armeabi-v7a 
支援基於 ARM* v7 的裝置
支援硬體 FPU 指令
支援硬體浮點運算x86
x86  
支援基於硬體的浮點運算的 IA-32 指令集
mips
支援二進位制介面

根據so庫功能決定;根據自身應用想達到的相容效果決定
瘦身效果明顯,可能瘦身0-10m左右
分析了幾個大型應用,armeabi必須包含,x86選擇性包含,其他指令集極少包含

微薄armeabi
qqarmeabi
微信armeabi
uc瀏覽器armeabi armeabi-v7a
美團armeabi
天貓armeabi
58同城armeabi
今日頭條armeabi armeabi-v7a

這麼牛逼的公司都選擇armeabi ,你懂的

五 切圖解析度


六 對assets目錄優化

assets目錄下的db檔案,靜態文字都可以通過gzip之類的壓縮
瘦身效果視靜態檔案大小,瘦身大概0-3m

七 選擇性使用webp圖片

參考網站

http://isux.tencent.com/introduction-of-webp.html

八 使用微信ResProguard方案

參考網站

http://blog.csdn.net/rzleilei/article/details/52205545

九 小細節處理 瘦身效果有限

1.一些純色背景,邊框使用shape檔案替換

2.使用向量圖

Vector影象剛釋出的時候,是隻支援Android 5.0+的,對於Android pre-L的系統來說,並不能使用,所以,可以說那時候的Vector並沒有什麼卵用。
從AppCompat 23.2之後,Google對p-View的Android系統也進行了相容,也就是說,Vector可以使用於Android 2.1以上的所有系統,只需要引用com.android.support:appcompat-v7:23.2.0以上的版本就可以了,這時候,Vector應該算是迎來了它的春天。
簡單來說,一些向量圖可以用程式碼完成;
看具體情況,大概10kb左右;

瘦身無極限