ant脚本实现的Android自动编译
2014-03-25 15:05
429 查看
最近用ant脚本实现的Android自动编译,已测试通过!
<?xmlversion="1.0" encoding="UTF-8"?>
<!--
1、拷贝当前项目到临时目录
2、修改 AndroidManifest.xml包名
3、生成新的R文件
4、编译
5、生成dex文件
6、打包资源文件
7、APK打包
-->
<project name="build"default="packageAPK" basedir=".">
<property name="sdk.dir"location="D:/environment/android-sdk_r20.0.3-windows" />
<propertyname="project_org.dir" value="D:/workspace/AutomaticCoding"/>
<propertyname="old_package_name" value="com.oldproject.test" />
<propertyname="new_package_name" value="com.newproject.test" />
<propertyname="sdk.platformtools" value="${sdk.dir}/platform-tools"/>
<property name="sdk.tools"value="${sdk.dir}/tools" />
<property name="aapt"value="${sdk.platformtools}/aapt.exe" />
<property name="adb"value="${sdk.platformtools}/adb.exe" />
<property name="dx"value="${sdk.platformtools}/dx.bat" />
<property name="apkbuilder"value="${sdk.tools}/apkbuilder.bat" />
<property name="android.jar"value="${sdk.dir}/platforms/android-14/android.jar" />
<property name="build.dir"value="${project_org.dir}/build" />
<property name="project.dir"value="${project_org.dir}/temp" />
<property name="classes.dir"value="${project.dir}/bin/classes" />
<propertyname="buildtemp.dir" value="${project.dir}/build" />
<property name="src.dir"value="${project.dir}/src" />
<property name="res.dir"value="${project.dir}/res" />
<property name="gen.dir"value="${project.dir}/gen" />
<property name="asset.dir"value="${project.dir}/assets" />
<!-- 设置路径和初始化环境-->
<pathid="android.antlibs">
<pathelementpath="${sdk.dir}/tools/lib/anttasks.jar"/>
<pathelementpath="${sdk.dir}/tools/lib/sdklib.jar"/>
<pathelementpath="${sdk.dir}/tools/lib/androidprefs.jar"/>
</path>
<!--android 环境的建立-->
<!-- <taskdefname="setup" classname="com.android.ant.SetupTask"classpathref="android.antlibs"/> -->
<!-- 初始化-->
<targetname="init">
<deletedir="${build.dir}"></delete>
<mkdirdir="${build.dir}"/>
<deletedir="${project.dir}"></delete>
<mkdirdir="${project.dir}"/>
<copytodir="${project.dir}">
<filesetdir="${project_org.dir}" includes="**/*"/>
</copy>
<!--替换包名打包不同应用-->
<replaceregexp flags="g"encoding="UTF-8" byline="true">
<regexppattern="package(.*)${old_package_name}"/>
<substitutionexpression="package="${new_package_name}"/>
<fileset dir="${project.dir}"includes="AndroidManifest.xml"/>
</replaceregexp>
<replaceregexp flags="g"encoding="UTF-8" byline="true">
<regexppattern="authorities(.*)${old_package_name}"/>
<substitutionexpression="authorities="${new_package_name}"/>
<fileset dir="${project.dir}"includes="AndroidManifest.xml"/>
</replaceregexp>
<replaceregexp flags="g"encoding="UTF-8" byline="true">
<regexppattern="import(.*)${old_package_name}.R\b"/>
<substitution expression="import ${new_package_name}.R"/>
<fileset dir="${project.dir}/src" includes="**/*.java"/>
</replaceregexp>
</target>
<!--生成R.java文件${sdk.dir}\platform-tools\aapt.exe-->
<targetname="genRJava">
<execexecutable="${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>
<!-- 项目编译-->
<targetname="compile" >
<javacencoding="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>
<fileset dir="${sdk.dir}/tools/support" includes="*.jar">
</fileset>
</classpath>
</javac>
</target>
<!-- 生成dex文件${sdk.dir}\platform-tools\dx.bat -->
<target name="dex">
<applyexecutable="${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 -->
<targetname="packageRes">
<execexecutable="${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-->
<targetname="packageAPK"depends="init,genRJava,compile,dex,packageRes">
<!-- 打包-->
<execexecutable="${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>
<!-- 签名-->
<exec executable="jarsigner">
<arg value="-keystore" />
<arg value="test.keystore" />
<arg value="-storepass" />
<arg value="123456" />
<arg value="-keypass" />
<arg value="123456" />
<arg value="-signedjar" />
<arg value="${buildtemp.dir}/newproject.apk" />
<arg value="${buildtemp.dir}/unsigntest.apk" />
<arg value="test.keystore" />
</exec>
</target>
</project>
解决Couldn'tload XXX: findLibrary returned null加载.so文件失败的问题
只要将上面代码
<arg value="-rj"/>
<argvalue="${project.dir}/libs"/>
改为
<arg value="-nf"/> <!--这个参数就是要求打入so文件,后面的参数是具体路径-->
<argvalue="${project.dir}/libs"/>
就可以了
<?xmlversion="1.0" encoding="UTF-8"?>
<!--
1、拷贝当前项目到临时目录
2、修改 AndroidManifest.xml包名
3、生成新的R文件
4、编译
5、生成dex文件
6、打包资源文件
7、APK打包
-->
<project name="build"default="packageAPK" basedir=".">
<property name="sdk.dir"location="D:/environment/android-sdk_r20.0.3-windows" />
<propertyname="project_org.dir" value="D:/workspace/AutomaticCoding"/>
<propertyname="old_package_name" value="com.oldproject.test" />
<propertyname="new_package_name" value="com.newproject.test" />
<propertyname="sdk.platformtools" value="${sdk.dir}/platform-tools"/>
<property name="sdk.tools"value="${sdk.dir}/tools" />
<property name="aapt"value="${sdk.platformtools}/aapt.exe" />
<property name="adb"value="${sdk.platformtools}/adb.exe" />
<property name="dx"value="${sdk.platformtools}/dx.bat" />
<property name="apkbuilder"value="${sdk.tools}/apkbuilder.bat" />
<property name="android.jar"value="${sdk.dir}/platforms/android-14/android.jar" />
<property name="build.dir"value="${project_org.dir}/build" />
<property name="project.dir"value="${project_org.dir}/temp" />
<property name="classes.dir"value="${project.dir}/bin/classes" />
<propertyname="buildtemp.dir" value="${project.dir}/build" />
<property name="src.dir"value="${project.dir}/src" />
<property name="res.dir"value="${project.dir}/res" />
<property name="gen.dir"value="${project.dir}/gen" />
<property name="asset.dir"value="${project.dir}/assets" />
<!-- 设置路径和初始化环境-->
<pathid="android.antlibs">
<pathelementpath="${sdk.dir}/tools/lib/anttasks.jar"/>
<pathelementpath="${sdk.dir}/tools/lib/sdklib.jar"/>
<pathelementpath="${sdk.dir}/tools/lib/androidprefs.jar"/>
</path>
<!--android 环境的建立-->
<!-- <taskdefname="setup" classname="com.android.ant.SetupTask"classpathref="android.antlibs"/> -->
<!-- 初始化-->
<targetname="init">
<deletedir="${build.dir}"></delete>
<mkdirdir="${build.dir}"/>
<deletedir="${project.dir}"></delete>
<mkdirdir="${project.dir}"/>
<copytodir="${project.dir}">
<filesetdir="${project_org.dir}" includes="**/*"/>
</copy>
<!--替换包名打包不同应用-->
<replaceregexp flags="g"encoding="UTF-8" byline="true">
<regexppattern="package(.*)${old_package_name}"/>
<substitutionexpression="package="${new_package_name}"/>
<fileset dir="${project.dir}"includes="AndroidManifest.xml"/>
</replaceregexp>
<replaceregexp flags="g"encoding="UTF-8" byline="true">
<regexppattern="authorities(.*)${old_package_name}"/>
<substitutionexpression="authorities="${new_package_name}"/>
<fileset dir="${project.dir}"includes="AndroidManifest.xml"/>
</replaceregexp>
<replaceregexp flags="g"encoding="UTF-8" byline="true">
<regexppattern="import(.*)${old_package_name}.R\b"/>
<substitution expression="import ${new_package_name}.R"/>
<fileset dir="${project.dir}/src" includes="**/*.java"/>
</replaceregexp>
</target>
<!--生成R.java文件${sdk.dir}\platform-tools\aapt.exe-->
<targetname="genRJava">
<execexecutable="${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>
<!-- 项目编译-->
<targetname="compile" >
<javacencoding="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>
<fileset dir="${sdk.dir}/tools/support" includes="*.jar">
</fileset>
</classpath>
</javac>
</target>
<!-- 生成dex文件${sdk.dir}\platform-tools\dx.bat -->
<target name="dex">
<applyexecutable="${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 -->
<targetname="packageRes">
<execexecutable="${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-->
<targetname="packageAPK"depends="init,genRJava,compile,dex,packageRes">
<!-- 打包-->
<execexecutable="${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>
<!-- 签名-->
<exec executable="jarsigner">
<arg value="-keystore" />
<arg value="test.keystore" />
<arg value="-storepass" />
<arg value="123456" />
<arg value="-keypass" />
<arg value="123456" />
<arg value="-signedjar" />
<arg value="${buildtemp.dir}/newproject.apk" />
<arg value="${buildtemp.dir}/unsigntest.apk" />
<arg value="test.keystore" />
</exec>
</target>
</project>
解决Couldn'tload XXX: findLibrary returned null加载.so文件失败的问题
只要将上面代码
<arg value="-rj"/>
<argvalue="${project.dir}/libs"/>
改为
<arg value="-nf"/> <!--这个参数就是要求打入so文件,后面的参数是具体路径-->
<argvalue="${project.dir}/libs"/>
就可以了
相关文章推荐
- Android 自动化发布—采用Ant打包的完美实现:编译、合并、签名、混淆、优化、自动运行
- ant脚本实现自动编译
- 利用Ant 做Android自动化编译实现自动签名, 以及一次生成多个渠道版本.
- android 应用 Ant脚本自动编译、打包、代码混淆、签名、安装等
- 通过ant脚本编译打包android工程
- Android_Ant_多渠道打包/一键自动编译 ——Mac lion 10.8.2下
- android开发之采用perl脚本语言开发ota差异包自动编译脚本
- Android - Ant自动编译打包android项目 -- 1(转)
- Ant自动编译打包&发布 android项目
- 在Eclipse里实现Ant自动编译
- [Android] mac上申请签名及使用ant自动编译打包签名APK
- 脚本ANT自动打包Android应用(方便多渠道发布)
- Android ant自动打包脚本:自动替换友盟渠道、版本号、包名
- 通过ant脚本,编译打包android工程
- android编译打包(用ant脚本打包)
- 通过ant脚本编译打包android工程
- 用ant实现自动打包android(二) -- android代码混淆
- Android ant自动打包脚本:自动替换友盟渠道、版本号、包名
- gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)
- Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式