原标题:彻底掌握Android多分包技术MultiDex-用Ant和Gradle分别构建(一)

Andrid多分包技术在大型项目编译方面起着至关重要的作用,作为一个高级开发者我们有必要掌握此技能,现在我带领大家统一学习此项技能,并教会大家分别使用Ant和Gradle构建。

什么是Dex

Dex是Dalvik VM executes的全称,即Android Dalvik执行程序。在Android中单个Dex文件所能包含的最大方法数为65536,这包含Android FrameWork、依赖的Jar包,以及应用本身的代码中所有的方法。

65536产生的原因

Android系统中,一个Dex文件中存储方法id用的是short类型数据,所以导致你的dex中方法不能超过65536

在2.3系统之前,虚拟机内存只分配了5M

多分包技术的应用

一句话为了解决单个dex包65536方法数限制问题

针对于65536的问题,我们在应用层是无法改变Android系统的结构的,所以我们无法将数据类型从short改变为int或者其他类型,也就是说一个dex中的方法数不能超过65536是我们无法逾越的鸿沟,我们只能通过优化项目代码达到减少一个dex中的方法数的目的,但是随着时间的推移和功能的增加,总有一天还是会出现方法数超过65536的情况,因此根据谷歌官方建议,我们使用多分包技术。

其实我们日常使用的大多数软件都使用到了多分包技术,比如下面就是我们解压了一款知名应用的APK包,我们可以看到他们使用了多分包技术,APK中包含三个dex文件,分别是classes.dex,classes2.dex,classes3.dex

本篇博客首先给大家讲解使用ant构建。

Ant构建MultiDex

Ant是一种基于Java的build工具。理论上来说,它有些类似于(Unix)C中的make ,但没有make的缺陷。

(一)搭建Ant编译环境

下载后,我们解压到指定路径,这里我解压到D盘

2.配置NDK环境变量

打开我的电脑–属性–高级–环境变量

新建系统变量ANT_HOME

变量名:ANT_HOME

变量值:D:\apache-ant-1.9.7

选择“系统变量”中变量名为“Path”的环境变量,双击该变量,把ANT安装目录的绝对路径,添加到Path变量的值中,并使用半角的分号和已有的路径进行分隔。

变量名:Path

变量值:%ANT_HOME%\bin;

完成以上操作后,ANT环境变量配置结束,我们测试环境变量的配置成功与否。在cmd命令行窗口输入“ant -version”,输出以下信息即为配置正确。如图:

(二)编写Ant构建脚本

通常我们的Ant构建文件都放在SDK根目录下的tools夹下,在里面我们找到ant目录,进去后找到buildxml文件。

这里我们可以把这个build.xml文件拷贝到项目目录中去,然后进行修改。

下面是我配置的build.xml源码

name="MultiDex"

default="release" >

name="sdk-folder"

value="D:\adt-bundle-windows-x86_64-20140702\sdk" />

name="platform-folder"

value="${sdk-folder}\platforms\android-20" />

name="platform-tools-folder"

value="${sdk-folder}\build-tools\android-4.4W" />

name="jdk-folder"

value="C:\Program Files\Java\jdk1.7.0_17" />

name="android-jar"

value="${platform-folder}\android.jar" />

name="tools.aapt"

value="${platform-tools-folder}/aapt.exe" />

name="tools.javac"

value="${jdk-folder}\bin\javac.exe" />

name="tools.dx"

value="${platform-tools-folder}\dx.bat" />

name="tools.apkbuilder"

value="${sdk-folder}\tools\apkbuilder.bat" />

name="tools.jarsigner"

value="${jdk-folder}\bin\jarsigner.exe" />

name="project-dir"

value="." />

name="assets"

value="${project-dir}\assets" />

name="res"

value="${project-dir}\res" />

name="src"

value="${project-dir}\src" />

name="libs"

value="${project-dir}\libs" />

name="bin"

value="${project-dir}\bin" />

name="gen"

value="${project-dir}\gen" />

name="manifest"

value="${project-dir}\AndroidManifest.xml" />

name="java-file-gen"

value="${gen}\com\castiel\demo\*.java" />

name="java-file-src"

value="${src}\com\castiel\demo\*.java" />

name="main-dex-name"

value="${bin}\classes.dex" />

name="sub-dex-name"

value="${bin}\classes2.dex" />

name="package-temp-name"

value="${bin}\${ant.project.name}.arsc" />

name="unsigned-apk-name"

value="${ant.project.name}_unsigned.apk" />

name="unsigned-apk-path"

value="${bin}\${unsigned-apk-name}" />

name="signed-apk-name"

value="${ant.project.name}.apk" />

name="signed-apk-path"

value="${bin}\${signed-apk-name}" />

name="keystore-name"

value="${project-dir}\castiel_key.keystore" />

name="keystore-alias"

value="castiel" />

name="main-dex-rule"

value="${project-dir}\main-dex-rule.txt" />

name="gen-R"

depends="init" >

executable="${tools.aapt}"

failοnerrοr="true" >

name="compile"

depends="gen-R" >

bootclasspath="${android-jar}"

compiler="javac1.7"

destdir="${bin}"

encoding="utf-8"

includeantruntime="false"

listfiles="true"

target="1.7" >

dir="${libs}"

includes="*.jar" />

name="multi-dex"

depends="compile" >

executable="${tools.dx}"

failοnerrοr="true" >

name="package"

depends="multi-dex" >

executable="${tools.aapt}"

failοnerrοr="true" >

name="build-unsigned-apk"

depends="package" >

classname="com.android.sdklib.build.ApkBuilderMain"

classpath="${sdk-folder}/tools/lib/sdklib.jar" >

name="copy_dex"

depends="build-unsigned-apk" >

name="add-subdex-toapk"

depends="copy_dex" >

param="dir.name"

target="aapt-add-dex" >

dir="${bin}"

includes="classes*.dex" />

casesensitive="false"

input="${dir.name}"

property="dexfile"

regexp="classes(.*).dex"

select="\0" />

arg1="${dexfile}"

arg2="classes.dex" />

${dexfile} is not handle

${dexfile} is handle

executable="${tools.aapt}"

failοnerrοr="true" >

name="sign-apk"

depends="add-subdex-toapk" >

executable="${tools.jarsigner}"

failοnerrοr="true" >

name="release"

depends="sign-apk" >

APK is released.path:${signed-apk-path}

为了方便大家理解,这里我们对build的流程进行分析,详见下图:

main-dex-rule.txt

该文件中只放置了一个class文件

com/castiel/demo/MainActivity.class

ant编译前整个项目结构

ant脚本编译过程

在执行cmd命令,进入项目根目录路径,然后执行ant命令

编译成功后,解压APK可以看到我们成功的实现了多分包技术,生成两个dex文件。

最后成功运行项目

android 蓝牙传输分包,彻底掌握Android多分包技术(一)相关推荐

  1. android蓝牙传输文件时的文件格式限制及其解决方法

    出于安全考虑,android蓝牙在传输文件时对文件格式有限制,默认情况下,并不是所有文件都能够传输和共享. 在packages/apps/Bluetooth下面的AndroidManifest.xml ...

  2. android蓝牙传输脉冲,一种基于Android操作系统的激光测距仪蓝牙通信方法与流程...

    本发明属于无线通信技术领域,涉及Android操作系统的应用,具体涉及一种基于Android操作系统的激光测距仪蓝牙通信方法. 背景技术: 目前,随着智能设备的普及,智能操作系统得到了极大的发展,An ...

  3. android常见的面试题,Android常见笔试面试题

    一.JAVA部分: (挂起) 二.Android部分: 1.Android系统的架构 2.Android常用的五大布局 3.Android四大组件是什么 4.Activity的生命周期 5.Activ ...

  4. Android系统(168)---Android 开源项目分类汇总

    Android开源项目分类汇总 原网址:https://blog.csdn.net/prince77qiqiqq/article/details/51338330 Android 开源项目第一篇--个 ...

  5. Android 第三方库--2017年Android开源项目及库汇总

    转自:http://blog.csdn.net/jsonnan/article/details/62215287 东西有点多,但是资源绝对nice,自己都全部亲身体验过了,大家可放心使用 github ...

  6. 视频教程-FFmpeg打造Android万能音频播放器-Android

    FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...

  7. Android核心服务解析篇(二)——Android源码结构分析

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 获得Android源码后,我们来分析源码结构.源码的全部工程分为如下三个部分. ①Core Project:核心工程部分,这是建 ...

  8. android 9 pie公司,谷歌Android 9 Pie,真正的安卓派

    IT之家8月7日消息 今天谷歌正式宣布了Android 9 Pie正式版系统,此前的Android P终于定名为Android Pie,该更新首先面向谷歌Pixel设备和Essential Phone ...

  9. android控件触摸缩放,Android控件之ZoomControls缩放使用

    先看一下效果 正常 缩小 放大 一.简介 ZoomControls是一组可缩放的控件.它包含俩个按钮(放大按钮.缩小按钮) 二.重要方法 hasFocus():判断焦点 hide():隐藏 onTou ...

最新文章

  1. Windows10+Anaconda3+Pycharm环境搭建
  2. 一张图看懂中科大、国科大、中科院、社科院、上科大之间的关系
  3. sj 网页前端与后台数据交互的3种方式
  4. 2021长安二中高考成绩查询,长安一中、长安二中,2017年高考上线喜报!
  5. Java 基本数据类型
  6. SAP LSMW批导数据的几个注意点
  7. 车用TVS管 SM8S系列 国产替代
  8. Oracle错误集!
  9. matlab regionprops区域属性信息
  10. Enterprise Library2.0研究(一)日志组件的使用场景
  11. mysql crc16_MySQL 5.6 中TIMESTAMP with implicit DEFAULT value is deprecated错误
  12. sql日期大于某天_(十五)sql/Linux 小技巧
  13. 7805急剧发热,可能是什么原因?
  14. GetUserName()第二个参数中指明缓冲区长度
  15. mcgs组态软件中字体如果从左到右变化_MCGS脚本程序 (2)
  16. android双击回到顶部,Android之双击回到顶部
  17. 【Matlab 六自由度机器人】运动学逆解(附MATLAB机器人逆解代码)
  18. 遥感影像地图编制流程
  19. 写了一个Mac快速设置、打开和关闭Web代理的Shell命令
  20. java会变得更简单吗_spring 第一篇(1-1):让java开发变得更简单(下)

热门文章

  1. RHEL5.4 iptables 配置详解(图)
  2. PA银行面试之炮灰之程
  3. CSS3 总结(一)
  4. MySQL无法修改字段
  5. windows配置java运行环境
  6. Linux下Web网站压力测试工具Webbench
  7. JSONP跨域请求数据报错 “Unexpected token :”的解决办法
  8. 数据加密和OpenSSL
  9. 嘿嘿,又中毒了spoolsv.exe
  10. Unsupported major.minor version 51.0解决办法