继上一篇使用ant编译Android工程(一),本次主要说明Android工程引用第三方lib工程时该如何编译。
android工程引用第三方lib工程使用ant编译步骤与普通工程相同,只有生成R文件、编译java类、混淆class文件、生成dex文件、打包资源等步骤不同。
1、生成R文件,应用第三方lib工程的android工程,在gen目录下为有其引用的lib工程生成的R文件,因此,在ant编译过程中我们也需要生成。
<!-- 根据工程中的资源文件生成R.java文件 -->
<target name="gen-R" depends="init">
<echo>生成R.java文件....</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-f" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-gen}" />
<arg value="-S" />
<arg value="${resource-dir}" />
<!-- 第三方lib 库开始 -->
<arg value="-S"/>
<arg value="../appcompat_v7/res"/>
<!-- 第三方lib 库结束 -->
<arg value="-M" />
<arg value="${manifest-xml}" />
<arg value="-I" />
<arg value="${android-jar}" />
<!-- 第三方lib 库开始 -->
<arg value="--auto-add-overlay" />
<!-- 第三方lib 库结束 -->
</exec>
</target>
<!-- 第三方lib 库开始 -->
<target name="gen-R1" depends="init">
<echo>生成R.java文件....</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-f" />
<arg value="-m" />
<arg value="--non-constant-id" /> <!-- 加了这个参数-->
<arg value="-J" />
<arg value="${outdir-gen}" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-S"/>
<arg value="../appcompat_v7/res"/>
<arg value="-M" />
<arg value="../appcompat_v7/AndroidManifest.xml" /> <!-- 库应用的manifest-->
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="--auto-add-overlay" />
</exec>
</target>
<!-- 第三方lib 库结束-->
我工程里引用的是appcompat_v7 lib工程。
注意:在编译aidl文件时的任务依赖此时要依赖两个
<target name="aidl" depends="gen-R,gen-R1">
2、编译java文件
<!-- 将工程中的java源文件编译成class文件 -->
<target name="compile" depends="aidl">
<echo>java源文件编译成class文件....</echo>
<javac encoding="utf-8" target="1.7" srcdir="." destdir="${outdir-classes}" bootclasspath="${android-jar}" verbose="false">
<src path="../appcompat_v7/src"/>
<compilerarg line="-encoding UTF-8 " />
<classpath>
<fileset dir="${external-lib}" includes="*.jar" />
<!-- 引用第三方lib库 开始 -->
<fileset dir="../appcompat_v7/libs" includes="*.jar"/>
<!-- 引用第三方lib库 结束 -->
</classpath>
</javac>
</target>
3、将class文件进行混淆
<!-- 将class文件进行混淆 -->
<target name="optimize" depends="compile">
<echo>开始进行代码混淆...</echo>
<jar basedir="${outdir-classes}" destfile="${unoptimized}" />
<java jar="${sdk-tools}/proguard/lib/proguard.jar" fork="true" failοnerrοr="true">
<!-- Dmaximum.inlined.code.length 默认值为8 设置内联代码的长度 -->
<jvmarg value="-Dmaximum.inlined.code.length=32" />
<!-- 指定配置文件 -->
<arg value="-libraryjars ${android-jar}" />
<arg value="-libraryjars ../appcompat_v7/libs/android-support-v4.jar" />
<arg value="-libraryjars ../appcompat_v7/libs/android-support-v7-appcompat.jar" />
<arg value="@proguard-android.txt" />
<arg value="-injars ${unoptimized}" />
<arg value="-outjars ${optimized}" />
</java>
<delete dir="${outdir-classes}" />
<mkdir dir="${outdir-classes}" />
<unzip src="${optimized}" dest="${outdir-classes}" />
<delete file="${unoptimized}" />
<delete file="${optimized}" />
<echo>代码混淆完成...</echo>
</target>
4、生成dex文件
<!-- 将.class文件转化成.dex文件 -->
<target name="dex" depends="optimize">
<echo>将.class文件转化成.dex文件....</echo>
<exec executable="${dx}" failοnerrοr="true">
<arg value="--dex" />
<!-- 输出文件 -->
<arg value="--output=${dex-ospath}" />
<!-- 要生成.dex文件的源classes和libraries -->
<arg value="${outdir-classes-ospath}" />
<arg value="${external-lib-ospath}" />
<!-- 引用第三方lib库 开始 -->
<arg value="../appcompat_v7/libs"/>
<!-- 引用第三方lib库 结束 -->
</exec>
</target>
5、打包资源
<!-- 将资源文件放进输出目录 -->
<target name="package-res-and-assets">
<echo>将资源文件放进输出目录....</echo>
<exec executable="${aapt}" failοnerrοr="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${manifest-xml}" />
<arg value="-S" />
<arg value="${resource-dir}" />
<!-- 引用第三方lib库 开始 -->
<arg value="-S"/>
<arg value="../appcompat_v7/res"/>
<!-- 引用第三方lib库 结束 -->
<arg value="-A" />
<arg value="${asset-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="-F" />
<arg value="${resources-package}" />
<!-- 引用第三方lib库 开始(允许覆盖资源) -->
<arg value="--auto-add-overlay" />
<!-- 引用第三方lib库 结束 -->
</exec>
</target>
修改以上步骤后运行就可编译引用第三方lib工程的android工程。