您的位置:首页 > 移动开发 > Android开发

Android Studio的代码混淆

2016-02-06 11:37 302 查看
与eclipse不同的是,AS下的混淆文件名为:proguard-rules.pro,放在:app/proguard-rules.pro目录下。

直接打开:app/proguard-rules.pro,然后将如下的东西copy进去。

<pre name="code" class="java">-optimizationpasses 5 # 指定代码的压缩级别
-dontusemixedcaseclassnames # 是否使用大小写混合<span style="font-family: Arial, Helvetica, sans-serif;"></span>
-dontskipnonpubliclibraryclasses #不去忽略非公共的库类
-dontpreverify # 混淆时是否做预校验
-verbose # 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法
# 保护注解
-keepattributes *Annotation*
# 保持v4、v7类不被混淆
-keep class android.support.v4.**{*;}
-keep class android.support.v7.**{*;}

# 如果引用了v4或者v7包
-dontwarn android.support.**
# 保持第三方的类不被混淆
-keep class com.umeng.socialize.** { *; }
-keep class de.greenrobot.** {*;}
-keep class com.android.volley.**{*;}
-keep class com.nhaarman.listviewanimations.**{*;}
-keep class cn.jpush.**{*;}
-keep class com.nineoldandroids.**{*;}
-keep class com.umeng.analytics.**{*;}
-keep class com.github.ksoichiro.android.observablescrollview.**{*;}
-keep class kale.adapter.**{*;}
-keep class kale.**{*;}
-keep class com.astuetz.**{*;}
-keep class uk.co.senab.photoview.**{*;}
-keep class com.nostra13.universalimageloader.**{*;}
-keep class com.news.lessnet.tools.**{*;}

-dontwarn uk.co.senab.photoview.**

-keepclassmembers class com.nostra13.universalimageloader.** {*;}

-keepclassmembers class ** {
@de.greenrobot.event.Subscribe <methods>;
}

#所有com.news.lessnet的内部类
-keepattributes Exceptions,InnerClasses,...
-keep class com.news.lessnet.A{
*;
}
-keep class com.news.lessnet.A$* {
*;
}

# 如果用到EventBus,这个一定要加上
-keepclassmembers class ** {
public void onEvent*(**);
}

##记录生成的日志数据,gradle build时在本项目根目录输出##

#apk 包内所有 class 的内部结构
-dump class_files.txt
#未混淆的类和成员
-printseeds seeds.txt
#列出从 apk 中删除的代码
-printusage unused.txt
#混淆前后的映射
-printmapping mapping.txt

-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 <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 * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}

-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.content.Context {
public void *(android.view.View);
public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
public static <fields>;
}

-keep public class mypackage.MyBean {
public void setMyProperty(int);
public int 	getMyProperty();
}

#如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。?
#gson
-keep class com.google.gson.**{*;}
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

#保持 Serializable 不被混淆并且enum 类也不被混淆
-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();
}

-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class **.R$* {
public static <fields>;
}

-keep public class * {
public protected *;
}

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

#所有实体类所在包
-keep class com.news.lessnet.bean.**{ *; }

#友盟的混淆代码
-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**

-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable

-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**

-keep public class com.umeng.socialize.* {*;}
-keep public class javax.**
-keep public class android.webkit.**

-keep class com.facebook.**
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**

-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}

-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}

-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}

-keep public class [your_pkg].R$*{
public static final int *;
}

-dontwarn org.apache.http.**
-dontwarn android.net.http.AndroidHttpClient
-dontwarn com.google.android.gms.**
-dontwarn com.android.volley.toolbox.**
-dontwarn cn.jpush.**

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

-dontwarn com.google.**
-keep class com.google.protobuf.** {*;}

#如下是友盟的更新服务用到的混淆规则
-keepclassmembers class * {
public <init>(org.json.JSONObject);
}
# 以下类过滤不混淆
-keep public class * extends com.umeng.**
# 以下包不进行过滤
-keep class com.umeng.** { *; }
#如果使用了双向反馈功能,还需要添加下面代码,以免UMeng自定义的UI被混淆
-keep public class com.umeng.fb.ui.ThreadView {
}
-keep public class com.news.lessnet.R$*{
public static final int *;
}



然后在app/build.gradle里面配置:
buildTypes {
/*debug {
// 显示Log
buildConfigField "boolean", "LOG_DEBUG", "true"

versionNameSuffix "-debug"
minifyEnabled true
zipAlignEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

4000
}*/
release {
// 显示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
//Zipalign优化
zipAlignEnabled true

// 移除无用的resource文件
shrinkResources true

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
参考资料:

1、http://my.oschina.net/janson2013/blog/417073

2、http://blog.csdn.net/leeo1010/article/details/49903759

3、http://www.bubuko.com/infodetail-987756.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息