Java简单混淆代码Proguard介绍【一】
混淆代码,可以加大别人反编译的难度,从而最大化的保护自己的代码安全。
本章节,只介绍 最简单的proguard混淆代码。
场景:我写了一个发短信的程序,回调给游戏一个发短信是否成功的参数,如果成功,游戏就给用户加道具。本意:只想暴露给游戏 doPay()接口,但不想让别人知道我内部的代码及发送短信的内容,所以我就要混淆我的代码,只保留doPay()接口不被混淆~
工程目录结构:
PaymentForSms.java 中,有 doPay方法
public static void doPay(Context context,String uid,String productName,String productPrice,SmsResultCallback callback)
具体实现:
准备: Eclipse ,Ant包(网上随便一搜,一大堆,类似java jdk安装方法),android sdk自身带的 proguard.jar工具 + build.xml + progard.cfg
实现:
接下来,重点就是 build.xml 和 progard.cfg的编写了。。。代码中,有详细注释。如果不明白的,可以 百度一下,就非常清晰了...
build.xml
<?xml version="1.0"?>
<!-- 默认启动执行targetB -->
<project
name="targetPro"
default="targetB" >
<!-- 全局变量 -->
<!-- android-sdk 的路径 -->
<property
name="android-sdk"
value="D:\android-sdk-4.2" />
<!-- android-版本 2.2 -->
<property
name="android-jar"
value="${android-sdk}/platforms/android-8/android.jar" />
<!-- 任务组1 打印了一句话,没作用-->
<target name="targetA" >
<echo message="Java Version: ${parent.version}" />
</target>
<!-- 任务组 2 先检查targetA执行与否,如果没执行,则先执行targetA-->
<target
name="targetB"
depends="targetA"
unless="philander" >
<echo message="The base dir is: ${basedir}" />
<!-- 建立路径,放.class -->
<mkdir dir="E:/SDK_Test/build/classes" />
<!-- <mkdir dir="E:/SDK_SMS/build/gen" /> -->
<!-- 用到的Android编译库 android.jar -->
<path id="project.libs" >
<fileset dir="${android-sdk}/tools/support" >
<include name="*.jar" />
</fileset>
<!-- 可以写多个库 -->
</path>
<!-- 编译,用到了 android.jar -->
<javac
bootclasspath="${android-jar}"
destdir="E:/SDK_Test/build/classes"
encoding="GBK"
includeantruntime="on" >
<!-- 需要编译的.java文件路径 -->
<src path=".\src" />
<!-- 用到的编译jar包 如android.jar -->
<classpath refid="project.libs" />
</javac>
<!-- 打jar包 source_sdk.jar是未混淆的代码 -->
<jar
basedir="E:/SDK_Test/build/classes"
destfile="source_sdk.jar" >
</jar>
<echo>混淆代码 ... </echo>
<jar basedir="E:/SDK_Test/build/classes" destfile="temp.jar" /> <!-- temp.jar 为在根目录下 生成的,没混淆 jar包 -->
<java jar="D:\android-sdk-4.2\tools\proguard\lib\proguard.jar" fork="true" failonerror="true">
<jvmarg value="-Dmaximum.inlined.code.length=32" />
<arg value="@proguard.cfg"></arg>
</java>
<!-- 删除多余的 .class 和 jar包 -->
<delete dir="E:/SDK_SMS/build/classes"/>
<delete dir="E:/SDK_Test"/>
<delete file="temp.jar" />
<!-- 后续自己定义操作 -->
<!-- <delete file="temp.jar" />
<delete dir="E:/SDK_SMS/build/classes"/>
<mkdir dir="E:/SDK_SMS/build/classes"/>
<unzip src="optimized.jar" dest="E:/SDK_SMS/build/classes" />
<delete file="optimized.jar" />
<jar
basedir="E:/SDK_SMS/build/classes"
destfile="SDK.jar" >
</jar>
<delete dir="E:\SDK_SMS\build" /> -->
</target>
</project>
proguard.cfg
#jar包所在地址
-injars temp.jar
#jar包输出地址
-outjars proguard_sdk.jar
#引用的库的jar,用于解析injars所指定的jar类
-libraryjars D:/android-sdk-4.2/tools/support/annotations.jar
-libraryjars libs/android-support-v4.jar
-libraryjars D:/android-sdk-4.2/platforms/android-8/android.jar
-optimizationpasses 7
#混淆时不会产生形形色色的类名
-dontusemixedcaseclassnames
#指定不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
-verbose
-dontoptimize
#不预校验
-dontpreverify
#优化
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#检查引用是否正确,如果在-libraryjars中定义了,无需在次声明
-dontwarn android.net.http.**
#取消打印日志
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
}
#不需要混淆的类 1、暴露的接口 2、自定义的Callback 3、用到第三方库的时候
-keep public class com.rekoo.listener.SmsResultCallback {*;}
-keep public class com.rekoo.single.sms.PaymentForSms {*;}
-printmapping proguard.map
混淆代码,就比较简单了~ build.xml右键-Run as - Ant build
刷新工程,工程目录下面,就生成了 proguard_sdk.jar 混淆jar包了。。打开看一下,就ok了。。。如有问题,请留言