1. 程式人生 > >打包後崩潰要注意的小坑

打包後崩潰要注意的小坑

1:常常碰到這樣的問題,執行程式好好的,但是一旦打包簽名之後執行就是崩潰的,是不是很頭疼,有人會說是6.0許可權的問題,但是要是6.0以下的也會崩潰呢?
2:仔細想想肯定是混淆呀,檔案壓縮的問題,來看下這幾個欄位的含義在這個專案的build.gradle檔案下:
這裡寫圖片描述
3:很多人會看到我的正式release版本下面shrinkResources 為false。沒辦法本來應該是true來移除無用檔案呢,但是沒辦法專案集成了阿里百川的反饋功能所以這個只能是false,當專案功能和安裝包大小衝突時,連老闆也會選擇要功能的。
4廢話太多了,下面來看看混淆檔案吧
以下是混淆規範:


#
#############################################
#程式碼混淆壓縮比,在0~7之間,預設為5,一般不做修改 -optimizationpasses 5 #混合時不使用大小寫混合,混合後的類名為小寫 -dontusemixedcaseclassnames #指定不去忽略非公共庫的類 -dontskipnonpubliclibraryclasses #指定不去忽略非公共庫的類 -dontskipnonpubliclibraryclassmembers #這句話能夠使我們的專案混淆後產生對映檔案 #包含有類名->混淆後類名的對映關係 -verbose #不做預校驗,preverify是proguard的四個步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度。
-dontpreverify #保留Annotation不混淆 -keepattributes *Annotation*,InnerClasses #避免混淆泛型 -keepattributes Signature #丟擲異常時保留程式碼行號 -keepattributes SourceFile,LineNumberTable #指定混淆是採用的演算法,後面的引數是一個過濾器 #這個過濾器是谷歌推薦的演算法,一般不做更改 -optimizations !code/simplification/cast,!field/*,!class/merging/*

4:下面是我的專案混淆的東西,每一個引入的依賴或庫官方都有他的忽略檔案和混淆檔案的新增程式碼,沒有的可以去官方找下


# ButterKnife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

# EventBus
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

-dontwarn com.google.**
-dontwarn cn.sharesdk.**
-dontwarn butterknife**
-dontwarn uk.co**
-dontwarn com.jeremyfeinstein**
-dontwarn com.alipay**
-dontwarn com.mob**
-dontwarn cn.qq**
-keep class com.alibaba.sdk.android.feedback.impl.FeedbackServiceImpl {*;}
-keep class com.alibaba.sdk.android.feedback.impl.FeedbackAPI {*;}
-keep class com.alibaba.sdk.android.feedback.util.IWxCallback {*;}
-keep class com.alibaba.sdk.android.feedback.util.IUnreadCountCallback{*;}
-keep class com.alibaba.sdk.android.feedback.FeedbackService{*;}
-keep public class com.alibaba.mtl.log.model.LogField {public *;}
-keep class com.cmyd.aiyou.bean.** { *; }
-keep class com.taobao.securityjni.**{*;}
-keep class com.taobao.wireless.security.**{*;}
-keep class com.ut.secbody.**{*;}
-keep class com.taobao.dp.**{*;}
-keep class com.alibaba.wireless.security.**{*;}
-keep class com.ta.utdid2.device.**{*;}
-keepattributes InnerClasses,LineNumberTable
-keep class android.net.http.SslError
-keep class android.webkit.**{*;}
-keep class cn.sharesdk.**{*;}
-keep class cn.smssdk.**{*;}
-keep class com.mob.**{*;}
#-keep class com.android.support.multidex.**{*;}
#okhttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}

#okio
-dontwarn okio.**
-keep class okio.**{*;}
-dontwarn rx.**
-keep class rx.**{*;}


-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontnote
-verbose

#jpush
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }

5:舉例我打正式包後出現了崩潰的一個例子,也是和容易忽略的一個混淆那就是bean或者所謂的model檔案要全部混淆的
這裡寫圖片描述
這裡寫圖片描述
這就是個典型的model沒有混淆忽略的例子引起的崩潰