android studio 混淆编译

转自: http://blog.csdn.net/qq_33165955/article/details/72723737

首先准备工作在 build.gradle文件中把

buildTypes {
    release {
        minifyEnabled true
    }
}
打开,然后打开proguard-rules.pro 文件 , 这个文件可以通过修改后缀名为txt ,打开修改编辑 ,然后在改过来 ,
也可以自己写一个这个文件当做通用的,然后直接覆盖新项目。然后就是里边要写的东西了:
1,首先把通用规则写上,在}后边开始写,记住#这个符号是注释,就是作废了这一行。添加如下:
-optimizationpasses 5          # 指定代码的压缩级别
-dontusemixedcaseclassnames   # 是否使用大小写混合
-dontpreverify           # 混淆时是否做预校验
-verbose                # 混淆时是否记录日志
-ignorewarnings       #抑制警告 这个不建议加 可以不用写

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆时所采用的算法
-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    # 保持哪些类不被混淆
-keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆
    public void *(android.view.View);
}
-keepclassmembers enum * {     # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keepclassmembers enum * {     # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆
    native <methods>;
}
#保持自定义控件类不被混淆
-keepclasseswithmembers class * {
    public <init>(android.content.Context,android.util.AttributeSet);
 }
-keepclasseswithmembers class * {# 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-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*(...);
}
################不混淆R类##################
-keep public class com.hxwl.wulinfeng.R$*{
   public static final int *;
}
 ####################support.v4#####################
-dontwarn android.support.**
这些是不区分项目名称的。大概从
-keep public class * extends android.app.Activity 这样类似的句子可以看出来规则,下面我不想混淆我继承
Application的所有类,我写下了:
-keep public class * extends android.app.Application # 保持哪些类不被混淆继承 application的类
这只是举个例子;
2,然后我们区分包名进行混淆(也就是你们的和我的包名不一样,但是需要去混淆的类)(这里包名我就用@@来代替
首先是bean类不能被混淆 这里我的包名就是最后一层是bean、db、view
###################通用##############
 -keep class com.@@.@@.bean.**{*;}##bean不混淆
 -keep class com.@@.@@.db.**{*;}##db不混淆
 -keep class com.@@.@@.view.**{*;}##自定义控件
3,然后我们看看我们导进来的包吧
    ------ 就用Gson举例子
-keep class com.google.gson.** {*;}
#-keep class com.google.**{*;}
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.** {
    <fields>;
    <methods>;
}
-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();
}
-dontwarn com.google.gson.**
怎么知道那个com什么的后边怎么写?
你能找到这个包吗
看到了吗?这样,还有的我们直接在AS中com进去的jar ,在Libs里边是找不到的

找到了吗?这样怎么写?
##注解jar
-keep class com.jakewharton.** { *; }
-dontwarn butterknife.internal.**
这样就ok了。 保持 class 。。。。就是 keep class com.@.@.@**{*;} 后边就是里边全部的类文件等,如果不太懂
就照着写就ok;
这里我举几个例子:
##okhttp
-dontwarn com.squareup.okhttp.**
-keep class com.squareup.okhttp3.** { *; }
-keep class com.squareup.okio.** { *; }
-dontwarn okio.**
### greenDAO 3
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties

# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**
# If you do not use RxJava:
-dontwarn rx.**
4,最后还有我们引入的外部工程怎么办?有的没有混淆 有的已经经过混淆了再次混淆会出现问题,直接不去做混淆:
同样的找到那个引入的工程看一下他们的包名就可以了:
-keep class @@.@@.@@.**{*;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值