AndroidProguard混淆⽂件的规则及使⽤
Android Proguard 混淆⽂件的规则及使⽤
简介
⼀个能够 压缩、优化和混淆整个项⽬代码的配置⽂件,可以通过配置,删除项⽬中的移除⽆⽤代码、减⼩apk体积、通过使⽤⽆意义的名称重命名类、字段和⽅法,达到混淆的作⽤,防⽌反编译,使得apk更不容易进⾏逆向⼯程。
原理
ProGuard能够对Java类中的代码进⾏压缩(Shrink),优化(Optimize),混淆(Obfuscate),预检(Preveirfy)。
1. 压缩(Shrink):⽤于检测和删除没有使⽤的类,字段,⽅法和属性。
2. 优化(Optimize):对字节码进⾏优化,并且移除⽆⽤指令。
3. 混淆(Obfuscate):使⽤a,b,c等⽆意义的名称,对类,字段和⽅法进⾏重命名。
4. 预检(Preveirfy):主要是在Java平台上对处理后的代码进⾏预检。
特别注意
为了确保开发后期可以正常⽣成release 版本的apk,尽量在平时开发过程中,虽然输出地是debug版本的apk,但可以提前将proguard配置好,并且,在debug版本中也开启混淆,这样在不断进⾏开发的过程中就可以发现问题。
使⽤
1. 前提:在项⽬中已经默认配置了 proguard-rules.pro⽂件。只需在使⽤的时候到并进⾏修改即可
2. 使⽤:
①开启混淆 minifyEnable : true (打开app.build(app)设置)
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(''),'proguard-rules.pro'
}
②配置混淆 系统默认的混淆⽂件为:。我们只需配置proguard-rules.pro即可。
注意:每个项⽬由于⽬录不同,所以,每次都需要额外进⾏修改部分混淆⽂件,⽐如登陆的lib,实体类,R⽂件,基本上需要修改包名的地⽅都需要继续修改。
打开 app/proguard-rules.pro
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\Tools\AndroidSDK/tools/
# You can edit the include path and order by changing the proguardFiles
# directive adle.
#
# For more details, see
# developer.android/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public*;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
>>>>基本配置>>>>#
#指定压缩级别(在0~7之间,默认为5,⼀般不需要更改)
-optimizationpasses 5
#不跳过⾮公共的库的类成员
-dontskipnonpubliclibraryclassmembers
#指定不去忽略⾮公共的库的类(默认跳过,有些情况下编写的代码与类库中的类在同⼀个包下,并且持有包内容的引⽤,此时就需要提⽰不跳过)-dontskipnonpubliclibraryclasses
#混合时采⽤的算法(⼀般不改变)
-optimizations !code/simplification/arithmetic,!filed\/*,!class/merging \/*
#混淆时不使⽤⼤⼩写混合,混淆后的类名为⼩写(⼤⼩写混淆容易导致class⽂件相互覆盖)
-dontusemixedcaseclassnames
#不做预检验,preverify是proguard的四⼤步骤之⼀,可以加快混淆速度
-dontpreverify
#混淆后⽣成映射⽂件
-verbose
-
#保护代码中的Annotation不被混淆(这在Json实体映射是⾮常重要,例如FastJson)
-keepattributes *Annotation*
#避免混淆泛型,
#这在JSON实体映射时⾮常重要,⽐如fastJson
-keepattribute Signature
#保留本地⽅法不被混淆
-keepclasseswithmembernames class*{
native<method>;
}
#设置抛出异常时保留代码⾏号
-keepattributes SourceFile.LineNumberTable
#忽略警告(慎⽤)
-ignorewarnings
#输出apk包内所有的class的内部结构
-
dump
#未混淆的类和成员
-
#列出从apk中删除的代码
-
=
#======================项⽬配置=======================
#保留所有的本地native⽅法不被混淆
-keepclasseswithmembernames class*{
native<methods>;
}
#保留继承⾃Activity、Application这些类的⼦类
#保留继承⾃Activity、Application这些类的⼦类
-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.app.BroadcastReceiver
-keep public class*extends android.app.ContentProvider
-keep public class*extends android.app.backup.BackupAgentHelper
-keep public class*extends android.preference.Preference
-keep public class*extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService
#如果有引⽤android-support-v4.jar包,可以添加下⾯这⾏
-keep public class xxx(包名).fragment.**{*;}
#保留在Activity中的⽅法参数是view的⽅法
#从⽽我们在layout⾥⾯编写onClick就不会被影响
-keepclassmembers class*extends android.app.Activity{
public void*(android.view.View);
}
-keep public class*extends android.database.sqlite.SQLiteOpenHelper{*;} -keepnames class*extends android.view.View
-keep class*extends android.app.Fragment {
public void setUserVisibleHint(boolean);
public void onHiddenChanged(boolean);
public void onResume();
public void onPause();
}
-keep class android.support.v4.app.Fragment {
public void setUserVisibleHint(boolean);
public void onHiddenChanged(boolean);
public void onResume();
public void onPause();
}
-keep class*extends android.support.v4.app.Fragment {
public void setUserVisibleHint(boolean);
public void onHiddenChanged(boolean);
public void onResume();
public void onPause();
}
#如果引⽤v4或者v7包
-dontwarn android.support.**
#以防onClick不被影响,保留Activity中包含view的⽅法
-keepclasseswithmembers class*extends android.app.Activity{
public void*(android.view.View);
}
#枚举类不能被混淆
-
keepclassmembers enum*{
public static**[]values();
public static**valueOf(java.lang.String);
}
#保留⾃定义控件不能被混淆(即继承⾃View)不能被混淆
-keep public class*extends android.view.View{
public<int>(t.Context);
public<int>(t.Context,android.util.AttributeSet);
public<int>(t.Context,android.util.AttributeSet,int); public void set*(***);
*** get*();
}
#保留Parcelable序列化的类不能被混淆
-keep class*implements android.os.Parcelable{
public static final android.os.Parcelable$Creator *;
public static final android.os.Parcelable$Creator *;
}
#保留Serializable序列化的类不能被混淆
-keepclassmembers class*implements java.io.Serializable{
static final long serialVersionUID;
private static final java.io.ObjectStreamFiled[] serialPersistentFields;
!static!transient<fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
#对R⽂件下的所有类及其⽅法都不能混淆
-keep class class **.R$*{
*;
}
#对于回调函数onXXEvent的,不能被混淆
-keepclassmembers class*{
void*(**Event);
}
#第三⽅框架的混淆
#okhttp
-keep class com.squareup.okhttp.**{*;}
-dontwarn okio.**
-keepclassmembers class**.R$*{
public static<fields>;
}
#eventbus
-keepattributes *Annotation*
-keepclassmembers class**{
@obot.eventbus.Subscribe <methods>;
}
-keep obot.eventbus.ThreadMode {*;}
# Only required if you use AsyncExecutor
-keepclassmembers class*obot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable);
}
#retroift
-dontwarn retrofit2.**
-keep class retrofit2.**{*;}
-keepattributes Signature
-keepattributes Exceptions
#ButterKnife
-keep class butterknife.**{*;}
-dontwarn butterknife.internal.**
-keep class**$$ViewBinder {*;}
-keepclasseswithmembernames class*{
@butterknife.* <fields>;
}
-keepclasseswithmembernames class*{
@butterknife.* <methods>;
}
#fastjson
-
dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.**{*;}
-keep class com.alibaba.fastjson.**{*;}
#rxjava
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field*{
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
android retrofitrx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
#Facebook
-keep class com.facebook.**{*;}
-keep interface com.facebook.**{*;}
-keep enum com.facebook.**{*;}
#Fresco
-keep class com.facebook.fresco.**{*;}
-keep interface com.facebook.fresco.**{*;}
-
keep enum com.facebook.fresco.**{*;}
#友盟分享
-le.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-t.weibo.sdk.**
-dontwarn com.facebook.**
-keep public class javax.**
-keep public class android.webkit.**
-dontwarn android.support.v4.**
-keep class android.support.**{*;}
-
keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep public interface com.facebook.**
-keep public t.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**
#对引⼊的webview不能进⾏混
-keepclassmembers class⾃⼰webview包下{
public*;
}
-keepclassmembers class*extends android.webkit.webViewClient{
public void*(android.webkit.WebView,java.lang.aphics.Bitmap);
public boolean*(android.webkit.WebView,java.lang.String);
}
-keepclassmembers class*extends android.webkit.webViewClient {
public void*(android.webkit.webView,java.lang.String);
}
#对JavaScript的处理需要将js使⽤到的原⽣⽅法不被混淆
-keepclassmembers x.xxActivity$Jsxx{
<method>;
}
#包含反射的处理
-keep class⾃⼰的反射类的包.**{*;}
>>>>>>> -项⽬⾃定义- >>>>>>>#### #保留实体类和成员不被混淆
-keep public class⾃⼰实体包名.bean.**{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论