|
<?xml version="1.0" encoding="UTF-8"?>
<project name="apkTargets" default="apkpackaging" basedir=".">
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
<!-- 指定配置文件 -->
<property file="build.properties" />
<record name="${log_file}" loglevel="info" append="no" action="start" />
<!-- 识别编译环境 -->
<condition property="exe" value=".exe" else=""><os family="windows" /></condition>
<condition property="bat" value=".bat" else=""><os family="windows" /></condition>
<!-- Android SDK Tools -->
<property name="zipalign" value="${android_tools}/zipalign${exe}" />
<property name="jarsigner" value="${jdk_home}/bin/jarsigner${exe}" />
<property name="android-target-dir" value="${android_sdk_home}/platforms/${android-target}" />
<property name="android-jar" value="${android-target-dir}/android.jar" />
<property name="android-framework" value="${android-target-dir}/framework.aidl" />
<property name="aapt" value="${android_tools}/aapt${exe}" />
<property name="dx" value="${android_tools}/dx${bat}" />
<property name="aidl" value="${android_tools}/aidl${exe}" />
<property name="proguard-jar" value="${android_sdk_home}/tools/proguard/lib/proguard.jar" />
<property name="annotations-jar" value="${android_sdk_home}/tools/support/annotations.jar" />
<!-- some file directory exclude "bin" file, because "bin" file will be changed each loop -->
<property name="gen-dir" value="gen" />
<property name="src-dir" value="src" />
<property name="libs-dir" value="libs" />
<property name="res-dir" value="res" />
<property name="asset-dir" value="assets" />
<property name="bin-dir" value="bin" />
<property name="manifest-xml" value="AndroidManifest.xml" />
<!-- 主工程各个目录 -->
<property name="host-gen" value="${project_home}/${gen-dir}" />
<property name="host-src" value="${project_home}/${src-dir}" />
<property name="host-libs" value="${project_home}/${libs-dir}" />
<property name="host-bin" value="${project_home}/${bin-dir}" />
<property name="host-classes" value="${host-bin}/classes" />
<property name="intermediate-dex" value="${project_home}/${bin-dir}/${app_name}/classes.dex" />
<!-- The final package file to generate -->
<property name="resources-package" value="${project_home}/${bin-dir}/${app_name}/${app_name}.ap_" />
<property name="out-unsigned-package" value="${project_home}/${bin-dir}/${app_name}/${app_name}-unsigned.apk" />
<property name="out-signed-package" value="${project_home}/${bin-dir}/${app_name}/${app_name}-signed.apk" />
<property name="zipalign-package" value="${output_path}/${app_name}_for_android_${android_version}.apk" />
<!-- 自动化打包的target -->
<target name="apkpackaging" depends="init,aapt_gererateR,aidl,compile,obfuscate,dex-package,aapt-package-res,apk-builder,jar-signer,zipalign"/>
<!-- 初始化清空-->
<target name="init">
<delete dir="${host-gen}" />
<delete dir="${host-bin}" />
<delete file="${project_home}/proguardMapping.txt" />
<mkdir dir="${host-gen}" />
<mkdir dir="${host-bin}" />
<mkdir dir="${host-classes}" />
<mkdir dir="${host-bin}/${app_name}" />
<!-- <mkdir dir="${output_path}" /> -->
</target>
<!-- 生成R文件和Manifest.java -->
<target name="aapt_gererateR">
<foreach target="aapt_gererateR_library" list="${libraries}" param="library" delimiter=",">
</foreach>
<!-- auto-add-overlay 这个重要,覆盖资源,不然报错-->
<var name="p" value="package -m --auto-add-overlay -J ${host-gen} -M ${project_home}/${manifest-xml}
-I ${android-jar} -S ${project_home}/${res-dir}"/>
<for list="${libraries}" param="library">
<sequential>
<available property="isExist_library_res_r" file="@{library}/res" type="dir" />
<if>
<equals arg1="${isExist_library_res_r}" arg2="true" />
<then>
<var name="p" value="${p} -S @{library}/${res-dir}"/>
</then>
</if>
</sequential>
</for>
<!-- 编译工程的的R文件 -->
<exec executable="${aapt}" failonerror="true">
<arg line="${p}" />
</exec>
</target>
<target name="aapt_gererateR_library">
<echo>gererate R.java with ${library}</echo>
<available property="isExist_library_r_l" file="${library}/res" type="dir" />
<!-- 是否需要参数 -S ${library}/${res-dir} -->
<if>
<equals arg1="${isExist_library_r_l}" arg2="true" />
<then>
<var name="param" value="-S ${library}/${res-dir}"/>
</then>
<else>
<var name="param" value=""/>
</else>
</if>
<var name="param" value="package -m --non-constant-id --auto-add-overlay -J ${host-gen}
-M ${library}/${manifest-xml} -I ${android-jar} ${param}"/>
<echo>aapt_gererateR_library param:${param}</echo>
<mkdir dir="${library}/gen"/>
<!-- 编译Libray的R文件 -->
<exec executable="${aapt}" failonerror="true">
<arg line="${param}" />
</exec>
</target>
<!-- 生成aidl对应的java文件 -->
<target name="aidl">
<apply executable="${aidl}" failonerror="true">
<arg value="-p${android-framework}" />
<arg value="-I${host-src}" />
<arg value="-o${host-gen}" />
<fileset dir="${host-src}">
<include name="**/*.aidl" />
</fileset>
</apply>
</target>
<!-- 编译java文件为class文件 -->
<target name="compile">
<available property="isExist_host_libs_h" file="${host-libs}" type="dir" />
<if>
<equals arg1="${isExist_host_libs_h}" arg2="true" />
<then>
<copydir src="${host-libs}"
dest="${host-bin}/libs"/>
</then>
</if>
<for list="${libraries}" param="library">
<sequential>
<available property="isExist_library_libs_l" file="@{library}/libs" type="dir" />
<if>
<equals arg1="${isExist_library_libs_l}" arg2="true" />
<then>
<copydir src="@{library}/libs"
dest="${host-bin}/libs"
/>
</then>
</if>
</sequential>
</for>
<path id="library.libs">
<fileset dir="${host-bin}/libs">
<include name="*.so" />
<include name="**/*.so" />
<include name="*/*.so" />
<include name="**/*.jar" />
<include name="*.jar" />
</fileset>
</path>
<javac debug="true" extdirs="" srcdir="." includeantruntime="on"
destdir="${host-classes}" bootclasspath="${android-jar}" encoding="UTF-8"
source="${jdk_version}" target="${jdk_version}" >
<compilerarg line="-encoding UTF-8 " />
<src path="${host-src}" />
<src path="${host-gen}" />
<classpath refid="library.libs" />
</javac>
</target>
<!-- 混淆 -->
<target name="obfuscate">
<jar basedir="${host-classes}" destfile="temp.jar" />
<java jar="${proguard-jar}" fork="true" failonerror="true">
<sysproperty key="file.encoding" value="UTF-8" />
<jvmarg value="-Dmaximum.inlined.code.length=32" />
<arg value="-injars temp.jar" />
<arg value="-outjars optimized.jar" />
<arg value="-libraryjars '${annotations-jar}'" />
<arg value="-libraryjars '${android-jar}'" />
<arg value="@${project_home}/proguard-project.txt" />
</java>
<delete file="temp.jar" />
<delete dir="${host-classes}" />
<mkdir dir="${host-classes}" />
<unzip src="optimized.jar" dest="${host-classes}" />
<delete file="optimized.jar" />
</target>
<!-- 打包dex文件 -->
<target name="dex-package">
<echo>Packaging dex...</echo>
<var name="dex_p" value="--dex --output=${intermediate-dex} ${host-classes}"/>
<available property="isExist_host_libs_dx" file="${host-libs}" type="dir" />
<if>
<equals arg1="${isExist_host_libs_dx}" arg2="true" />
<then>
<var name="dex_p" value="${dex_p} ${host-libs}"/>
</then>
</if>
<for list="${libraries}" param="library">
<sequential>
<available property="isExist_host_libs_dx_l" file="@{library}/libs" type="dir" />
<if>
<equals arg1="${isExist_host_libs_dx_l}" arg2="true" />
<then>
<var name="dex_p" value="${dex_p} @{library}/libs"/>
</then>
</if>
</sequential>
</for>
<exec executable="${dx}" failonerror="true" >
<arg line="${dex_p}"/>
</exec>
</target>
<!-- aapt打包资源 -->
<target name="aapt-package-res">
<echo>Packaging resources and assets...</echo>
<var name="temp" value=""/>
<for list="${libraries}" param="library">
<sequential>
<available property="isExist_library_res_aapt" file="@{library}/res" type="dir" />
<if>
<equals arg1="${isExist_library_res_aapt}" arg2="true" />
<then>
<var name="temp" value="${temp} -S @{library}/${res-dir}"/>
</then>
</if>
</sequential>
</for>
<echo>------------------------------</echo>
<echo>${temp}</echo>
<var name="res_p" value="package -f -M ${project_home}/${manifest-xml} -S ${project_home}/${res-dir} ${temp} -A ${project_home}/${asset-dir} -I ${android-jar} -F ${resources-package} --auto-add-overlay"/>
<exec executable="${aapt}" failonerror="true">
<arg line="${res_p}"/>
</exec>
</target>
<!-- APK打包 -->
<target name="apk-builder">
<echo>Building apk...</echo>
<var name="temp" value=""/>
<for list="${libraries}" param="library">
<sequential>
<available property="isExist_library_libs_builder" file="@{library}/libs" type="dir" />
<if>
<equals arg1="${isExist_library_libs_builder}" arg2="true" />
<then>
<var name="temp" value="${temp} -nf @{library}/libs -rj @{library}/libs"/>
</then>
</if>
</sequential>
</for>
<var name="apkBuild_p" value="${out-unsigned-package} -u -z ${resources-package} -f ${intermediate-dex} -rf ${host-src} ${temp}"/>
<java classpath="${android_apk_tools}/lib/sdklib.jar" classname="com.android.sdklib.build.ApkBuilderMain" fork="true" failonerror="true">
<sysproperty key="file.encoding" value="UTF-8" />
<arg line="${apkBuild_p}"/>
</java>
</target>
<!-- APK签名 -->
<target name="jar-signer">
<echo>Jar signer...</echo>
<exec executable="${jarsigner}" failonerror="true">
<!-- 打印详细日志 -->
<!-- <arg value="-verbose" /> -->
<!-- 签名信息 -->
<arg value="-keystore" />
<arg value="${key_store}" />
<arg value="-storepass" />
<arg value="${key_store_password}" />
<arg value="-keypass" />
<arg value="${key_alias_password}" />
<!-- 输出安装包 -->
<arg value="-signedjar" />
<arg value="${out-signed-package}" />
<arg value="${out-unsigned-package}" />
<arg value="${key_alias}" />
<!-- -->
<arg value="-digestalg" />
<arg value="SHA1" />
<arg value="-sigalg" />
<arg value="MD5withRSA" />
</exec>
</target>
<!-- 使用zipalign做优化,对apk文件进行对齐 -->
<target name="zipalign">
<echo>Zipalign optimizing...</echo>
<exec executable="${zipalign}" failonerror="true">
<!-- 打印详细日志 -->
<!-- <arg value="-v" /> -->
<arg value="-f" />
<arg value="4" />
<arg value="${out-signed-package}" />
<!-- arg value="${out-unsigned-package}" /> -->
<arg value="${zipalign-package}" />
</exec>
<echo>打包完成:${zipalign-package}</echo>
</target>
</project>
|