Ant 多dex打包解决方法
原因:因为是eclipse老项目,调研了很久,尝试了很多种方法还是没有解决eclipse运行是加载多dex的方法,我估摸着大概需要改eclipse,关键方法还是在dx文件生成dex这里,dx是支持多dex的,个人认为IDE自己默认是用的单dex,不支持多dex。没办法,搞点心思把老项目迁移到as上开发吧,eclipse工程本身转as工程也很简单,这里不说明,网上一搜一堆,下面说说ant多dex的脚本。
1、ant中使用到了foreach使用
ant中使用到了foreach需要单独下载使用:ant-contrib-1.0b3.jar,并且在脚本中使用,路径使用自己的就可以了:
<!-- ant foreach used -->
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${basedir}/ant-contrib-1.0b3.jar"></pathelement>
</classpath>
</taskdef>
2、ant脚本中环境配置
<!-- 项目编译环境配置 -->
<!-- android sdk 和 java jdk环境配置 -->
<property name="sdk_dir" value="自己的sdk的路径"/>
<property name="platform-folder" value="${sdk_dir}/platforms/android-19" />
<property name="platform-tools-folder" value="${sdk_dir}/build-tools/21.1.2" />
<property name="jdk-folder" value="${java-jdk-dir}" />
<property name="android-jar" value="${platform-folder}/android.jar" />
<property name="tools.aapt" value="${platform-tools-folder}/aapt.exe" />
<property name="tools.dx" value="${platform-tools-folder}/dx.bat" />
<property name="tools.jarsigner" value="${jdk-folder}/bin/jarsigner.exe" />
<!-- 项目输入目录配置:basedir是当前项目的路径 -->
<property name="assets" value="${basedir}/assets" />
<property name="res" value="${basedir}/res" />
<property name="src" value="${basedir}/src" />
<property name="libs" value="${basedir}/libs" />
<!-- 项目输出目录配置 -->
<property name="bin" value="${basedir}/bin" />
<property name="gen" value="${basedir}/gen" />
<property name="manifest" value="${basedir}/AndroidManifest.xml" />
<!-- 生成文件放置地方 -->
<property name="main-dex-name" value="${bin}/classes.dex" />
<property name="package-temp-name" value="${bin}/${ant.project.name}.arsc" />
<!-- 未签名包 -->
<property name="unsigned-apk-name" value="自己的apk的名字-release_unsigned.apk" />
<property name="unsigned-apk-path" value="${bin}/${unsigned-apk-name}" />
<!-- 签名包 -->
<property name="signed-apk-name" value="自己的apk的名字-release.apk" />
<property name="signed-apk-path" value="${bin}/${signed-apk-name}" />
<!-- keystore -->
<property name="key.store" value="${keystore-file}" />
<property name="key.store.password" value="${keystore-pass}" />
<property name="key.alias" value="${keyalias}" />
<property name="key.alias.password" value="${keypass}" />
<!-- 如果类必须生成在主dex请添加到这里 -->
<property name="main-dex-rule" value="${basedir}/main-dex-rule.txt" />
<!-- compilation options -->
<property name="java.encoding" value="UTF-8" />
<property name="java.target" value="1.5" />
<property name="java.source" value="1.5" />
<property name="java.compilerargs" value="" />
<property name="java.compiler.classpath" value="" />
<property name="source.dir" value="src" />
<property name="source.absolute.dir" location="${source.dir}" />
<property name="gen.absolute.dir" location="gen" />
<property name="out.dir" value="bin" />
<property name="out.classes.absolute.dir" location="${out.dir}/classes" />
3、ant进行多dex打包,先生成多个dex,然后在生成签名apk前将多个dex添加到未签名apk中
<!-- 构建多分包dex文件 -->
<target
name="multi-dex"
depends="compile" >
<echo message="Generate multi-dex..." />
<exec
executable="${tools.dx}"
failonerror="true" >
<arg value="--dex" />
<arg value="--multi-dex" />
<!-- 多分包命令,每个包最大的方法数为40000 -->
<arg value="--set-max-idx-number=40000" />
<arg value="--main-dex-list" />
<!-- 主包包含class文件列表 -->
<arg value="${main-dex-rule}" />
<arg value="--minimal-main-dex" />
<arg value="--output=${bin}" />
<!-- 把bin下所有class打包 -->
<arg value="${bin}" />
<!-- 把libs下所有jar打包 -->
<arg value="${libs}" />
</exec>
</target>
<!-- 循环遍历bin目录下的所有dex文件 -->
<target
name="add-subdex-toapk"
depends="copy_dex" >
<echo message="Add subdex to apk..." />
<foreach
param="dir.name"
target="aapt-add-dex"
inheritAll="true">
<path>
<fileset
dir="${bin}"
includes="classes*.dex" />
</path>
</foreach>
</target>
<!-- 使用aapt命令添加dex文件 -->
<target name="aapt-add-dex">
<echo message="${dir.name}" />
<echo message="excute app" />
<!-- 使用正则表达式获取classes的文件名 -->
<propertyregex
casesensitive="false"
input="${dir.name}"
property="dexfile"
regexp="classes(.*).dex"
select="\0" />
<if>
<equals
arg1="${dexfile}"
arg2="classes.dex" />
<then>
<echo> ${dexfile} is not handle </echo>
</then>
<else>
<echo> ${dexfile} is handle </echo>
<exec
executable="${tools.aapt}"
failonerror="true" >
<arg value="add" />
<arg value="${unsigned-apk-path}" />
<arg value="${dexfile}" />
</exec>
</else>
</if>
<delete file="${basedir}/${dexfile}" />
</target>
<!-- 拷贝文件到apk项目的根目录下 -->
<target
name="copy_dex"
depends="build-unsigned-apk" >
<echo message="copy dex..." />
<copy todir="${basedir}" >
<fileset dir="${bin}" >
<include name="classes*.dex" />
</fileset>
</copy>
</target>
4、项目集成MultiDex
既然是多dex了,需要再项目中添加MultiDex的优化,这里不赘述