Proguard代码混淆

    xiaoxiao2023-03-24  2

    代码混淆是一件非常繁琐的事情,大量的第三方库和引用代码的混淆设置非常容易错,http://proguard.herokuapp.com/这可以帮助开发者快速地生成第三方库可以使用的混淆代码设置

    Proguard原理: java代码编译成二进制的class文件,这个class也可以反编译成源代码,除了注解外原来的code基本都可以看到。为了防止代码code被泄露,我们往往需要混淆–把方法、字段、包和类这些java元素改成无意义的abc等表示。这样代码结构没有变化,还可以运行,但要弄懂代码很难,而且可以删除无效的代码和代码优化。 缺省的情况下,Proguard会混淆所有代码,但是有一些情况是不能混淆的,否则系统找不到会奔溃,如下代码混淆的规则: 1.用到反射的地方 2.接口,比如带有回掉方法的,这种情况较为复杂,不混淆 3.枚举不混淆 4.实体类不混淆 5.内嵌类不混淆 6.自定义控件不混淆 7.android Resource文件引用不混淆 8.android序列化也不混淆 9.数据库驱动不混淆 10.android R文件不混淆 11.引用的第三方库针对性不混淆

    下面是Proguard文件的构建 基本的配置

    ################# 基本指令 ###################### #代码的压缩级别, 0~7之间,默认为5 -optimizationpasses 5 #包名不混合大小写,混淆后的类名为小写(主要针对windows用户的配置) -dontusemixedcaseclassnames #不去忽略非公共的库类 -dontskipnonpubliclibraryclasses #不去忽略非公共的库的类的成员 -dontskipnonpubliclibraryclassmembers #优化 不优化输入的类文件 -dontoptimize #不做预校验(Android不需要此步骤,跳过可加快混淆速度) -dontpreverify #混淆后生成映射文件-->(包含有类名->混淆后类名的映射关系) -verbose #指定映射文件的名称 -printmapping proguardMapping.txt #-applymapping proguardMapping.txt #混淆时所采用的算法,谷歌推荐,一般不改变 -optimizations !code/simplification/arithmetic,!field/,!class/merging/ #保护代码中的Annotation不被混淆,在使用如fastJSON时的实体映射 -keepattributes *Annotation* #避免混淆泛型,在使用如fastJSON时的实体映射 -keepattributes Signature #抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable #忽略警告 -ignorewarning #记录生成的日志数据,gradle build时在本项目根目录输出 #apk 包内所有 class 的内部结构 -dump class_files.txt #未混淆的类和成员 -printseeds seeds.txt #列出从 apk 中删除的代码 -printusage unused.txt ################# 需要保留的东西 ###################### #保留所有的本地native方法不被混淆 -keepclasseswithmembernames class * { native <methods>; } #保持哪些类不被混淆 -keep public class * extends android.app.Fragment -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 * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService #如果有引用v4包可以添加下面这行 -keep public class * extends android.support.v4.app.Fragment #保留在Activity中的方法参数是view的方法,从而在layout里编写的onClick不会被影响 -keepclassmembers 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{ ** get*(); void set*(***); public <init>(android.content.Context); public <init>(android.content.Context, android.util,AttributeSet); public <init>(android.content.Context, android.util,AttributeSet, int); } #保留Parcelable序列final android.os.Parcelable$Creator *; } #保留Serialable序列化的类不被混淆 -keepclassmembers class * implements java.io.Serializable{ static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistenFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object re aesolve(); } #对于R(被混淆 -keep class **.R$* { *; }

    针对自己的app的代码混淆

    ############## 针对app定制 ########## #1. 保护实体类和成员 -keep public class com.msqsoft.hodicloud.model.** {*;} #2. 很重要,内嵌类要保留 -keep class com.msqsoft.hodicloud.activity.IndicatorActivity$*{ *; } #3. 数据库驱动不被混淆 #-keep class com.msqsoft.hodicloud.database.** {*;} #3. 对webView的处理(webview设计复杂操作情况的话,必不可少) -keepclassmembers class * extends anroid.webkit.webViewClient { public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); public boolean *(android.webkit.WebView, java.lang.String); } -keepclassmembers class * extends android.webkit.webViewClient { public void *(android.webkit.webView, java.lang.String); } # 4. 请求包不被混淆 -keep class cn.hodi.hodicloudnetworkservice.** {*;} # 5. adapter不被混淆 -keep class com.msqsoft.hodicloud.adapter.** {*;} #6. 第三方SDK的混淆处理 # butterknife:7.0.1 -keep class butterknife.** {*;} #-dontwarn butterknife.internal.** -keep class **$$ViewBinder {*;} #-keepclasseswithmembernames class *{ # @butterknife.* <fields>; #} #-keepclasseswithmembernames class *{ # @butterknife.* <methods>; #} -keep public class cn.jpush.** {*;} -keep public class com.google.** {*;} -keep public class com.readystatesoftware.viewbadger.** {*;}
    转载请注明原文地址: https://ju.6miu.com/read-1201008.html
    最新回复(0)