1、proguard原理
java代码编译成二进制class文件,这个class文件也可以反编译成源代码,除了注释外,其他的code基本都可以看到。为了防止重要code被泄露,我们往往需要混淆,即把方法名,变量名,类名,包名等这些java元素的名称改成让人意想不到的名称,这样代码结构就没有变化,还可以运行,但是想弄懂代码的架构却很难。proguard就起到了这样的作用:
一、它可以分析一组class的结构,根据用户的配置,然后把这些class文件中可以混淆的java元素进行混淆
二、删除无效的代码
三、对代码进行优化(使用adt插件导出的apk,还进行zipalign优化)
缺省情况下,proguard会混淆所有代码,但是下面几种情况是不能改变java元素的名称,否则就会导致程序出错。
一、用到反射的地方(android中的api常用@hide注释掉,开发者在调用相应的方法时,需要用到反射)
二、当app的代码要依赖于系统的接口时,如被系统代码调用的回调方法,这种方法比较复杂
三、java元素名称是配置文件中配置好的
所以在使用proguard时,我们需要有个配置文件告诉proguard,哪些java元素是不能混淆的。
2、proguard配置
-dontwarn缺省proguard会检查每一个引用是否正确,但是第三方库里往往有些不会用到的类,没有正确引用,如果不配置的话,系统就会报错。
-keep指定的类和类成员被保留作为入口
-keepclassmembes指定的类成员被保留。
-keepclasswithmembers指定的类和类成员被保留,假如指定的类成员存在的话。
3、 proguard问题和风险
代码混淆后虽然有混淆优化的好处,但是它往往也会带来如下的几点问题:
一、混淆错误,用第三方库的时候,必须要告诉proguard不要检查,否则proguard无法报错。
二、运行错误,当code不能混淆的时候,我们必须要正确配置,否则app在运行的时候会出错。
三、调试苦难,出错了,错误堆栈是混淆后的代码,自己也看不懂了。
4、 常见的不能混淆的android code
一、android系统组件,系统组件有固定的方法被app调用。
二、被android resource文件引用到的,名字已经固定,也不能混淆,比如自定义的View。
三、android parcelable,需要使用android序列化。
四、其他android官方建议不混淆的,如:android.app.backup.BackupAngentHelper,android.preference.Preference,com.android.vending.licensing.ILicensingService
五、java序列化方法,系统序列化需要固定的方法
六、本地方法,不能修改本地方法名
七、annotations注释
八、数据库驱动
九、有些resource文件
十、用到反射的地方
总结:Android的四大组件,第三方jar包不能混淆
5、如何测试一个apk的代码是否被混淆过
方案一:
一、 下载dex2jar包,解压
二、把apk包的后缀名改为.zip
三、把apk压解压拿到classes.dex文件,并放到dex2jar所在的目录下
四、运行命令dex2jar.exe classes.dex
五、下载jd-gui
六、把jar包加载到jd.gui,查看源码,源码中的类名,方法名,变量名是否已经改变
方法二:
一、下载apktool工具
二、运行apktool.bat d xxx.apk,把apk反编译成smali
三、如果想要进一步查看源码,可下载smali2java
四、使用smali文件的文件名进行分析,如果存在1个或1个以上的资源类的smali文件,就可以证明该apk没有被混淆过。如下图所示:
备注:是apk的核心代码下的资源文件在混淆后不应该出现上述文件,反之则说明该apk没有进行混淆;使用方案一也是要进入核心代码
6、作为一个测试不仅检测自己的apk是否被混淆过,而且要测试是否混淆成功,且混淆正确
1、安装被混淆过的apk,进行功能测试
2、查看混淆好的系统,是否仍保留:Android系统组件,自定义View,Android Parcelable,Android R文件等不能被混淆的文件
相关推荐
本文将深入探讨Android代码混淆的前因后果、原理以及如何实施。 首先,我们来理解什么是代码混淆。代码混淆是将源代码转换成一种难以理解和阅读的形式,通常通过重命名变量、方法和类名,以及压缩和优化代码结构来...
在Android开发过程中,为了保护源代码不被轻易反编译以及减少APK包的体积,通常会采用代码混淆技术。本文将详细介绍如何进行Android项目的代码混淆,并结合给定的配置文件内容,深入解析各项设置的作用。 #### 1. ...
本篇文章将深入探讨Android代码混淆配置的细节,帮助开发者理解如何有效地使用这一技术。 混淆是通过重命名类、方法和变量,使得原始代码变得难以理解的过程。在Android中,我们通常使用ProGuard工具进行代码混淆,...
总之,防止Android应用被反编译是一个综合性的任务,需要结合多种技术手段,如代码混淆、权限控制、加密和反逆向框架等。开发者应根据应用的具体需求和安全级别选择合适的防护策略,确保代码的安全。在实践中,不断...
3.支持DEX代码混淆,可以针对APK字节码进行多种混淆,字符串加密,指令乱序等功能 4.支持资源混淆,可以对APK包内部的资源文件进行混淆处理 5.支持增加包体积,可以随意增加APK包的体积 6.处理后的APK可以有效保护...
本文将详细探讨Android代码混淆的原理及其实践方法。 #### 二、代码混淆的目的 1. **保护知识产权**:通过混淆处理后的代码很难被逆向工程,这有助于保护开发者的核心算法和逻辑不被盗用。 2. **减小APK大小**:...
在Android应用开发中,安全是至关重要的一个环节。APK混淆工具正是为了增强APK的安全性而设计的,它的主要作用是将APK文件中的代码和资源进行混淆和加密,以此来防止恶意用户进行反编译,窥探或篡改应用的内部逻辑。...
因此,了解并掌握Android的反编译和代码混淆技术对于保护应用的知识产权和用户数据至关重要。 **一、Android反编译** 1. ** Dex2Jar 和 JD-GUI**: Dex2Jar是一个将.dex文件转换为.jar文件的工具,而JD-GUI则是一个...
Android Studio是一款广泛使用的Android应用程序开发集成环境,而代码混淆是其中的一个重要环节,尤其是在发布应用时,为了提高代码的安全性和减少体积,通常会使用到Proguard工具。AndroidProguard插件则是为...
"Android代码混淆及签名" Android 代码混淆是指对 Android 应用程序的源代码进行混淆处理,以防止别人反编译和盗取源代码。代码混淆可以使得反编译变得困难,但是不能完全阻止反编译。 Android 代码混淆可以通过...
在这个“android ndk+代码混淆demo”中,开发者提供了一个实际的项目,展示了如何结合Android NDK和代码混淆技术来创建一个应用。通过这个Demo,学习者可以了解如何在Android项目中集成NDK,以及如何配置和使用...
AndroidAPK及JAR包的代码混淆.pdf
Android 代码混淆是指在将 Java 代码编译为.class 文件或将.apk 文件签名时,对代码进行混淆处理,以保护代码的安全性和知识产权。下面将介绍三种常见的 Android 代码混淆方法。 一、使用 jocky 工具进行混淆 ...
ProGuard 是一款广泛应用于 Android 开发中的代码混淆工具,它能够通过删除未使用的类、字段、方法等,从而缩小 APK 的体积,并提高应用运行速度。此外,ProGuard 还能为类、字段、方法等命名,使得反编译后的代码...
Android 代码混淆写法总结 Android 代码混淆是指在...Android 代码混淆是一种非常重要的安全机制,可以保护代码的安全和 prevents 反编译。但是,需要在开发中进行合理的混淆设置和优化,以确保代码的安全和执行效率。
在Android应用开发中,APK混淆是一个常见的优化和安全措施,主要是为了保护代码不被轻易逆向工程解析,以及减小APK体积。本篇文章将深入探讨“Android APK再混淆”,特别是针对`resources.arsc`文件中的字符串混淆,...
iyge大神分享的资源可能包含一个名为`APKProtect.exe`的工具,它可能是用于签名、加密或混淆APK的实用程序。这个工具可能集成了上述的签名、加密和混淆功能,为开发者提供了一站式的APK安全增强解决方案。而`bin`...
Android APK和导出JAR包的代码混淆,自己实践的结果 ,很详细
在Android开发中,“安卓apk加壳工程”是一个常见的术语,指的是通过在原始APK(Android应用程序包)外部添加一层或多层包装,以实现特定功能或保护应用原代码的技术。这通常涉及到动态加载、代码混淆、反编译防御等...
首先,我们来了解一下**Proguard**,它是Android开发中的一个静态代码分析工具,主要用于优化、压缩、混淆和预览APK。Proguard的主要作用有以下几点: 1. **代码优化**:通过删除未使用的类、方法和字段,以及优化...