您的位置:首页 > 编程语言

安卓代码混淆的一点经验

2015-12-01 15:12 113 查看
开启混淆:
设置两个属性为true





配置好混淆规则,对应用签名打包即可:





混淆规则文件:proguard-rules.pro

基础混淆规则:

-optimizationpasses 5 # 指定代码的压缩级别

-dontusemixedcaseclassnames # 是否使用大小写混合

-dontpreverify # 混淆时是否做预校验

-verbose # 混淆时是否记录日志

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

#不混淆需要根据manifest来识别的类

-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

# 保持 native 方法不被混淆

-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);

}

# 保持枚举 enum 类不被混淆

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

# 保持 Parcelable 不被混淆

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

依赖注入的框架需要加上其避免混淆规则:
比如butterknife:
http://jakewharton.github.io/butterknife/

-keep class butterknife.** { *; }

-dontwarn butterknife.internal.**

-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {

@butterknife.* <fields>;

}

-keepclasseswithmembernames class * {

@butterknife.* <methods>;

}

友盟第三方登录和分享:
关于qq,微信,sina的jar包的混淆规则:
http://dev.umeng.com/social/android/login-page

-dontshrink

-dontoptimize

-dontwarn com.google.android.maps.**

-dontwarn android.webkit.WebView

-dontwarn com.umeng.**

-dontwarn com.tencent.weibo.sdk.**

-dontwarn com.facebook.**
#-libraryjars libs/SocialSDK_QQZone_2.jar # 注意,这条会报重复混淆,要注释掉

-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 *;

}

报错:找不到某个jar包中的类:
解决方法:不混淆这个jar包:

# 不混淆七牛的jar包

#(声明lib文件)-libraryjars **.jar

#(不提示警告)-dontwarn com.xx.bbb.**

#(不进行混淆)-keep class com.xx.bbb.** { *;}

#-libraryjars libs/qiniu-android-sdk-7.0.9.jar -->jar包已被统一声明,所以这里不用再重复声明

-dontwarn com.qiniu.android.**

-keep class com.qiniu.android.** { *;}

至此,打包可以成功:

运行,eventbus报错:
说明eventbus的包不能混淆
解决:保留eventbus中的类,以及我们的类中的onevent方法:

#eventbus

-dontwarn de.greenrobot.event.**

-keep class de.greenrobot.event.** { *; }

-keepclassmembers class ** {

public void onEvent*(**);

void onEvent*(**);

}

javabean类多层调用时空指针:
找不到内部的类:
解决:不混淆domain包下的javabean:

# 保留domain包中的类

-keep class com.qxinli.android.domain.** { *; }

其他:
不混淆volley,jpush:

# volley

-keep class com.android.volley.** {*;}

-keep class com.android.volley.toolbox.** {*;}

-keep class com.android.volley.Response$* { *; }

-keep class com.android.volley.Request$* { *; }

-keep class com.android.volley.RequestQueue$* { *; }

-keep class com.android.volley.toolbox.HurlStack$* { *; }

-keep class com.android.volley.toolbox.ImageLoader$* { *; }

#jpush

#-libraryjars libs/jpush-sdk-release1.6.3.jar

-dontwarn cn.jpush.**

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

最终:混淆成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: