日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/3/15 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 蓝牙传输分包,彻底掌握Android多分包技术(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。