android 蓝牙传输分包,彻底掌握Android多分包技术(一)
原標題:徹底掌握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多分包技术(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序 delete_程序员崩溃的43个
- 下一篇: android gridlayout动态