Android基础--App代码混淆
2016-07-06 11:43
597 查看
Android基础--App代码混淆
操作步骤:
1、打开混淆器:找到项目根目录下的project.properties文件,将“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”这行前的“#”删除即可; 如果你不小心删掉了这个文件,没关系,从其他地方拷贝一个过来
2、修改混淆配置文件:找到项目根目录下的proguard-project.txt文件,修改其中代码,这部分是最关键;
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-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 com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
这里是 google默认 不混淆 Activity 、Service ... 类的 子类, 正如上面的截图中看到的 所有 activity 的子类 名称是被保留的。
3. 举个例子
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
-dontobfuscate
-dontoptimize
2、在 proguard.cfg中添加
[java] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
3、类型转换错误
-keepattributes Signature
4、空指针异常
混淆过滤掉相关类与方法
5、安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法,安卓反编译
此前的代码混淆,因为并没有用到反射,所以常规的代码混淆方式一遍就能通过,而此项目中某些类利用到了反射机制(本人的这个项目中有即时通讯功能,所以有表情类资源,因此需要通过反射由文件名找到表情资源id),当由文件名去寻找资源id时就报空指针异常了,期初我并不知道什么原因,通过反编译已经混淆的apk,一步一步寻找到出错的地方,才恍然大悟,正是反射那一步出现了问题:Field field = R.drawable.class.getDeclaredField(name);走到这一步就挂了,程序直接崩溃。
解决办法:
1.在proguard.cfg文件中,将反射用到的类中的变量不被混淆:
如:-keep public class com.byl.bean.Expressions { *; },表示Expressions 这个类及类中的所有变量及方法不被混淆,注意要写全路径;
2.过滤泛型:-keepattributes Signature
3.最重要的一点:保持R文件不被混淆,否则,你的反射是获取不到资源id的:-keep class **.R$* {*;}
补充一下:上个问题解决后,接下来又遇到了一个问题就是混淆后,地图无法正常使用了,博主使用的是百度地图,在proguard.cfg也已经写明了:
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
6、android.provider.Settings$Global
# Project target.
target=android-19
7、java.lang.reflect.UndeclaredThrowableException
-keep interface com.dev.impl.**
8、内存溢出和无法写入堆栈
javaOptions in proguard := Seq(...)
or
javaOptions in (Proguard, proguard) := Seq(...)
9、Error: Unable to access jarfile ..\lib\proguard.jar
路径问题
10、java.lang.NoSuchMethodError
没有相关方法,方法被混淆了,混淆过滤掉相关方法便可。
11、专业网站bug解决方法
http://proguard.sourceforge.net/index.html#manual/troubleshooting.html
操作步骤:
1、打开混淆器:找到项目根目录下的project.properties文件,将“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”这行前的“#”删除即可; 如果你不小心删掉了这个文件,没关系,从其他地方拷贝一个过来
2、修改混淆配置文件:找到项目根目录下的proguard-project.txt文件,修改其中代码,这部分是最关键;
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-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 com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
这里是 google默认 不混淆 Activity 、Service ... 类的 子类, 正如上面的截图中看到的 所有 activity 的子类 名称是被保留的。
3. 举个例子
![](https://code.csdn.net/assets/CODE_ico.png)
-dontobfuscate
-dontoptimize
2、在 proguard.cfg中添加
[java] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
3、类型转换错误
-keepattributes Signature
4、空指针异常
混淆过滤掉相关类与方法
5、安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法,安卓反编译
此前的代码混淆,因为并没有用到反射,所以常规的代码混淆方式一遍就能通过,而此项目中某些类利用到了反射机制(本人的这个项目中有即时通讯功能,所以有表情类资源,因此需要通过反射由文件名找到表情资源id),当由文件名去寻找资源id时就报空指针异常了,期初我并不知道什么原因,通过反编译已经混淆的apk,一步一步寻找到出错的地方,才恍然大悟,正是反射那一步出现了问题:Field field = R.drawable.class.getDeclaredField(name);走到这一步就挂了,程序直接崩溃。
解决办法:
1.在proguard.cfg文件中,将反射用到的类中的变量不被混淆:
如:-keep public class com.byl.bean.Expressions { *; },表示Expressions 这个类及类中的所有变量及方法不被混淆,注意要写全路径;
2.过滤泛型:-keepattributes Signature
3.最重要的一点:保持R文件不被混淆,否则,你的反射是获取不到资源id的:-keep class **.R$* {*;}
补充一下:上个问题解决后,接下来又遇到了一个问题就是混淆后,地图无法正常使用了,博主使用的是百度地图,在proguard.cfg也已经写明了:
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
6、android.provider.Settings$Global
# Project target.
target=android-19
7、java.lang.reflect.UndeclaredThrowableException
-keep interface com.dev.impl.**
8、内存溢出和无法写入堆栈
javaOptions in proguard := Seq(...)
or
javaOptions in (Proguard, proguard) := Seq(...)
9、Error: Unable to access jarfile ..\lib\proguard.jar
路径问题
10、java.lang.NoSuchMethodError
没有相关方法,方法被混淆了,混淆过滤掉相关方法便可。
11、专业网站bug解决方法
http://proguard.sourceforge.net/index.html#manual/troubleshooting.html
相关文章推荐
- 如何反编译D-Link路由器固件程序并发现它的后门
- 常见电子书格式及其反编译思路分析第1/3页
- .Net下的签名与混淆图文分析
- .dll 文件反编译的工具软件集合
- 使用android-apktool来逆向(反编译)APK包方法介绍
- Android开发apk反编译和二次打包教程
- Android反编译看看手Q口令红包的实现原理
- Android反编译代码和防止反编译
- Android编程之防止反编译的实现方法
- 破解.net程序(dll文件)编译和反编译方法
- 使用SNK密钥文件保护你的DLL和代码不被反编译教程
- Android studio 使用心得(四)---android studio 多渠道打包
- ubuntu下使用反编译apk,
- Ant编译android,并Proguard代码混淆,v4混淆配置
- Android APK反编译就这么简单 详解(附图)
- Android如何防止apk程序被反编译
- Android 混淆代码总结
- 反编译 APK
- 混淆 泛型 反射
- Cannot run program "jad"解决方法