Android 混淆就是这么简单

前言:今天有个朋友问我一个混淆的细节问题,我突然就是想不起来了,反应了一会才想起来该怎么回答他。鉴于此,我意识到自己对于混淆的长时间的不使用造成了生疏感,所以想着趁着这个事情把混淆的只是给整理一下,写个文章给自己加深一下印象,也给需要的朋友看一看。

虽然现在的大神和菜鸟们都是开始用上了Androidstudio作为Android项目的开发工具,但是我想起来第一次做混淆还是在eclipse上完成的,就当是作为一个纪念回忆吧,今天将在eclipse和Androidstudio上的混淆都给写出来了


先说一下eclipse上怎么做混淆吧:


如果要想让eclipse的混淆产生效果,就必须打开工程目录的project.properties文件,默认如下:


在这个文件里将 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt前面的#删除,混淆就起作用了,如果没有的话,随便找一个工程将这个文件拷贝过来即可,或者直接将这句话复制到这个文件中即可。 

混淆文件里面的配置在eclipse里面和Androidstudio里面是一样的,所以混淆文件的配置会在文章的最后给出一份。


再说一下Androidstudio怎么打开混淆吧:


在Androidstudio项目里面只需要在工程的module的build.gradle里面将minifyEnabled设置为true即可。



Android项目混淆功能最复杂也是最难的地方就是混淆文件的配置,所以我这里会重点把混淆文件的配置的注释给写的细致一些,争取都能很轻易的看明白,然后根据自己项目的需要进行自己项目的混淆功能的实现。

下面的就是混淆文件的语法加注释讲解:

基本的配置:

# 指定代码的压缩级别
-optimizationpasses 5
# 是否使用大小写混合
-dontusemixedcaseclassnames
# 是否混淆第三方jar
-dontskipnonpubliclibraryclasses
# 混淆时是否做预校验
-dontpreverify
#忽略警告,一般不用,不能忽略
#-ignorewarnings
# 混淆时是否记录日志
-verbose
#是否进行优化
#-dontoptimize
# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#不让检查第三方jar包的类是否引用
-dontwarn
#不让检查第三方jar包的类和成员是否引用
-dontskipnonpubliclibraryclassmembers
#当有注解的时候
-keepattributes Signature
-keepattributes *Annotation*


第三方工程作为类库引用时这样格式进行过滤:

#-libraryjars ..\\工程名字
-libraryjars ..\\PuToRefreshLibrary
#-keep class 包名.** {*;}
-keep class com.handmark.pulltorefresh.library.** {*;}
#-dontwarn 包名.**
-dontwarn com.handmark.pulltorefresh.library.**

我用自己的项目给做个示例:

-libraryjars ..\\android-async-http
-keep class com.loopj.android.http.** {*;}
-dontwarn com.loopj.android.http.**


对R文件过滤:
-keep class **.R$* {
*;
}
-keepclassmembers class **.R$* {
public static <fields>;
}

保持具体的类不被混淆,以下是常规的不能混淆的类:

(要保持项目中的某个具体的类不被混淆语法是 :-keep class 包名.类名 {*;})
-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
-keep public class com.google.vending.licensing.ILicensingService
-keep public class * extends android.support.v4.app.FragmentActivity
-keep public class * extends android.support.v4.app.Fragment

保持 native 方法不被混淆:
-keepclasseswithmembernames class * {
native <methods>;
}


保持自定义控件类不被混淆:
-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*(...);
public void get*(...);
}

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

-keepclassmembers class * extends android.app.Activity { 
public void *(android.view.View);
}

-keepclassmembers class * extends android.content.Context { 
public void *(android.view.View); 
public void *(android.view.MenuItem);



保持枚举 enum 类不被混淆:
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}


过滤掉序列化的实体类:
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

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


Serializable序列化,在工具解析和其他一些地方需要用到,要过滤:
-keep public class * implements java.io.Serializable {
public *;
}

-keepclassmembers class * 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();
}

实体类作为json反射时过滤掉:
-keepclassmembers public class * extends android.view.** {
void set*(***);
*** get*();
}

配置所有的方法不被混淆:
-keep public class * {
public protected *;
}

项目中的某个包内的类不被混淆  示例:
#-keep class com.wandu.jkb.db.bean.** {*;}
#-keep class com.wandu.jkb.views.** {*;}
#-keep class com.wandu.jkb.db.bean.**
#-keep class com.wandu.jkb.views.**

混淆时这两个类库需要特殊处理,这样写防止出错:
#-keep class * extends com.slidingmenu.**$*
#-keep class * extends com.actionbarsherlock.**$*


需要过滤掉onclick等需要反射的方法:
-keep class **.* implements android.view.**


如果用到了外接设备等demo作为代码,需要屏蔽相关的类,避免影响功能  示例:
-keepclasseswithmembers class com.wandu.jkb.CallbackService {
<fields>;
<methods>;
}


项目中的第三方jar包用下面这种方式过滤,如果不是在lib里面,需要用到绝对路径才行:
#-libraryjars libs/jar包名字
-libraryjars libs/activation.jar
#-keep 包名或者称为路径.**{*;}
-keep class com.sun.**{*;}
#-dontwarn 包名或者称为路径.**
-dontwarn com.sun.**
-keep class javax.activation.**{*;}
-dontwarn javax.activation.**

示例:

-libraryjars libs/fastjson-1.1.44.android.jar
-keep class com.alibaba.**{*;}
-dontwarn com.alibaba.**

-libraryjars D:/workspace/WheelSpinnerLib/libs/nineoldandroids-2.2.0.jar
-dontwarn com.nineoldandroids.**
-keep class com.nineoldandroids.** {*;}


对于android-support-v4.jar可能需要特殊处理:
-libraryjars D:/workspace/DemoSlidingTabLib/libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** {*;}
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment


以上就是我在配置混淆的过程中碰见的需要的所有的语法和情况需求,猿友们需要什么就看什么就好了,如果没有你需要的就去看看其他的资料吧。

好了,混淆的知识点回忆总结完毕了,温故确实是可以而知新的。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值