Proguard代码混淆
来源:互联网 发布:和女生网络聊天用语 编辑:程序博客网 时间:2024/05/16 11:01
代码混淆是一件非常繁琐的事情,大量的第三方库和引用代码的混淆设置非常容易错,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 reaesolve();}#对于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.** {*;}
0 0
- android 代码混淆proguard
- java代码混淆 proguard
- ProGuard混淆java代码
- android 代码混淆proguard
- Java Proguard 代码混淆
- Android proguard代码混淆
- Android proguard 混淆代码
- anddroid ProGuard 混淆代码
- android 代码混淆 proguard
- android混淆代码-proguard
- Android-Proguard代码混淆
- Android ProGuard代码混淆
- Proguard代码混淆
- Android proguard 代码混淆
- Proguard代码混淆
- Android ProGuard代码混淆
- Android proguard代码混淆
- Android proguard代码混淆
- 2种KMP
- 二叉树的递归&非递归遍历及其他函数功能的实现
- Unique Binary Search Trees (leetcode) 动态规划
- Java实现基于Redis的分布式锁
- 3665顺序表应用8:最大子段和之动态规划法
- Proguard代码混淆
- 多核多线程基础
- 正则表达式(Regular Expression,regex,regexp)
- 字符串-字符串的包含-寻找兄弟字符串 课后题答案
- 数论,优化,预处理(GCD 等于 XOR,uva 12716)
- 清楚浮动最好用的方法,兼容各浏览器
- C++的向上类型转换
- 【POJ 1463】【hdu 1054】Strategic game(树形dp)
- 第五周项目4-数制转换