您的位置:首页 > 编程语言 > Java开发

Eclipse集成Ant 打包签名APK和打混淆jar

2017-03-22 18:35 477 查看
Ant的下载地址请戳这里

Ant的环境变量配置和jdk的配置是一样的。最好也把sdk的环境变量也配置一下。

Eclipse的工程目录如下图:



buildapp.properties

# This is an config file used to replace variable in buildapp.xml
# Note: Use the '\\' instead of '\'
# Note: -ospath   absolute path

# this name of release app
appName = MobileClient

# this name of android sdk path
sdk-folder = ${env.ANDROID_SDK_HOME}

# ths name of java jdk path
java-home = ${env.JAVA_HOME}

# this name of android sdk platform path
sdk-platform-folder = ${sdk-folder}\\platforms\\android-8

# this name of android sdk tools path
sdk-tools-folder = ${sdk-folder}\\tools

# this name of android sdk platform-tools paht
sdk-platform-tools-folder = ${sdk-folder}\\platform-tools

# complier must contain this jar
android-jar = ${sdk-platform-folder}/android.jar

# Here is the build tool
aapt-exe = ${sdk-platform-tools-folder}\\aapt.exe
aidl-exe = ${sdk-platform-tools-folder}\\aidl.exe
dx-bat = ${sdk-platform-tools-folder}\\dx.bat
apkbuilder-bat = ${sdk-tools-folder}\\apkbuilder.bat
jarsigner-exe = ${java-home}\\bin\\jarsigner.exe
zipalign-exe = ${sdk-tools-folder}\\zipalign.exe

# this name of proguard home path
proguard-home = ${sdk-tools-folder}\\proguard

# this name of use proguard's jar
proguard-jar = ${proguard-home}\\lib\\proguard.jar

#this name of proguard.cfg path
proguard-cfg = ${basedir}\\proguard.cfg

# aidl file required to compile the framework.aidl file
framework-aidl = ${sdk-platform-folder}\\framework.aidl

# javac memory size
javac-forkOn-memoryinitialsize = 256m
javac-forkOn-memoryMaximumSize = 256m

# apk version
version = 2

# this name is compile file path
compile-bin-name = bin-compile
compile-bin-ospath = ${basedir}\\${compile-bin-name}

# this name is classes.dex file output path
dex-file-name = classes.dex
dex-ospath = ${compile-bin-ospath}\\${dex-file-name}

# this name is aapt generation resources package
resources-package-name = resources.ap_
resources-package-ospath = ${compile-bin-ospath}\\${resources-package-name}

# this name is output unsigned-apk path
unsigned-apk-name = ${appName}-unsigned.apk
unsigned-apk-ospath = ${compile-bin-ospath}\\${unsigned-apk-name}

#this name is output singed-apk path
signed-apk-name = ${appName}-unaligned.apk
signed-apk-ospath = ${compile-bin-ospath}\\${signed-apk-name}

#this name is output zipalign-apk path
aligned-apk-name = ${appName}.apk
aligned-apk-ospath = ${compile-bin-ospath}\\${aligned-apk-name}

# this name is keystore-file path
keystore-file-ospath = ${basedir}\\8M.keystore

# this name is storepass key
storepass-key = abc1234

# thsi name is keypass key
keypass-key = abc1234
buildapp.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="MobileClient_build" default="release">
<!-- 必须放在最前面,可以确保能使用到编译平台的环境变量 -->
<property environment="env" />

<!-- 使用第三方的ant包,使ant支持for循环-->
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${env.ANT_HOME}/lib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>

<!-- 引入属性文件 -->
<property file="buildapp.properties"></property>

<!-- 清单文件  相对路径-->
<property name="manifest-xml" value="AndroidManifest.xml" />

<!-- 项目资源文件目录  相对路径-->
<property name="resource-dir" value="res" />

<!-- 项目assets目录 相对路径-->
<property name="asset-dir" value="assets" />

<!-- java源文件目录  相对路径-->
<property name="srcdir"  value ="src" />
<!-- java源文件目录  绝对路径-->
<property name="srcdir-ospath" value="${basedir}\${srcdir}" />

<!-- 外部类库所在目录 相对路径-->
<property name="external-lib" value="libs" />
<!-- 外部类库所在目录 绝对路径-->
<property name="external-lib-ospath" value="${basedir}\${external-lib}" />

<!-- 初始化工作 -->
<target name="init">
<echo>...开始进行目录初始化...</echo>
<!-- 生成R文件的相对目录 -->
<var name="outdir-gen" value="gen" />
<delete dir="${compile-bin-ospath}" />
<mkdir dir="${compile-bin-ospath}" />
<echo>...目录初始化结束...</echo>
</target>

<target name="testOut">
<echo>${env.JAVA_HOME}</echo>
<echo>${env.ANT_HOME}</echo>
<echo>${basedir}</echo>
</target>

<!-- 根据工程中的资源文件生成R.java文件  -->
<target name="gen-R" depends="init">
<echo>...开始生成R.java文件...</echo>
<exec executable="${aapt-exe}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-gen}" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-M" />
<arg value="${manifest-xml}" />
<arg value="-I" />
<arg value="${android-jar}" />
</exec>
<echo>...生成R.java文件结束...</echo>
</target>

<!-- 编译aidl文件 -->
<target name="aidl-exe" depends="gen-R">
<echo>...开始编译aidl文件...</echo>
<apply executable="${aidl-exe}" failonerror="true">
<!-- 指定预处理文件 -->
<arg value="-p${framework-aidl}" />
<!-- aidl声明的目录 -->
<arg value="-I${srcdir}" />
<!-- 目标文件目录 -->
<arg value="-o${outdir-gen}" />
<!-- 指定哪些文件需要编译 -->
<fileset dir="${srcdir}">
<include name="**/*.aidl" />
</fileset>
</apply>
<echo>...编译aidl文件结束...</echo>
</target>

<!-- 将工程中的java源文件编译成class文件 -->
<target name="compile" depends="aidl-exe">
<echo>...开始java源文件编译成class文件....</echo>
<javac
encoding="utf-8"
source="1.6"
target="1.6"
srcdir="."
deprecation="on"
destdir="${compile-bin-ospath}"
bootclasspath="${android-jar}"
verbose="false"
debug="true"
fork="on"
memoryinitialsize="${javac-forkOn-memoryinitialsize}"
memorymaximumsize="${javac-forkOn-memoryMaximumSize}"
compiler="org.eclipse.jdt.core.JDTCompilerAdapter">

<compilerarg line="-Xlint:unchecked" />
<compilerarg line="-encoding utf-8 " />

<classpath>
<fileset dir="${external-lib}" includes="*.jar" />
<fileset dir = "${sdk-platform-folder}" includes="*.jar"></fileset>
<fileset dir="${sdk-tools-folder}\support" includes="*.jar"></fileset>
</classpath>
</javac>
<echo>...java源文件编译成class文件完毕....</echo>
</target>

<!--将.class 混淆-->
<target name="optimize" depends="compile">
<echo>...开始代码混淆...</echo>
<jar basedir="${compile-bin-ospath}" destfile="${compile-bin-ospath}\temp.jar"/>
<taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard-jar}" />
<proguard>
-injars                		${compile-bin-ospath}\temp.jar
-outjars                    ${compile-bin-ospath}\optimized.jar
-libraryjars                ${android-jar}
-optimizationpasses 5  					<!--  指定代码的压缩级别 -->
-dontusemixedcaseclassnames  			<!--  是否使用大小写混合 -->
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  <!-- 混淆时所采用的算法 -->
-include ${proguard-cfg}
</proguard>
<delete file="${compile-bin-ospath}\temp.jar"/>
<mkdir dir="${compile-bin-ospath}\optimized"/>
<unzip src="${compile-bin-ospath}\optimized.jar" dest="${compile-bin-ospath}\optimized"/>
<delete file="${compile-bin-ospath}\optimized.jar"/>
<echo>...代码混淆结束...</echo>
</target>

<!-- 将.class文件转化成.dex文件 -->
<target name="dex" depends="optimize">
<echo>...开始将.class文件转化成.dex文件....</echo>
<exec executable="${dx-bat}" failonerror="true">
<arg value="--dex" />
<!-- 输出文件 -->
<arg value="--output=${dex-ospath}" />
<!-- 要生成.dex文件的源classes和libraries -->
<arg value="${compile-bin-ospath}\optimized"/>
<arg value="${external-lib-ospath}" />
</exec>
<echo>...将.class文件转化成.dex文件完成....</echo>
</target>

<!-- 将资源文件放进输出目录 -->
<target name="package-res-and-assets">
<echo>...开始将资源文件放进输出目录....</echo>
<exec executable="${aapt-exe}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${manifest-xml}" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-A" />
<arg value="${asset-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="-F" />
<arg value="${resources-package-ospath}" />
</exec>
<echo>...将资源文件放进输出目录完成....</echo>
</target>

<!-- 打包成未签证的apk -->
<target name="package" depends="dex, package-res-and-assets">
<echo>...开始打包未签名的apk....</echo>
<exec executable="${apkbuilder-bat}" failonerror="true">
<arg value="${unsigned-apk-ospath}" />
<arg value="-u" />
<arg value="-z" />
<arg value="${resources-package-ospath}" />
<arg value="-f" />
<arg value="${dex-ospath}" />
<arg value="-rf" />
<arg value="${srcdir-ospath}" />
<!--  打包*.so文件 -->
<arg value="-nf"/>
<arg value="${external-lib-ospath}"/>
</exec>
<echo>...打包未签名的apk结束....</echo>
</target>

<!-- 对apk进行签证 -->
<target name="jarsigner-exe" depends="package">
<echo>...开始对未签名的apk签名...</echo>
<exec executable="${jarsigner-exe}" failonerror="true">
<arg value="-keystore" />
<arg value="${keystore-file-ospath}" />
<arg value="-storepass" />
<arg value="${storepass-key}" /> <!-- 密码 -->
<arg value="-keypass" />
<arg value="${keypass-key}" />
<arg value="-signedjar" />
<arg value="${signed-apk-ospath}" />
<arg value="${unsigned-apk-ospath}" />
<!-- 不要忘了证书的别名 -->
<arg value="8m" />
</exec>
<echo>...未签名的apk签名结束...</echo>
</target>

<!-- 发布 -->
<target name="release" depends="jarsigner-exe">
<!-- 删除未签证apk -->
<delete file="${unsigned-apk-ospath}"/>
</target>

<!-- 打包的应用程序进行优化
对apk文件使用密钥进行签名后,一定要运行zipalign进行对齐。
这个工具能做到让那些未压缩的数据以特定的字节对齐。以4字节对齐能优化性能。
当对齐后,Android系统能通过  mmap()阅读文件,
即使它们包含二进制数据,而不是从包中拷贝所有的数据。
好处是在运行程序时减少了随机读取内存的消耗-->
<target name="zipalign-exe" depends="release">
<echo>...开始对签名的apk签名进行优化...</echo>
<exec executable="${zipalign-exe}" failonerror="true">
<arg value="-v" />
<arg value="4" />
<arg value="${signed-apk-ospath}" />
<arg value="${aligned-apk-ospath}" />
</exec>
<echo>...对签名的apk签名进行优化结束...</echo>
</target>

<target name="_deploy" depends="zipalign-exe">
<!-- 删除为对齐的签证apk -->
<delete file="${signed-apk-ospath}"/>
<echo> 打包成功!apk路径为:${aligned-apk-ospath}</echo>
</target>
</project>
ps:ant-contrib-1.0b3.jar的下载地址戳这里

proguard.cfg的文件我就贴出来了,混淆我相信应该都会懂一点,不懂得可以戳这里

以上就是Ant打签名apk的全部步骤,每一步都有注释作为解释。

分割线------------------------------------------------------------------------------------------------------------------

工程目录:



buildapp.properties

# This is an config file used to replace variable in buildapp.xml
# Note: Use the '\\' instead of '\'
# Note: -ospath   absolute path

# this name of android sdk path
sdk-folder = ${env.ANDROID_SDK_HOME}

# ths name of java jdk path
java-home = ${env.JAVA_HOME}

# this name of android sdk platform path
sdk-platform-folder = ${sdk-folder}\\platforms\\android-23

# this name of android sdk tools path
sdk-tools-folder = ${sdk-folder}\\tools

# this name of android sdk platform-tools paht
sdk-platform-tools-folder = ${sdk-folder}\\platform-tools

# complier must contain this jar
android-jar = ${sdk-platform-folder}/android.jar

# Here is the build tool
aapt-exe = ${sdk-platform-tools-folder}\\aapt.exe
aidl-exe = ${sdk-platform-tools-folder}\\aidl.exe
dx-bat = ${sdk-platform-tools-folder}\\dx.bat
apkbuilder-bat = ${sdk-tools-folder}\\apkbuilder.bat
jarsigner-exe = ${java-home}\\bin\\jarsigner.exe
zipalign-exe = ${sdk-tools-folder}\\zipalign.exe

# this name of proguard home path
proguard-home = ${sdk-tools-folder}\\proguard

# this name of use proguard's jar
proguard-jar = ${proguard-home}\\lib\\proguard.jar

#this name of proguard.cfg path
proguard-cfg = ${basedir}\\proguard.cfg

# javac memory size
javac-forkOn-memoryinitialsize = 256m
javac-forkOn-memoryMaximumSize = 256m

# this name is compile file path
compile-bin-name = bin-compile
compile-bin-ospath = ${basedir}\\${compile-bin-name}

#jars name
org-jar-name = payeco_org.jar
optimized-jar-name = payeco_plugin.jar
buildapp.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="PayecoPayPluginBase" default="optimize">
<!-- 必须放在最前面,可以确保能使用到编译平台的环境变量 -->
<property environment="env" />

<!-- 引入属性文件 -->
<property file="buildapp.properties"/>

<!-- java源文件目录  相对路径-->
<property name="srcdir"  value ="src" />
<!-- java源文件目录  绝对路径-->
<property name="srcdir-ospath" value="${basedir}\${srcdir}" />

<!-- 外部类库所在目录 相对路径-->
<property name="external-lib" value="libs" />
<!-- 外部类库所在目录 绝对路径-->
<property name="external-lib-ospath" value="${basedir}\${external-lib}" />

<!-- 初始化工作 -->
<target name="init">
<echo>...开始进行目录初始化...</echo>
<delete dir="${compile-bin-ospath}" />
<mkdir dir="${compile-bin-ospath}" />
<echo>...目录初始化结束...</echo>
</target>

<target name="testOut">
<echo>${env.ANDROID_SDK_HOME}</echo>
</target>

<!-- 将工程中的java源文件编译成class文件 -->
<target name="compile" depends="init">
<echo>...开始java源文件编译成class文件....</echo>
<javac
encoding="utf-8"
source="1.6"
target="1.6"
srcdir="."
deprecation="on"
destdir="${compile-bin-ospath}"
bootclasspath="${android-jar}"
verbose="false"
debug="true"
fork="on"
memoryinitialsize="${javac-forkOn-memoryinitialsize}"
memorymaximumsize="${javac-forkOn-memoryMaximumSize}"
compiler="org.eclipse.jdt.core.JDTCompilerAdapter">

<compilerarg line="-Xlint:unchecked" />
<compilerarg line="-encoding utf-8 " />

<classpath>
<fileset dir="${external-lib}" includes="*.jar" />
<fileset dir = "${sdk-platform-folder}" includes="*.jar"></fileset>
<fileset dir="${sdk-tools-folder}\support" includes="*.jar"></fileset>
</classpath>
</javac>
<echo>...java源文件编译成class文件完毕....</echo>
</target>

<!--将.class 混淆-->
<target name="optimize" depends="compile">
<echo>...开始代码混淆...</echo>
<jar basedir="${compile-bin-ospath}" destfile="${compile-bin-ospath}\${org-jar-name}"/>
<taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard-jar}" />
<proguard>
-injars                		${compile-bin-ospath}\${org-jar-name}
-outjars                    ${compile-bin-ospath}\${optimized-jar-name}
-libraryjars                ${android-jar}

-include ${proguard-cfg}
</proguard>
<mkdir dir="${compile-bin-ospath}\optimized"/>
<unzip src="${compile-bin-ospath}\${optimized-jar-name}" dest="${compile-bin-ospath}\optimized"/>
<echo>...代码混淆结束...</echo>
</target>

</project>
同样混淆文件proguard.cfg我也不贴出来了。

以上就是Ant大混淆jar的全部步骤,其实和上面打签名apk差不多。

分割线------------------------------------------------------------------------------------------------------------------

<!-- 将工程中的java源文件编译成class文件 -->
<target name="compile" depends="init">
<echo>...开始java源文件编译成class文件....</echo>
<javac
encoding="utf-8"
source="1.6"
target="1.6"
srcdir="."
deprecation="on"
destdir="${compile-bin-ospath}"
bootclasspath="${android-jar}"
verbose="false"
debug="true"
fork="on"
memoryinitialsize="${javac-forkOn-memoryinitialsize}"
memorymaximumsize="${javac-forkOn-memoryMaximumSize}"
compiler="org.eclipse.jdt.core.JDTCompilerAdapter">

<compilerarg line="-Xlint:unchecked" />
<compilerarg line="-encoding utf-8 " />

<classpath>
<fileset dir="${external-lib}" includes="*.jar" />
<fileset dir = "${sdk-platform-folder}" includes="*.jar"></fileset>
<fileset dir="${sdk-tools-folder}\support" includes="*.jar"></fileset>
</classpath>
</javac>
<echo>...java源文件编译成class文件完毕....</echo>
</target>
看上面的代码,我javac的compiler用的是org.eclipse.jdt.core.JDTCompilerAdapter,jdk的带的编译约束较多,有的时候Eclipse编译通过了,用jdk的编译还是失败。所以我就换成了Eclipse的了。

换成Eclipse之后注意要改一下ant的run as:



选择第一个,就ok了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: