在实际的开发成产品apk的发布过程中,我们经常会使用到代码混淆技术。不过在讲解如何进行代码混淆之前,我先跟大家演示一下反编译的过程,这样才能让大家明白为什么需要进行代码混淆。
一、代码反编译
2.获取CodeMixTest.apk中的classes.dex文件
将CodeMixTest.apk解压,这里我们为了方便就直接解压到当前文件夹下。在解压出的文件中,我们可以看见有一个classes.dex文件,这就是我们的源代码打包生成的文件。
dex2jar工具的作用就是将class.dex文件还原成.jar文件。先将dex2jar-0.0.9.15.zip解压,然后将上面获得的classes.dex文件拷贝至解压的目录中。
启动cmd,进入到dex2jar工具解压的目录中,运行命令:dex2jar.bat
classes.dex,有如下结果。
查看dex2jar工具解压的目录中,生成了我们想要得到的classes_dex2jar.jar文件。
将jd-gui-0.3.5.windows.zip工具解压,为了方便我们直接解压到当前文件夹,我们会看见一个jd-gui.exe文件。
双击jd-gui.exe,使用工具打开前面我们获得的classes_dex2jar.jar文件。可以清楚的看见源代码。
是企业真实的项目中,如果不经过代码混淆,你的源码就如此赤裸裸的暴露着。这样对于公司来说是非常不安全的,并且不想发生的情况。既然我们已经看见了反编译如此的威力,那么我们有什么办法可以解决这个问题呢?看下面讲解。
二、代码混淆
首先,我们得将我们的项目源码、proguard工具(放心这个工具Google已经在sdk中为我们提供了,在sdk\tools目录下可以看到)、proguard.cfg文件(该文件定义了混淆的规则,创建2.3以上项目自动生成,或者在网上可以很容易下载到)。
该文件Google公司已经为我们准备好了,创建项目时,在项目的根目录下就有了,但是是从2.3开始的。不过我们基于2.2的项目只需要将该文件拷贝到项目根目录下即可。
3.修改项目的default.properties配置文件
Android项目默认在打包的时候是不混淆代码的,所以我们必须得在default.properties文件中,添加该配置:proguard.config=proguard.cfg。
好了,一切就绪,接下来我们就按着平常的打包步骤,进行打包操作。打完包后,我们使用上面讲述的反编译方法,查看现在的jar文件。
会发现,混淆了许多aa、bb、cc的包、aa、bb、cc的类和方法,这样的代码根本无法阅读,也就达到了我们保护源代码的目的了。
三、produard.cfg文件
我们在看看produard.cfg文件,该文件中描述了混淆代码的规则,你如果想根据自己的需求来混淆代码,就可以在本文件中编写你的混淆规则。一般情况下,该文件的内容如下:
-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 * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
//保护指定的类和类的成员的名称,如果所有指定的类成员出席
-keepclasseswithmembernames class * {
native <methods>;
}
//保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(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 *;
}
四、可能出现的问题
1.因为使用了升级后使用android-support-v4而发生混淆错误,无法打包出现如下错误:
Unexpectederrorwhileevaluatinginstruction:
Class=[android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl]
Method=[newAccessiblityDelegateBridge(Landroid/support/v4/view/AccessibilityDelegateCompat;)Ljava/lang/Object;]Instruction=[18]areturn
Exception=1(Can'tfindanysuperclassesof[android/support/v4/view/AccessibilityDelegateCompatIcs$1](notevenimmediatesuperclass[android/view/View$AccessibilityDelegate]))
Unexpectederrorwhileperformingpartialevaluation: Class=[android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl]
Method=[newAccessiblityDelegateBridge(Landroid/support/v4/view/AccessibilityDelegateCompat;)Ljava/lang/Object;]
Exception=1(Can'tfindanysuperclassesof[android/support/v4/view/AccessibilityDelegateCompatIcs$1](notevenimmediatesuperclass[android/view/View$AccessibilityDelegate]))
java.lang.IllegalArgumentException:Can'tfindanysuperclassesof[android/support/v4/view/AccessibilityDelegateCompatIcs$1](notevenimmediatesuperclass[android/view/View$AccessibilityDelegate])
atproguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:287)
你需要在proguard.cfg文件中添加如下代码:
-libraryjarslibs/android-support-v4.jar
-dontwarnandroid.support.v4.**
-keepclassandroid.support.v4.**{*;}
-keepinterfaceandroid.support.v4.app.**{*;}
-keeppublicclass*extendsandroid.support.v4.**
-keeppublicclass*extendsandroid.app.Fragment
2.如果你使用了第三方的包,你需要使用一下配置,让ProGuard知道库中的一些类并不是在所有的API中可用:
-libraryjars
libs/roboguice-2.0.jar
Proguardreturned
with error code 1. See console
[2012-09-25
09:50:39 - estore3601] Error: @C:\Users\hp\AppData\Local\Temp\android_5192919586673521494.pro (文件名、目录名或卷标语法不正确。)
你需要系在ProGuard最新版本,如v4.8。然后解压produard4.8.zip文件,将bin和lib两个文件夹覆盖sdk目录\tool\proguard目录中同名的文件夹。
分享到:
相关推荐
Android Java代码混淆工具:ProGuard简介及使用.docx
基于springboot搭建一个简单案例,利用proguard插件实现代码混淆,增加源代码的阅读和理解的难度, 并不能百分百保证代码安全。常用的应用场景是项目需要部署到客户机器上,一定程度上防止代码泄露。 ProGuard 是一个...
proguard5.2.1java代码混淆工具,混淆文档参照 http://download.csdn.net/detail/zysap/9684388
基于SpringBoot+Maven多模块工程利用proguard组件实现代码混淆的代码demo,代码清晰完整,导入idea或eclipse即可运行。 使用 proguard 混淆代码只能增加阅读和理解的难度, 并不能百分百保证代码安全。常用的应用...
其中包括第三方jar混淆报错及解决办法,以及普通的代码混淆办法,相信能给你帮助
java代码混淆器proGuard,可以混淆函数变量、类、方法名以实现代码加密
它可以混淆Android项目里面的java代码,对的,你没看错,仅仅是java代码。它是无法混淆Native代码,资源文件drawable、xml等。 ProGuard作用 压缩: 移除无效的类、属性、方法等 优化: 优化字节码,并删除未使用的...
新写的proguard代码混淆的文档 大家可以看看
实现maven管理的Javaweb项目的proguard代码混淆功能、工具包下载及错误解决
介绍了Android代码混淆的三种方法及可能出现的问题.通过jocky或proguard实现jar包混淆;通过proguard实现Android项目整体导出混淆。并总结了一些容易出现的问题
自己写的proguard4.7代码混淆器使用详细说明,之前在网上找了一大堆都还是不会用,或不全,研究了一天,终于达到自己想要的结果,在此总结下,写成文档,一边以后需要,也供大家学习学习,工具包就不上传了,网上一...
防护说明 易于使用的内联@Keep注释保持类。 且易于安装。 用法 @Keep @KeepClassMembers public class KeepMe { ...$ unzip proguard-annotations-app-release-unsigned.apk $ dex2jar classes.dex $ unzip class
Android 2_3 代码混淆proguard技术介绍 - Zy的技术心
proguard-project.txt 解决Gson引入而混淆不能通讯问题
android proguard5.3.3混淆包 替换Jar包以后使 混淆的类名方法名变成空白 使用方法 直接 替换 5.3.3版本的 混淆jar包 Mac 路径为 Contents/gradle/m2repository/net/sf/proguard/proguard-base Win gradle/m2...
proguard是一个java代码混淆工具,并提供了图形化用户界面,它也可以结合Ant或J2ME Wireless Toolkit使用。通过ProGuard得到的更精简的jar文件意味着只需要更小的存储空间混淆环节会用无意义的短变量去重命名类、...
java代码混淆工具 简单使用docx 字典文件 生成的配置示例
J2EE-web工程ProGuard代码混淆
proguard4.11.zip 代码混淆