日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2025/3/15 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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多分包技术(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。