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没有混淆忽略的例子引起的崩溃