android 代码混淆 eclipse
2015-09-14 18:07
531 查看
混淆报告
一、混淆流程
1.在主工程找到project.properties文件,添加proguard.config=proguard-project.txt 或者是proguard.config=proguard.cfg,(名字自定义),如果没有proguard文件,可以在别的工程里面拷贝一个过来,后面在添加一些自定义的过滤。
二.功能语法定义
1.官方的配置:
-optimizationpasses 5 # 指定代码的压缩级别 5-dontusemixedcaseclassnames # 不要使用大小写混合-dontskipnonpubliclibraryclasses # 不要混淆第三方jar-dontpreverify # 混淆时不做预校验
-verbose # 混淆时记录日志-optimizations !code/simplification/arithmetic,!field/,!class/merging/ # 混淆时所采用的算法
—————————————-
-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.BackupAgent
-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 * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
-keep class com.itheima.mobilesafe.engine.AppInfoProvider
-keep class net.youmi.android.* {;}
-keepclasseswithmembernames class * {
native ;
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
public static final android.os.Parcelable$Creator *;
}
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient ;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
2.对于工程有jar 的做法:
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\cling-support-1.0.5.jar’
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\teleal-common-1.0.13.jar’
-libraryjars ‘E:\eclipseworkspace\abc\com.android.airmusic.ui\libs\android-support-v4.jar’
-keep class com.sun.tools.* {;}
-dontwarn org.teleal.**
-keep class org.teleal.* {;}
-dontwarn android.support.v4.**
-keep class android.support.v4.* {;}
三、总结
为了防止自己的劳动成果被别人窃取,混淆代码能有效防止被反编译。
混淆的过程小结:
1.先过滤官方不建议混淆的类型
2.如果有jar,先定义引用jar包,再过滤整个jar的东西
3.在打包的过程中如果有报编译异常,可对相应的包进行过滤
4.更多详情查看:
http://wenku.baidu.com/view/e30d6fd150e2524de5187e1a.html
四、附录
proguard-project.txt 配置文件内容
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/,!class/merging/
-keepattributes InnerClasses
-keepattributes Annotation
-keepattributes Signature
-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.BackupAgent
-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 * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
-keep class com.itheima.mobilesafe.engine.AppInfoProvider
-keep class net.youmi.android.* {;}
-keep class *.R$ { *; }
-keepclasseswithmembernames class * {
native ;
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient ;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\cling-core-1.0.5.jar’
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\cling-support-1.0.5.jar’
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\teleal-common-1.0.13.jar’
-libraryjars ‘E:\eclipseworkspace\abc\com.android.airmusic.ui\libs\android-support-v4.jar’
-dontwarn com.sun.tools.**
-keep class com.sun.tools.* {;}
-dontwarn org.teleal.**
-keep class org.teleal.* {;}
-dontwarn android.support.v4.**
-keep class android.support.v4.* {;}
-keep class org.xmlpull.* {;}
-keep class org.kxml2.io.* {;}
一、混淆流程
1.在主工程找到project.properties文件,添加proguard.config=proguard-project.txt 或者是proguard.config=proguard.cfg,(名字自定义),如果没有proguard文件,可以在别的工程里面拷贝一个过来,后面在添加一些自定义的过滤。
二.功能语法定义
1.官方的配置:
-optimizationpasses 5 # 指定代码的压缩级别 5-dontusemixedcaseclassnames # 不要使用大小写混合-dontskipnonpubliclibraryclasses # 不要混淆第三方jar-dontpreverify # 混淆时不做预校验
-verbose # 混淆时记录日志-optimizations !code/simplification/arithmetic,!field/,!class/merging/ # 混淆时所采用的算法
以下三条语句是本次混淆忘记加,导致程序出现异常,切记
不要混淆注释,在之前的sdk版本中,不会有这个问题, 从level8开始引入了注#释。如果代码中有用到,而没有处理,就会出现错误的。主要是注释引起的。
-keepattributes Annotation不要混淆泛型,不然也会出错
-keepattributes SignatureR文件不能被混淆
-keep class *.R$ { *; }—————————————-
不能混淆四大主件,以及其他官网提及到的,例如:序列化的类,反射机制,
详情见官网。
-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.BackupAgent
-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 * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
-keep class com.itheima.mobilesafe.engine.AppInfoProvider
-keep class net.youmi.android.* {;}
-keepclasseswithmembernames class * {
native ;
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
序列化的东西不能被混淆
-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;
}
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient ;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
2.对于工程有jar 的做法:
对于加入的第三方jar全部都要定义,可以指定全路径。如果jar在主工程内
可以这样子定义\libs**.jar 下面是本次定义引用的jar包
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\cling-core-1.0.5.jar’-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\cling-support-1.0.5.jar’
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\teleal-common-1.0.13.jar’
-libraryjars ‘E:\eclipseworkspace\abc\com.android.airmusic.ui\libs\android-support-v4.jar’
如果有加jar,下面是过滤第三方jar 的语法
jar本身已经混淆过,再次混淆会报异常
-dontwarn 为取消警告, -keep为保持不被混淆,也就是过滤掉
下面为本次过滤的jar包
-dontwarn com.sun.tools.**-keep class com.sun.tools.* {;}
-dontwarn org.teleal.**
-keep class org.teleal.* {;}
-dontwarn android.support.v4.**
-keep class android.support.v4.* {;}
三、总结
为了防止自己的劳动成果被别人窃取,混淆代码能有效防止被反编译。
混淆的过程小结:
1.先过滤官方不建议混淆的类型
2.如果有jar,先定义引用jar包,再过滤整个jar的东西
3.在打包的过程中如果有报编译异常,可对相应的包进行过滤
4.更多详情查看:
http://wenku.baidu.com/view/e30d6fd150e2524de5187e1a.html
四、附录
proguard-project.txt 配置文件内容
To enable ProGuard in your project, edit project.properties
to define the proguard.config property as described in that file.
#Add project specific ProGuard rules here.
By default, the flags in this file are appended to flags specified
in $sdk.dir/tools/proguard/proguard-android.txt
You can edit the include path and order by changing the ProGuard
include property in
#For more details, see
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 *;
-optimizationpasses 5-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/,!class/merging/
-keepattributes InnerClasses
-keepattributes Annotation
-keepattributes Signature
-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.BackupAgent
-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 * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
-keep class com.itheima.mobilesafe.engine.AppInfoProvider
-keep class net.youmi.android.* {;}
-keep class *.R$ { *; }
-keepclasseswithmembernames class * {
native ;
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient ;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\cling-core-1.0.5.jar’
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\cling-support-1.0.5.jar’
-libraryjars ‘E:\eclipseworkspace\abc\airmusic-play\libs\teleal-common-1.0.13.jar’
-libraryjars ‘E:\eclipseworkspace\abc\com.android.airmusic.ui\libs\android-support-v4.jar’
-dontwarn com.sun.tools.**
-keep class com.sun.tools.* {;}
-dontwarn org.teleal.**
-keep class org.teleal.* {;}
-dontwarn android.support.v4.**
-keep class android.support.v4.* {;}
-keep class org.xmlpull.* {;}
-keep class org.kxml2.io.* {;}
相关文章推荐
- 混淆问题(常见问题汇总)
- Android:ViewPager扩展的具体解释——导航ViewPagerIndicator(有图片缓存,异步加载图片)
- Android RecyclerView 使用完全解析 体验艺术般的控件
- Android代码规范参考指南
- Android.mk--编译Android的模块
- Android使用fragment底部菜单栏
- Android:使用AsyncTask实现天气预报功能
- com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process
- (转)android 如何获取手机信息总结
- 阅读《Android 从入门到精通》(7)——图片按钮
- android调试各种bug
- 利用Android的UncaughtExceptionHandler捕获崩溃异常
- Android Studio 加载so文件
- Android中Socket通信,模拟了一个简单的CS聊天室
- 开发者必备的十八大Android开发资源
- Android EditText与第三方输入法删除键(退格键)冲突问题解决方案
- Android 使用动态加载框架DL进行插件化开发
- Android studio如何使用SVN进行版本控制?
- Android 开源项目PhotoView源码分析
- Android 安装apk代码