最近幾天混淆代碼遇到了一些問題,整理一下!~
首先app裏面gradle裏面配置一下
buildTypes {
release {
buildConfigField "boolean", "LOG_DEBUG", "true"//是否輸出LOG信息
minifyEnabled true//混淆編譯
zipAlignEnabled true
//移除無用的資源文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude '.readme'
}
然後就可以在proguard-rules.pro開啓混淆配置了。
1、通用的部分
-optimizationpasses 5 # 指定代碼的壓縮級別
-dontusemixedcaseclassnames # 是否使用大小寫混合
-dontpreverify # 混淆時是否做預校驗
-verbose # 混淆時是否記錄日誌
-dontskipnonpubliclibraryclasses #指定不去忽略非公共庫的類的成員
-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 # 保持哪些類不被混淆
-keepattributes *Annotation* #保護代碼中的Annotation不被混淆
-keepattributes Signature #避免混淆泛型
#生成映射文件
-verbose
-printmapping proguardMapping.txt
#拋出出異常的行號
-keepattributes SourceFile,LineNumberTable
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native <methods>;
}
-keepclasseswithmembers class * extends android.view.View{# 保持自定義控件類不被混淆
*** get*();
void set*(***);
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity { # 保留在activity的方法中參數是view的方法
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 *;
}
#保持support包不被混淆
-keep public class * extends android.support.**
#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable{
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
#保持R下的所有類及其方法,都不能被混淆
#不混淆資源類
-keepclassmembers class **.R$* {
public static <fields>;
}
#保持onXXEvent的回調,不能被混淆
-keepclassmembers class *{
void *(**On*Event);
}
2、每個app不同的部分
#保持自定義實體類不被混淆
-keep class com.yjjy.app.bean.** {*;}
-keep class com.yjjy.app.im.bean.** {*;}
#libaray and jar keep 第三方庫或者module不被混淆
-keep class com.nostra13.universalimageloader.** { *; }
-keep class de.hdodenhof.circleimageview.** { *; }
-keep class uk.co.senab.photoview.** { *; }
-keep class com.zsoft.** { *; }
-keep class com.jungly.gridpasswordview.** { *; }
-keep class com.turbomanage.httpclient.** { *; }
-keep class cn.smssdk.** { *; }
-keep class cn.sharesdk.** { *; }
-keep class com.alipay.** {*;}
-dontwarn com.alipay.**
-keep class com.ta.utdid2.** {*;}
-keep class com.ut.device.** {*;}
-keep class org.json.alipay.** {*;}
-keep class bolts.**{*;}
-keep class com.baidu.** { *; }
-keep class com.easemob.** { *; }
-dontwarn com.easemob.**
-keep class com.novell.sasl.client.** { *; }
-keep class com.xonami.javaBells.** { *; }
-keep class de.measite.smack.** { *; }
-keep class gov.nist.** { *; }
-keep class internal.org.apache.http.entity.mime.** { *; }
-keep class javax.sdp.** { *; }
-keep class net.java.sip.communicator.impl.** { *; }
-keep class org.** { *; }
-dontwarn org.**
-keep class jivesoftware.** { *; }
-keep class com.parse.** { *; }
-dontwarn com.parse.**
-keep class com.mob.** { *; }
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.gson.** { *;}
-keep public class com.google.gson.** {public private protected *;}
#權限
-dontwarn com.zhy.m.**
-keep class com.zhy.m.** {*;}
-keep interface com.zhy.m.** { *; }
-keep class **$$PermissionProxy { *; }
#volley
-keep class com.android.** {*;}
-keep class com.android.volley.toolbox.ImageLoader$* { *; }
-keep class android.net.http.** { *; }
-keep class android.net.http.SslCertificate$* { *; }
-keep class android.net.http.SslError$* { *; }
-keep class download.** { *; }
-keep public class android.net.http.SslError
-keep public class android.webkit.WebViewClient
-dontwarn android.webkit.WebView
-dontwarn android.net.http.SslError
-dontwarn android.webkit.WebViewClient
#-keep class java.lang.String{*;}
# For Vitamio classes
-keep public class io.vov.vitamio.** { *; }
這裏面遇到的一個問題是資源文件ID找不到的問題,但是我配置了不混淆R文件了啊,真實奇怪,最後發現clean 一下項目,重新打包就好了。
程序員內功修煉手冊 不定期分享程序員基礎知識,大前端知識!想跟博主一塊成長的快快關注吧!