zoukankan      html  css  js  c++  java
  • 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	oolsproguardlibproguard.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_SMSuild" /> -->
        </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了。。。如有问题,请留言

  • 相关阅读:
    【Hadoop】MapReduce练习:多job关联实现倒排索引
    【Hadoop】MapReduce练习:分科目等级并按分区统计学生以及人数
    【Zookeeper】利用zookeeper搭建Hdoop HA高可用
    【Linux】部署NTP时间同步服务器
    VSCode前端文件以服务器模式打开
    移动端公共方法封装
    常用浏览器及内核
    XHTML和HTML的区别
    javascript算法
    计算属性和侦听器
  • 原文地址:https://www.cnblogs.com/codeAnimal/p/4104321.html
Copyright © 2011-2022 走看看