首页 > 代码库 > Proguard混淆代码(1)

Proguard混淆代码(1)

【意义】混淆代码,可以加大别人反编译的难度,从而最大化的保护自己的代码安全。

【场景】我写了一个发短信的程序,回调给游戏一个发短信是否成功的参数,如果成功,游戏就给用户加道具。本意:只想暴露给游戏 doPay()接口,但不想让别人知道我内部的代码及发送短信的内容,所以我就要混淆我的代码,只保留doPay()接口不被混淆~

工程目录结构:

1 分析:

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

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="http://m.cnblogs.com/160574/optimized.jar" rel="nofollow"/>        <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了。。。如有问题,请留言

 

Proguard混淆代码(1)