很久没有更新了,最近做了个小功能,想把代码打成 .jar文件给别人引用。除了基本的调用方法,其余核心代码都经过混淆打包。用到了ant+proguard,这里记录一下。
ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。常常用于Android开发用于混淆最终的项目,增加项目被反编译的难度。android的sdk中已经有此工具,在sdk\tools\proguard\lib\proguardgui.jar,打包是可以直接用此工具混淆,只是流程比较复杂,需要手动更改其中的配置。如图:
Ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。跨平台性。Ant是纯Java语言编写的,所以具有很好的跨平台性。操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。 Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件 是XML格式的文件,所以很容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
安装和配置环境变量
到官方主页http://ant.apache.org下载新版的ant,得到的是一个apache-ant-bin.zip的压缩包。将其解压到你的硬盘上。
window中设置ant环境变量:
ANT_HOME C:/ apache-ant-1.8.1
path C:/ apache-ant-1.8.1/bin
classpath C:/apache-ant-1.8.1/lib
测试是否配置成功
ant执行需要一个build文件,此次项目用到的build文件配置
-
<?xml version="1.0" encoding="UTF-8"?>
-
<project
-
name="ProjectName"
-
basedir="."
-
default="optimize_class" >
-
-
<!-- 设置全局属性 -->
-
<property file="project.properties" />
-
-
<property environment="env" />
-
<property name="encode" value="utf-8"/>
-
<property name="debug" value="false"/>
-
<property name="includeAntRuntime" value="false"/>
-
<property name="target_version" value="1.7"/>
-
<property name="src_dir" value="${basedir}\src"/>
-
-
<!--
-
========================================
-
工程构建目录
-
========================================
-
-->
-
<property name="build_dir" value="${basedir}\build" />
-
<property name="java_build_dir" value="${build_dir}\java" />
-
<property name="class_build_dir" value="${build_dir}\class" />
-
<property name="jar_build_dir" value="${build_dir}\jar"/>
-
<property name="unOptimize_jar_build_dir" value="${jar_build_dir}\unOptimize.jar"/>
-
<!--
-
========================================
-
构建完成文件
-
========================================
-
-->
-
<property name="release_jar_dir" value="${basedir}\${releaseJar}"/>
-
-
-
-
<!-- 声明第三方依赖的jar -->
-
<path id="dependencies">
-
<fileset dir="${basedir}\libs">
-
<include name="**/*.jar" />
-
</fileset>
-
</path>
-
-
<!-- 引入Android依赖 -->
-
<property
-
name="lib.android"
-
value="${sdk.dir}\platforms\${target}\android.jar" />
-
-
<!-- 引入混淆依赖 -->
-
<property
-
name="lib.proguard"
-
value="E:\adt-bundle-windows-x86_64-20140702\sdk\tools\proguard\lib\proguard.jar" />
-
<!-- dx命令(当前系统为windows,如果系统为linux,可将.bat文件替换成相对应的命令) -->
-
<property
-
name="dx"
-
value="${sdk.dir}\build-tools\24.0.1\dx.bat" />
-
-
-
<!-- 拆分java文件-->
-
<target name="init">
-
<mkdir dir="${build_dir}" />
-
<mkdir dir="${java_build_dir}" />
-
<mkdir dir="${class_build_dir}" />
-
<mkdir dir="${jar_build_dir}" />
-
</target>
-
-
<!-- 拆分java文件 -->
-
<target name="separate_java" depends="init">
-
<copy todir="${java_build_dir}" >
-
<fileset dir="${src_dir}" >
-
<include name="com/project/package/*.java" />
-
</fileset>
-
</copy>
-
</target>
-
-
<!-- 编译java文件 -->
-
<target name="compile_java" depends="separate_java" >
-
<javac
-
bootclasspath="${lib.android}"
-
debug="${debug}"
-
destdir="${class_build_dir}"
-
encoding="${encode}"
-
includeAntRuntime="${includeAntRuntime}"
-
srcdir="${java_build_dir}"
-
target="${target_version}">
-
<classpath refid="dependencies" />
-
</javac>
-
</target>
-
-
<!-- 混淆class文件 -->
-
<target
-
name="optimize_class"
-
depends="compile_java" >
-
<!-- class文件生成jar包 -->
-
<jar destfile="${unOptimize_jar_build_dir}" >
-
<fileset
-
dir="${class_build_dir}"
-
includes="**/*.class" />
-
</jar>
-
<!-- jar包进行混淆 -->
-
<java
-
failonerror="true"
-
fork="true"
-
jar="${lib.proguard}" >
-
<jvmarg value="-Dmaximum.inlined.code.length=32" />
-
<arg value="-injars ${unOptimize_jar_build_dir}"/>
-
<arg value="-outjars ${release_jar_dir}"/>
-
<arg value="-libraryjars ${lib.android}"/>
-
-
<arg value="-dontpreverify"/>
-
<arg value="-dontoptimize"/>
-
<arg value="-dontusemixedcaseclassnames"/>
-
<arg value="-allowaccessmodification"/>
-
<arg value="-optimizationpasses 7"/>
-
<arg value="-verbose"/>
-
<arg value="-dontskipnonpubliclibraryclasses"/>
-
<arg value="-dontskipnonpubliclibraryclassmembers"/>
-
<arg value="@${proguard.cfg}"/>
-
</java>
-
<!-- 删除构建目录 -->
-
<delete dir="${build_dir}"/>
-
</target>
-
</project>
常用基本配置不用管,注意其中几个地方:
1. <property file="project.properties" /> 指定文件,设置全局属性
2.<property name="encode" value="utf-8"/> 项目的编码格式
3.<property name="target_version" value="1.7"/> java的jdk版本
4. <include name="com/project/package/*.java" /> 需要混淆的java类,这里是将package包下面的所有类都混淆,可以根据自己的项目结构更改此处。
build.xml常用标签说明:
-
# This file is automatically generated by Android Tools.
-
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-
#
-
# This file must be checked in Version Control Systems.
-
#
-
# To customize properties used by the Ant build system edit
-
# "ant.properties", and override values to adapt the script to your
-
# project structure.
-
#
-
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-
# Project target.
-
sdk.dir=E:\\adt-bundle-windows-x86_64-20140702\\sdk
-
target=android-17
-
android.library=false
-
proguard.cfg=proguard.cfg
-
releaseJar=output.jar
-
-optimizationpasses 5
-
-dontusemixedcaseclassnames
-
-dontskipnonpubliclibraryclasses
-
-dontpreverify
-
-dontwarn
-
-dontnote
-
-verbose
-
-
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-
-
-dump proguard/class_files.txt
-
-printseeds proguard/seeds.txt
-
-printusage proguard/unused.txt
-
-printmapping proguard/mapping.txt
-
-
-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
-
-
-keep public class com.gn.qiaw.mn.Entry {
-
public static <methods>;
-
}
-
-
-keep public class com.gn.qiaw.mn.PayCallBack {
-
public <methods>;
-
}
-
-
-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 *;
-
}
最后,添加proguard文件夹,拷入需要引用的文件proguard.jar,proguardgui.jar,retrace.jar
-
-keep public class com.gn.qiaw.mn.Entry {
-
public static <methods>;
-
}
-
-keep public class com.gn.qiaw.mn.PayCallBack {
-
public <methods>;
-
}
-
Dx unsupported class file version 52.0
-
Conversion to Dalvik format failed with error 1
-