Android项目的代码混淆

代码混淆:

代码混淆有两种重要功能。其一,混淆代码。其二,优化代码。有的混淆是根据自己写得代码有关,需要根据异常错误对prguard-rules.pro文件进行修正。

在app下的build.gradle文件中添加如下代码(minifyEnabled 表示是否混淆,默认是false,这里要记得设置成true):

release {

// 不显示Log

// buildConfigField "boolean", "LOG_DEBUG", "false"

//混淆 true ,不 false

minifyEnabledtrue

shrinkResourcesfalse//改为false 就解决了

//Zipalign优化

zipAlignEnabledtrue

// 移除无用的resource文件

shrinkResourcesfalse

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

其中proguard-android.txt文件是本地sdk/tools/proguard文件夹下的默认文件;prguard-rules.pro文件就是用来编写混淆代码的;

ignorewarnings# 抑制警告

#代码混淆压缩比, 在0~7之间, 默认为5, 一般不做修改

-optimizationpasses5

#混合时不使用大小写混合, 混合后的类名为小写

-dontusemixedcaseclassnames

#指定不去忽略非公共库的类

-dontskipnonpubliclibraryclasses

#这句话能够使我们的项目混淆后产生映射文件

#包含有类名->混淆后类名的映射关系

-verbose

#指定不去忽略非公共库的类

-dontskipnonpubliclibraryclassmembers

#不做预校验, preverify是proguard的四个步骤之一, Android不需要preverify, 去掉这一步能够加快混淆速度。

-dontpreverify

#保留Annotation不混淆

-keepattributes*Annotation*,InnerClasses

#避免混淆泛型

-keepattributesSignature

#抛出异常时保留代码行号

-keepattributesSourceFile,LineNumberTable

#指定混淆是采用的算法, 后面的参数是一个过滤器

#这个过滤器是谷歌推荐的算法, 一般不做更改

-optimizations!code/simplification/cast,!field/*,!class/merging/*

# 存放在app\build\outputs\mapping\release中

-verbose

# 混淆前后的映射

-printmappingmapping.txt

# apk 包内所有 class 的内部结构

-dumpclass_files.txt

# 未混淆的类和成员

-printseedsseeds.txt

# 列出从 apk 中删除的代码

-printusageunused.txt

# 包名不使用大小写混合 aA Aa

-dontusemixedcaseclassnames

# 不混淆第三方引用的库

-dontskipnonpubliclibraryclasses

# 不做预校验

-dontpreverify

#保留我们使用的四大组件, 自定义的Application等等这些类不被混淆#因为这些子类都有可能被外部调用

-keeppublic class * extends android.app.Activity

-keeppublic class * extends android.app.Appliction

-keeppublic class * extends android.app.Service

-keeppublic class * extends android.content.BroadcastReceiver

-keeppublic class * extends android.content.ContentProvider

-keeppublic class * extends android.app.backup.BackupAgentHelper

-keeppublic class * extends android.preference.Preference

-keeppublic class * extends android.view.View

-keeppublic class com.android.vending.licensing.ILicensingService

#你项目中需要保存的实体和类

-keepclass com.** {*;}

-keepclass cn.sharesdk.onekeyshare.** {*;}

-keepclass www.zhouyan.project.bus.RxCustomerSupplier {*;}

-keepclass www.zhouyan.project.retrofit.GlobalResponse {*;}

-keepclass www.zhouyan.project.view.modle.** {*;}

-keepclass com.squareup.timessquare.**{*;}

#保留support下的所有类及其内部类

-keepclass android.support.** {*;}

#保留R下面的资源

-keepclass **.R$* {*;}

#保留本地native方法不被混淆

-keepclasseswithmembernamesclass * {

native ;

}

#保留在Activity中的方法参数是view的方法,

#这样以来我们在layout中写的onClick就不会被影响

-keepclassmembersclass * extends android.app.Activity{

public void *(android.view.View);

}

#保留枚举类不被混淆

-keepclassmembersenum * {

public static **[] values();

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

}

#保留我们自定义控件(继承自View)不被混淆

-keeppublic class * extends android.view.View{

*** get*();

void set*(***);

public (android.content.Context);

public (android.content.Context, android.util.AttributeSet);

public (android.content.Context, android.util.AttributeSet, int);

}

#保留Parcelable序列化类不被混淆

-keepclass * implements android.os.Parcelable {

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

}

#保留Serializable序列化的类不被混淆

-keepclassmembersclass * implements java.io.Serializable {

static final long serialVersionUID;

private static final java.io.ObjectStreamField[] serialPersistentFields;

private void writeObject(java.io.ObjectOutputStream);

private void readObject(java.io.ObjectInputStream);

java.lang.Object writeReplace();

java.lang.Object readResolve();

}

#对于带有回调函数的onXXEvent的, 不能被混淆

-keepclassmembersclass * {

void *(**On*Event);

}

-keepclass com.** {*;}

#如果有引用v4包可以添加下面这行

-keeppublic class * extends android.support.v4.app.Fragment

#如果引用了v4或者v7包,percent

-dontwarnandroid.support.v4

-dontwarnandroid.support.v7

-dontwarnandroid.support.percent

#bugly

-dontwarncom.tencent.bugly.**

-keeppublic class com.tencent.bugly.**{*;}

# OkHttp3

-dontwarncom.squareup.okhttp3.**

-keepclass com.squareup.okhttp3.* {*;}

-keepclass okhttp3.* {*;}

-keepclass okio.* {*;}

-dontwarnsun.security.**

-keepclass sun.security.* {*;}

-dontwarnokio.**

-dontwarnokhttp3.**

# Retrofit2

-dontwarnretrofit2.**

-keepclass retrofit2.* {*;}

-keepattributesSignature

-keepattributesExceptions

-dontwarnorg.robovm.**

-keepclass org.robovm.* {*;}

# RxJava RxAndroid

-dontwarnrx.**

-keepclass rx.* {*;}

-dontwarnsun.misc.**

-keepclassmembersclass rx.internal.util.unsafe.*ArrayQueue*Field* {

long producerIndex;

long consumerIndex;

}

-keepclassmembersclass rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {

rx.internal.util.atomic.LinkedQueueNode producerNode;

}

-keepclassmembersclass rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {

rx.internal.util.atomic.LinkedQueueNode consumerNode;

}

# Gson

#如果用用到Gson解析包的, 直接添加下面这几行就能成功混淆, 不然会报错。

-keepattributesSignature

-keepclass sun.misc.Unsafe {*;}

-keepclass com.google.gson.examples.android.model.* {*;}

#glide

-keeppublic class * implements com.bumptech.glide.module.GlideModule

-keeppublic enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {

**[] $VALUES;

public *;

}

#butterknife

-keepclass butterknife.** {*;}

-dontwarnbutterknife.internal.**

-keepclass **ViewBinder{*;}

-keepclass **OnClick{*;}

-keepclasseswithmembernamesclass * {

@butterknife.* ;

}

-keepclasseswithmembernamesclass * {

@butterknife.* ;

}

#sharesdk

-keepclass cn.sharesdk.**{*;}

-keepclass com.sina.**{*;}

-keepclass **.R$* {*;}

-keepclass **.R{*;}

-dontwarncn.sharesdk.**

-dontwarn**.R$*

# EventBus3.0

-keepattributes*Annotation*

-keepclassmembersclass ** {

@org.greenrobot.eventbus.Subscribe ;

}

-keepenum org.greenrobot.eventbus.ThreadMode {*;}

# Only required if you use AsyncExecutor

-keepclassmembersclass * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {

(Java.lang.Throwable);

}

#-keep com.igexin.**

-keepclass com.igexin.**{*;}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容