手把手学习——ant脚本打包APK

时间:2021-10-30 18:37:08


(一)准备

1.Android SDK环境配置

   (1)环境变量——系统变量:新建ANDROID_HOME:E:/androdi/sdk(这里是你自己的SDK地址)

(2)在Path变量中加入:%Android_HOME%\platform-tools;%Android_HOME%\tools; (注意中英文符号)

(3)检验环境配置是否成功:命令行下,输入android  -version

(4)注意:升级4.2版本后tools目录下没有了apkbuilder.bat文件,需要自行搜索下载一个。

2.ant安装与环境搭建

(1)下载不必多说,https://ant.apache.org/bindownload.cgi官网下载合适的版本即可

(2)环境变量——系统变量:新建ANT_HOME:E:\apache-ant-1.9.3(尽量在根目录,严禁中文目录!)

(3)Path变量中加入:%ANT_HOME%\bin;

(4)检验ant是否配置成功:命令行下,输入ant -version

(二)生成keystore

由于apk的打包的最后步骤需要签名,而签名需要引入keystore,因此简单介绍一下keystore的生成方法。

命令行下输入:keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore

按照提示一步一步进行下去即可,结束后会在当前目录下生成android.keystore文件,拷贝到你的工程目录下。

(三)ant脚本打包apk

1.在该工程目录下新建,build.xml,local.properties,project.properties三个文件

2.总结一下打包所需要的文件有:build.xml,local.properties,project.properties,android.keystore四个文件

3.下面对各个文件内容单独进行分析:

(1)project.properties

只有一行内容:target=android-17 (定义android版本)

(2)local.properties

#sdk目录

sdk.dir=E:/sky/WorkFiles/android_development/adt-bundle-windows-x86-20130717/sdk

#工程目录结构
 project_new
=你的apk名称
 reasedAPK=${project_new}.apk
 org_project.dir=
你的工程目录
 build.dir=${org_project.dir}/build
 project.dir=${org_project.dir}/temp
 classes.dir=${project.dir}/bin/classes
 buildtemp.dir=${project.dir}/build
 src.dir=${project.dir}/src
 res.dir=${project.dir}/res
 gen.dir=${project.dir}/gen
 asset.dir=${project.dir}/asset
#keystore信息 
key.store=${org_project.dir}/
android.keystore
key.alias=android.keystore
key.store.password
=生成keystore时的密码
key.alias.password=生成keystore时的密码

(3)build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="CMCCSpeedTest" default="help">
<property file="local.properties" />
<property environment="env" />
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME" />
</condition>
<loadproperties srcFile="project.properties" />

<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>

<import file="custom_rules.xml" optional="true" />

<import file="${sdk.dir}/tools/ant/build.xml" /> <!-- 引入sdk的build.xml,可以研究一下它的部分代码 -->

<!--相关环境及工具配置,根据自己的实际情况配置相应路径,需要灵活处理,此部分实际上是覆盖了sdk的build.xml中部分环境配置的定义-->
<property name="sdk.platformtools" value="${sdk.dir}/platform-tools" />
<property name="sdk.tools" value="${sdk.dir}/tools" />
<property name="sdk.build-tools" value="${sdk.dir}/build-tools/android-4.2.2" />
<property name="aapt" value="${sdk.build-tools}/aapt.exe" />
<property name="adb" value="${sdk.platformtools}/adb.exe" />
<property name="dx" value="${sdk.build-tools}/dx.bat" />
<property name="apkbuilder" value="${sdk.tools}/apkbuilder.bat" />
<property name="android.jar" value="${sdk.dir}/platforms/android-17/android.jar" />
<!--初始化工程目录-->
<target name="init">
<delete dir="${build.dir}"></delete>
<mkdir dir="${build.dir}"/>
<delete dir="${project.dir}"></delete>
<mkdir dir="${project.dir}"/>

<copy todir="${project.dir}">
<fileset dir="${org_project.dir}" includes="**/*"/>
</copy>
</target>
<!--生成R.java文件 ${sdk.dir}\platform-tools\aapt.exe-->
<target name="genRJava">
<exec executable="${aapt}" failonerror="true">
<arg value="package"/>
<arg value="-m"/>
<arg value="-J"/>
<arg value="${project.dir}/gen"/>
<arg value="-M"/>
<arg value="${project.dir}/AndroidManifest.xml"/>
<arg value="-S"/>
<arg value="${res.dir}"/>
<arg value="-I"/>
<arg value="${android.jar}"/>
</exec>
</target>
<!-- 项目编译 -->
<target name="compile" >
<javac encoding="UTF-8" target="1.5" debug="true" extdirs=""
srcdir="${gen.dir};${src.dir}"
destdir="${classes.dir}" bootclasspath="${android.jar}">
<classpath>
<fileset dir="${project.dir}/libs" includes="*.jar">
</fileset>
</classpath>
</javac>
</target>
<!-- 生成dex文件 ${sdk.dir}\platform-tools\dx.bat -->
<target name="dex" >
<apply executable="${dx}" failonerror="true" parallel="true">
<arg value="--dex"/>
<arg value="--output=${buildtemp.dir}/classes.dex"/>
<arg path="${classes.dir}"/>
<fileset dir="${project.dir}/libs" includes="*.jar"/>
</apply>
</target>

<!-- 打包资源文件 ${sdk.dir}\platform-tools\aapt.exe -->
<target name="packageRes">
<exec executable="${aapt}" failonerror="true">
<arg value="package"/>
<arg value="-f"/>
<arg value="-M"/>
<arg value="${project.dir}/AndroidManifest.xml"/>
<arg value="-S"/>
<arg value="${res.dir}"/>
<arg value="-A"/>
<arg value="${asset.dir}"/>
<arg value="-I"/>
<arg value="${android.jar}"/>
<arg value="-F"/>
<arg value="${buildtemp.dir}/resources.ap_"/>
</exec>
</target>

<!-- 打包Apk -->
<target name="你的APK名称" depends="init,genRJava,compile,dex,packageRes">
<!-- 打包 -->
<exec executable="${apkbuilder}" failonerror="true">
<arg value="${buildtemp.dir}/unsigntest.apk"/>
<arg value="-u"/>
<arg value="-z"/>
<arg value="${buildtemp.dir}/resources.ap_"/>
<arg value="-f"/>
<arg value="${buildtemp.dir}/classes.dex"/>
<arg value="-rf"/>
<arg value="${src.dir}"/>
<arg value="-rj"/>
<arg value="${project.dir}/libs"/>
</exec>
<signjar
jar="${buildtemp.dir}/unsigntest.apk"
signedjar="${build.dir}/${reasedAPK}"
keystore="${key.store}"
storepass="${key.store.password}"
alias="${key.alias}"
keypass="${key.alias.password}"
verbose="-verbose"/>
</target>

</project>

4.命令行进入该工程目录下,输入命令:ant release ,至此build成功!会有一个APk在bin目录下生成。
(四)接下来的工作 1.需要明确在工程引入第三方lib包的情况下如何解决引包不全的问题解决方案。 2.研究如何指定特定目录生成APK,而非默认路径。