Ant 多dex打包解决方法

本文介绍了如何使用Ant解决老项目因dex数量过多导致的问题,详细讲述了ant中foreach的使用、环境配置、多dex打包步骤以及项目集成MultiDex的优化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的优化,这里不赘述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值