==========前言==========
网上搜了很多种方案,但大多说得比较笼统
比如:
1、关于ant 打包android progect同时引入第三方library project注意点
http://blog.csdn.net/zah5897/article/details/8863864
2、android ant打包 引用第三方library
http://my.eoe.cn/712685/archive/4335.html
3、ant-build.xml打包应用程序【总结】
http://www.blogjava.net/1504/archive/2009/04/15/265851.html
后来尝试了一下,又准备放弃,改用maven来打包,不过考虑到学习成本比较大...
不过后来还是在ant的基础上搞出来了,此帖不光能解决一个library的依赖问题,还能解决多个library递归依赖的问题。
==========正文==========
废话不多说,贴上build.xml
复制代码
=========解析=========
其中 动态库so文件目录 我是没用到了,不过 第三方library 我是用到了两个,所以定义了两个,注意,我们的两个library里面有依赖关系,
library-dir2依赖library-dir
重点1,资源文件打包:
根据工程中的资源文件生成R.java文件,我会把library中的res和library2中的res都打包到我的最终目录中。(具体自己看代码)
重点2,src文件打包:
同样的道理,复制两份,自己看代码应该看得明白。
重点3:这时我们来运行ant命令来打包了,打包资源文件的时候很容易打包,没有报错,但是打包src文件的时候,会提示找不到BuildConfig.java
原来我使用了ZI-master,代码里面会使用到gen下的BuildConfig.java,但是我们的ant命令并没有生成BuildConfig.java,只能生成R.java。
好蛋疼,网上搜到了一个BuildConfig模板的解决方案,但是不好用,于是我想到了一个复制的方法,手动写死把代码复制进去。
来源,俺的博客: http://www.phpwind.me/54151.html
网上搜了很多种方案,但大多说得比较笼统
比如:
1、关于ant 打包android progect同时引入第三方library project注意点
http://blog.csdn.net/zah5897/article/details/8863864
2、android ant打包 引用第三方library
http://my.eoe.cn/712685/archive/4335.html
3、ant-build.xml打包应用程序【总结】
http://www.blogjava.net/1504/archive/2009/04/15/265851.html
后来尝试了一下,又准备放弃,改用maven来打包,不过考虑到学习成本比较大...
不过后来还是在ant的基础上搞出来了,此帖不光能解决一个library的依赖问题,还能解决多个library递归依赖的问题。
==========正文==========
废话不多说,贴上build.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <project name="ProjectName" default="release" basedir=".">
- <property file="config.properties"/>
- <property file="ProjectHome.properties"/>
- <!-- ANT环境变量 -->
- <property environment="env" />
- <!-- 生成R文件的相对目录 -->
- <property name="outdir-gen" value="${project.home}/gen" />
- <!-- 编译后的文件放置目录 -->
- <property name="outdir-bin" value="${project.home}/bin" />
- <!-- 输出目录 -->
- <property name="outdir" value="${project.outdir}" />
- <!-- 清单文件 -->
- <property name="manifest-xml" value="${project.home}/AndroidManifest.xml" />
- <!-- 源文件目录 -->
- <property name="resource-dir" value="res" />
- <property name="asset-dir" value="assets" />
- <!-- 资源文件目录 -->
- <property name="drawable-dir" value="${resource-dir}/drawable" />
- <property name="drawable-hdpi-dir" value="${resource-dir}/drawable-hdpi"/>
- <property name="drawable-ldpi-dir" value="${resource-dir}/drawable-ldpi"/>
- <property name="drawable-mdpi-dir" value="${resource-dir}/drawable-mdpi"/>
- <property name="drawable-zh-rCN-dir" value="${resource-dir}/drawable-zh-rCN"/>
- <!-- java源文件目录 -->
- <property name="srcdir" value="src" />
- <property name="srcdir-ospath" value="${project.home}/${srcdir}" />
- <!-- 动态库so文件目录 -->
- <property name="library" value="${project.home}/libs" />
- <!-- 第三方library -->
- <property name="library-dir" value="${library-dir}" />
- <property name="library-dir2" value="${library-dir2}" />
- <!-- 外部类库所在目录 -->
- <property name="external-lib" value="lib" />
- <property name="external-lib-ospath" value="${project.home}/${external-lib}" />
- <!-- 生成class目录 -->
- <property name="outdir-classes" value="${outdir-bin}/classes" />
- <property name="outdir-classes-ospath" value="${outdir-classes}" />
- <!-- classes.dex相关变量 -->
- <property name="dex-file" value="classes.dex" />
- <property name="dex-path" value="${outdir-bin}/${dex-file}" />
- <property name="dex-ospath" value="${dex-path}" />
- <!-- 经过aapt生成的资源包文件 -->
- <property name="resources-package" value="${outdir-bin}/resources.ap_" />
- <property name="resources-package-ospath" value="${resources-package}" />
- <!-- 未认证apk包 -->
- <property name="out-unsigned-package" value="${outdir-bin}/${appName}-unsigned.apk" />
- <property name="out-unsigned-package-ospath" value="${out-unsigned-package}" />
- <!-- 证书文件 -->
- <property name="keystore-file" value="${keystore}" />
- <!-- 已认证apk包 -->
- <property name="out-signed-package" value="${outdir-bin}/${appName}.apk" />
- <property name="out-signed-package-ospath" value="${out-signed-package}" />
- <!-- 已优化apk包 -->
- <property name="zipalign-signed-package" value="${outdir-bin}/${appName}${version}_release.apk" />
- <!-- 输出路径的apk包 -->
- <property name="outdir-package" value="${project.outdir}/${appName}.apk" />
- <!-- 初始化工作 -->
- <target name="init">
- <echo>Initializing all output directories...</echo>
- <delete dir="${outdir-bin}" />
- <delete dir="${outdir-gen}" />
- <mkdir dir="${outdir-gen}" />
- <mkdir dir="${outdir-bin}" />
- <mkdir dir="${outdir-classes}" />
- <!-- 把缺少的BuildConfig复制进去,暂时不知道如何生成 -->
- <copy file="ZI-master-BuildConfig.java" tofile="${outdir-gen}/com/yixia/zi/BuildConfig.java">
- <filterset>
- <filter token="CONFIG.FROM" value="${package.from}"/>
- </filterset>
- </copy>
- <copy file="VitamioBundle-BuildConfig.java" tofile="${outdir-gen}/com/yixia/vitamio/library/BuildConfig.java">
- <filterset>
- <filter token="CONFIG.FROM" value="${package.from}"/>
- </filterset>
- </copy>
- </target>
- <!-- 根据工程中的资源文件生成R.java文件 -->
- <target name="GenRJAVA" depends="init">
- <echo>Generating R.java / Manifest.java from the resources...</echo>
- <exec executable="${android-aapt}" failοnerrοr="true">
- <arg value="package" /><!-- package表示打包-->
- <arg value="-m" /><!--m,J,gen表示创建包名的目录和R.java到gen目录下 -->
- <arg value="-J" />
- <arg value="${outdir-gen}" />
- <arg value="-M" /><!-- M指定AndroidManifest.xml文件-->
- <arg value="${manifest-xml}" />
- <arg value="-S" /><!-- S指定res目录,生成对应的ID,可多个-->
- <arg value="${resource-dir}" />
- <arg value="-S" />
- <arg value="${library-dir}/res" /><!-- 注意点:同时需要调用Library的res-->
- <arg value="-S" />
- <arg value="${library-dir2}/res" /><!-- 注意点:同时需要调用Library的res-->
- <arg value="-I" /><!-- I指定android包的位置-->
- <arg value="${android-jar}" />
- <arg value="--auto-add-overlay" /> <!-- 这个重要,覆盖资源,不然报错-->
- </exec>
- <!-- 根据库应用中的资源文件生成R.java文件 -->
- <exec executable="${android-aapt}" failοnerrοr="true">
- <arg value="package" />
- <arg value="-m" />
- <arg value="--auto-add-overlay" />
- <arg value="-J" />
- <arg value="${outdir-gen}" />
- <arg value="-M" />
- <arg value="${library-dir}/AndroidManifest.xml" /><!-- 库应用的manifest-->
- <arg value="-S" />
- <arg value="${resource-dir}" />
- <arg value="-S" />
- <arg value="${library-dir}/res" />
- <arg value="-I" />
- <arg value="${android-jar}" />
- </exec>
- <!-- 根据库应用中的资源文件生成R.java文件 -->
- <exec executable="${android-aapt}" failοnerrοr="true">
- <arg value="package" />
- <arg value="-m" />
- <arg value="--auto-add-overlay" />
- <arg value="-J" />
- <arg value="${outdir-gen}" />
- <arg value="-M" />
- <arg value="${library-dir2}/AndroidManifest.xml" /><!-- 库应用的manifest-->
- <arg value="-S" />
- <arg value="${resource-dir}" />
- <arg value="-S" />
- <arg value="${library-dir2}/res" />
- <arg value="-I" />
- <arg value="${android-jar}" />
- </exec>
- </target>
- <!-- 将工程及库应用中的java源文件编译成class文件 -->
- <target name="compile" depends="GenRJAVA">
- <echo>Compiling java source code...</echo>
- <javac encoding="UTF-8" destdir="${outdir-classes}" bootclasspath="${android-jar}">
- <src path="${library-dir}/src" /><!-- 库应用源码 -->
- <src path="${outdir-gen}" /><!-- 生成的class文件全部保存到bin/classes目录下 -->
- <classpath>
- <fileset dir="${library-dir}/libs" includes="*.jar" /><!-- 第三方jar包需要引用,用于辅助编译 -->
- </classpath>
- </javac>
- <javac encoding="UTF-8" destdir="${outdir-classes}" bootclasspath="${android-jar}">
- <src path="${library-dir2}/src" /><!-- 库应用源码 -->
- <src path="${outdir-gen}" /><!-- 生成的class文件全部保存到bin/classes目录下 -->
- <classpath>
- <fileset dir="${library-dir2}/libs" includes="*.jar" /><!-- 第三方jar包需要引用,用于辅助编译 -->
- </classpath>
- </javac>
- <javac encoding="UTF-8" destdir="${outdir-classes}" bootclasspath="${android-jar}">
- <src path="${project.home}/src" /><!-- 工程源码-->
- <src path="${outdir-gen}" /><!-- 生成的class文件全部保存到bin/classes目录下 -->
- <classpath>
- <fileset dir="${library}" includes="*.jar" /><!-- 第三方jar包需要引用,用于辅助编译 -->
- </classpath>
- </javac>
- </target>
- <!-- 将.class文件转化成.dex文件 -->
- <target name="dex" depends="compile">
- <echo>Converting compiled files and external libraries into ${outdir-dx}test.dex...</echo>
- <exec executable="${android-dx}" failοnerrοr="true">
- <arg value="--dex" />
- <arg value="--output=${dex-ospath}" /><!-- 输出 -->
- <arg path="${outdir-classes}" /><!-- classes文件位置 -->
- <arg value="${library}" /> <!-- 把libs下所有jar打包 -->
- </exec>
- </target>
- <!-- 将资源文件放进输出目录 -->
- <target name="package-res-and-assets">
- <echo>Packaging resources and assets...</echo>
- <exec executable="${android-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}" />
- <arg value="-S"/>
- <arg value="${library-dir}/res"/>
- <arg value="-S"/>
- <arg value="${library-dir2}/res"/>
- <arg value="-A" /><!-- asset目录也打包 -->
- <arg value="${asset-dir}" />
- <arg value="-I" />
- <arg value="${android-jar}" />
- <arg value="-F" /><!-- 输出资源压缩包 -->
- <arg value="${resources-package}" />
- <arg value="--auto-add-overlay" />
- </exec>
- </target>
- <!-- 打包成未签证的apk -->
- <target name="package" depends="dex,package-res-and-assets">
- <echo>Packaging unsigned apk for release...</echo>
- <exec executable="${android-apkbuilder}" >
- <arg value="${out-unsigned-package-ospath}" /><!-- 输出 -->
- <arg value="-u" /><!-- u指创建未签名的包-->
- <arg value="-z" /><!-- 资源压缩包 -->
- <arg value="${resources-package-ospath}" />
- <arg value="-f" /><!-- dex文件 -->
- <arg value="${dex-ospath}" />
- <arg value="-nf"/><!-- 把libs下的so库打包 -->
- <arg value="${library}" />
- </exec>
- <echo>It will need to be signed with jarsigner before being published.</echo>
- </target>
- <!-- 对apk进行签证 -->
- <target name="jarsigner" depends="package">
- <echo>Packaging signed apk for release...</echo>
- <exec executable="${android-jarsigner}" failοnerrοr="true">
- <arg value="-keystore" />
- <arg value="${keystore-file}" />
- <arg value="-storepass" />
- <arg value="111111" /><!-- 验证密钥完整性的口令,创建时建立的 -->
- <arg value="-keypass" />
- <arg value="111111" /> <!-- 专用密钥的口令,就是key密码 -->
- <arg value="-signedjar" />
- <arg value="${out-signed-package-ospath}" /><!-- 输出 -->
- <arg value="${out-unsigned-package-ospath}" /><!-- 未签名的apk -->
- <!-- 不要忘了证书的别名 -->
- <arg value="kunshan" />
- </exec>
- </target>
- <!-- 优化 -->
- <target name="optimize-app" depends="jarsigner">
- <echo> optimizing the application...</echo>
- <exec executable="${android-zipalign}">
- <arg value="-v" />
- <arg value="-f" />
- <arg value="4" />
- <arg value="${out-signed-package-ospath}" />
- <arg value="${zipalign-signed-package}" />
- </exec>
- </target>
- <!-- 发布 -->
- <target name="release" depends="optimize-app">
- <!-- 删除未签证apk -->
- <delete file="${out-unsigned-package-ospath}" />
- <echo>APK is released. path:${out-signed-package-ospath}</echo>
- <copy file="${out-signed-package-ospath}" tofile="${outdir-package}"></copy>
- <echo>APK is copy to path:${outdir-package}</echo>
- </target>
- </project>
其中 动态库so文件目录 我是没用到了,不过 第三方library 我是用到了两个,所以定义了两个,注意,我们的两个library里面有依赖关系,
library-dir2依赖library-dir
重点1,资源文件打包:
根据工程中的资源文件生成R.java文件,我会把library中的res和library2中的res都打包到我的最终目录中。(具体自己看代码)
重点2,src文件打包:
同样的道理,复制两份,自己看代码应该看得明白。
重点3:这时我们来运行ant命令来打包了,打包资源文件的时候很容易打包,没有报错,但是打包src文件的时候,会提示找不到BuildConfig.java
原来我使用了ZI-master,代码里面会使用到gen下的BuildConfig.java,但是我们的ant命令并没有生成BuildConfig.java,只能生成R.java。
好蛋疼,网上搜到了一个BuildConfig模板的解决方案,但是不好用,于是我想到了一个复制的方法,手动写死把代码复制进去。
来源,俺的博客: http://www.phpwind.me/54151.html