android 蓝牙传输分包,彻底掌握Android多分包技术(一)
原標(biāo)題:徹底掌握Android多分包技術(shù)MultiDex-用Ant和Gradle分別構(gòu)建(一)
Andrid多分包技術(shù)在大型項(xiàng)目編譯方面起著至關(guān)重要的作用,作為一個(gè)高級(jí)開(kāi)發(fā)者我們有必要掌握此技能,現(xiàn)在我?guī)ьI(lǐng)大家統(tǒng)一學(xué)習(xí)此項(xiàng)技能,并教會(huì)大家分別使用Ant和Gradle構(gòu)建。
什么是Dex
Dex是Dalvik VM executes的全稱(chēng),即Android Dalvik執(zhí)行程序。在Android中單個(gè)Dex文件所能包含的最大方法數(shù)為65536,這包含Android FrameWork、依賴(lài)的Jar包,以及應(yīng)用本身的代碼中所有的方法。
65536產(chǎn)生的原因
Android系統(tǒng)中,一個(gè)Dex文件中存儲(chǔ)方法id用的是short類(lèi)型數(shù)據(jù),所以導(dǎo)致你的dex中方法不能超過(guò)65536
在2.3系統(tǒng)之前,虛擬機(jī)內(nèi)存只分配了5M
多分包技術(shù)的應(yīng)用
一句話(huà)為了解決單個(gè)dex包65536方法數(shù)限制問(wèn)題
針對(duì)于65536的問(wèn)題,我們?cè)趹?yīng)用層是無(wú)法改變Android系統(tǒng)的結(jié)構(gòu)的,所以我們無(wú)法將數(shù)據(jù)類(lèi)型從short改變?yōu)閕nt或者其他類(lèi)型,也就是說(shuō)一個(gè)dex中的方法數(shù)不能超過(guò)65536是我們無(wú)法逾越的鴻溝,我們只能通過(guò)優(yōu)化項(xiàng)目代碼達(dá)到減少一個(gè)dex中的方法數(shù)的目的,但是隨著時(shí)間的推移和功能的增加,總有一天還是會(huì)出現(xiàn)方法數(shù)超過(guò)65536的情況,因此根據(jù)谷歌官方建議,我們使用多分包技術(shù)。
其實(shí)我們?nèi)粘J褂玫拇蠖鄶?shù)軟件都使用到了多分包技術(shù),比如下面就是我們解壓了一款知名應(yīng)用的APK包,我們可以看到他們使用了多分包技術(shù),APK中包含三個(gè)dex文件,分別是classes.dex,classes2.dex,classes3.dex
本篇博客首先給大家講解使用ant構(gòu)建。
Ant構(gòu)建MultiDex
Ant是一種基于Java的build工具。理論上來(lái)說(shuō),它有些類(lèi)似于(Unix)C中的make ,但沒(méi)有make的缺陷。
(一)搭建Ant編譯環(huán)境
下載后,我們解壓到指定路徑,這里我解壓到D盤(pán)
2.配置NDK環(huán)境變量
打開(kāi)我的電腦–屬性–高級(jí)–環(huán)境變量
新建系統(tǒng)變量ANT_HOME
變量名:ANT_HOME
變量值:D:\apache-ant-1.9.7
選擇“系統(tǒng)變量”中變量名為“Path”的環(huán)境變量,雙擊該變量,把ANT安裝目錄的絕對(duì)路徑,添加到Path變量的值中,并使用半角的分號(hào)和已有的路徑進(jìn)行分隔。
變量名:Path
變量值:%ANT_HOME%\bin;
完成以上操作后,ANT環(huán)境變量配置結(jié)束,我們測(cè)試環(huán)境變量的配置成功與否。在cmd命令行窗口輸入“ant -version”,輸出以下信息即為配置正確。如圖:
(二)編寫(xiě)Ant構(gòu)建腳本
通常我們的Ant構(gòu)建文件都放在SDK根目錄下的tools夾下,在里面我們找到ant目錄,進(jìn)去后找到buildxml文件。
這里我們可以把這個(gè)build.xml文件拷貝到項(xiàng)目目錄中去,然后進(jìn)行修改。
下面是我配置的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}
為了方便大家理解,這里我們對(duì)build的流程進(jìn)行分析,詳見(jiàn)下圖:
main-dex-rule.txt
該文件中只放置了一個(gè)class文件
com/castiel/demo/MainActivity.class
ant編譯前整個(gè)項(xiàng)目結(jié)構(gòu)
ant腳本編譯過(guò)程
在執(zhí)行cmd命令,進(jìn)入項(xiàng)目根目錄路徑,然后執(zhí)行ant命令
編譯成功后,解壓APK可以看到我們成功的實(shí)現(xiàn)了多分包技術(shù),生成兩個(gè)dex文件。
最后成功運(yùn)行項(xiàng)目
總結(jié)
以上是生活随笔為你收集整理的android 蓝牙传输分包,彻底掌握Android多分包技术(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小程序 delete_程序员崩溃的43个
- 下一篇: android gridlayout动态