Android通过ant脚本打包带Library project的方法

时间:2022-02-20 09:09:57

     对于Android程序打包,一般可以通过Eclipse进行打包.但如果一个程序需要发布到多个不同渠道的时候,就需要用到Ant脚本辅助打包了.

     但网上很多的android程序(app project)ant脚本一般都只针对一个项目,对于引用了library project的没有什么有用的资料.

     如果直接按照一个项目的方式去打包,要不会不能成功打进去资源文件,要不不能成功的生成R.java文件,从而导致引用资源报错抛异常.

     经过查找国外网站和有个cp技术的提醒,可以有两种方式实现.

     (1)cp技术的方法,对于app project 和 library project,各执行一次aapt命令,但各指向不同的manifest文件,让其能读取manifest中的package信息,并生成对应的package下的R.java文件.这样的问题是两个R.java会生成app project和 library project的所有的资源id.

<!-- 生成app project的 R.java--> 
<exec
            executable="${aapt}"
            failonerror="true" >

            <arg value="package" />

            <arg value="-m" />
            
            <arg value="--auto-add-overlay" />

            <arg value="-J" />

            <arg value="${out-dir-gen}" />

            <arg value="-M" />

            <arg value="${destdir}\AndroidManifest.xml" />

            <arg value="-S" />

            <arg value="${resource-dir}" />

            <arg value="-S" />

            <arg value="${library-dir}" />
            
            <arg value="-A" />

            <arg value="${asset-dir}" />

            <arg value="-I" />

            <arg value="${android-jar}" />

        </exec>
<!-- 生成liibrary project的 R.java--> 
 <exec
            executable="${aapt}"
            failonerror="true" >

            <arg value="package" />

            <arg value="-m" />
            
            <arg value="--auto-add-overlay" />

            <arg value="-J" />

            <arg value="${out-dir-gen}" />

            <arg value="-M" />

            <arg value="${library-dir}\AndroidManifest.xml" />

            <arg value="-S" />

            <arg value="${resource-dir}" />

            <arg value="-S" />

            <arg value="${library-dir}" />
            
            <arg value="-A" />

            <arg value="${asset-dir}" />

            <arg value="-I" />

            <arg value="${android-jar}" />

        </exec>

 (2)通过使用aapt的参数  --extra-packages. 其参数的说明如下:generate R.java for libraries. Separate libraries with ':'.

所以可以将上面的ant命令合并成一个:

<!-- 生成liibrary project的 R.java--> 
 <exec
            executable="${aapt}"
            failonerror="true" >

            <arg value="package" />

            <arg value="-m" />
            
            <arg value="--auto-add-overlay" />

            <arg value="-J" />

            <arg value="${out-dir-gen}" />

            <arg value="-M" />

            <arg value="${dest-dir}\AndroidManifest.xml" />

            <arg value="-S" />

            <arg value="${resource-dir}" />

            <arg value="-S" />

            <arg value="${library-dir}" />

            <arg value="--extra-packages" />

            <arg value="cn.test" /><!-- Library Project的包名 -->
            
            <arg value="-A" />

            <arg value="${asset-dir}" />

            <arg value="-I" />

            <arg value="${android-jar}" />

        </exec>