1. 程式人生 > >多Dex載入方案對比

多Dex載入方案對比

隨著業務擴張,程式碼量越來越大,apk中單個dex方法數超過65K,就需要dex分包,Google官方推出了MultiDex來解決65K的問題,區分不同的Android虛擬機器,會有一些問題。

Dalvik上,使用JIT(just in time),應用執行時,需要先將dex轉換成os上可以執行的機器碼,在此過程中,還會對dex檔案進行優化(dexopt),因此在應用第一次啟動時,會經歷這些過程,apk解壓->dexopt->載入dex->位元組碼轉換->啟動,在載入dex過程中,安裝第二個dex之後的dex涉及到io操作,在dex載入完成之前,應用需要一直等待,此過程耗時較長,如果dex檔案過大,還會造成ANR;

ART上,使用oat(Ahead of time),在應用安裝時,dex就會被解壓優化完成,轉換成可執行的機器碼,之後應用在啟動時,只需要載入機器碼即可,所以不會出現啟動ANR的問題。

為了解決Dalvik上冷啟動慢的問題,通常的方法是自定義第二個dex的載入流程,常用方案有以下幾種:

方案

原理

接入技術難度

優點

不足

風險

方案

原理

接入技術難度

優點

不足

風險

Google MultiDex

第一個啟動的程序的主執行緒上解壓安裝,同步執行,dex全部安裝完成之後,啟動應用

最簡單

dex載入完成之後,應用才真正開始執行,不會出現NoClassDefFoundError

啟動慢

dex檔案過大時,在低配裝置上可能會出現ANR、黑屏

微信/QQ

1、將dex檔案放在assets資料夾下,載入前校驗md5(官方沒校驗);

2、四大元件的直接間接依賴都直接放在主dex中;

3、判斷是否已經dexopt,若已經dexopt,即放在attachBaseContext載入,反之放於地球中用執行緒載入(若判斷revision改變,即將dex以及dexopt目錄清空。只需簡單判斷兩個目錄dex名稱、數量是否與配置檔案的一致)

最複雜,需要自己寫指令碼掃描依賴集,以及自定義dex載入過程

啟動不會發生ANR,比Google的MultiDex更快

太過複雜,每次都需重新掃描依賴集,而且使用的是比較大的間接依賴集

Facebook

1、使用自己開源的buck進行dex分包;

2、將載入Dex的邏輯放於單獨的nodex程序,這是一個非常簡單、輕量級的程序。它沒有任何的ContentProvider,只有有限的幾個Activity、Service;

3、將啟動LauncherActivity放在nodex程序,啟動時在nodex程序中安裝dex,主程序一直等待,dex安裝完成之後,啟動應用;

比Google的MultiDex稍複雜一些

依賴集非常簡單,同時首次載入Dex時也不會卡死

啟動主程序之前,必須先啟動nodex程序,額外增加了啟動時間(大約幾百毫秒)

美團

1、使用gradle外掛進行分包,編譯期生成dex檔案時,將入口Activity直接依賴的類放入主dex中;

2、多dex安裝時,先載入主dex,啟動應用,後續dex非同步安裝,安裝完成之後,提供回撥方法;

3、hook Activity的啟動過程,如果在非同步載入dex期間就引用了未載入的類進行Activity跳轉,啟動一個Loading的頁面,直到所有dex載入完成;

接入很簡單,但是需要徹底解耦,否則主dex的方法數很容易超過65K,編譯不通過

啟動時間最快

有內部RD支援,方便定位問題

需要程式碼高度解耦,要改動業務程式碼

容易出現NoClassDefFoundError

相關推薦

Dex載入方案對比

隨著業務擴張,程式碼量越來越大,apk中單個dex方法數超過65K,就需要dex分包,Google官方推出了MultiDex來解決65K的問題,區分不同的Android虛擬機器,會有一些問題。 Dalvik上,使用JIT(just in time),應用執行時

Android 一種在Dalvik虛擬機器上Dex載入優化的方案

在Android原始碼中,DexFile中有一個方法,其函式原型為: native private static int openDexFile(byte[] fileContents); 也就是通過byte陣列載入一個Dex,可以達到秒級載入,親自測了下

【分析】dex載入機制

相關文章連結: --------------------------------------------------------------------------------- Android原始碼版本:5.0.2_r1 下面是多dex載入的時序圖:  Andro

做了2個月的設計和編碼,我梳理了Flutter動態化的方案對比及最佳實現

作者:閒魚技術-石磬 背景 在端上為了提升App的靈活性, 快速解決萬變的業務需求,開發者們探索了多種解決方案,如PhoneGap ,React Native ,Weex等,但在Flutter生態還沒有好的解決方案。未來閒魚都會基於Flutter 來跨端開發,如果突破發版週期,在不發版的情況下,完成業務需

Android高效載入大圖、圖解決方案,有效避免程式OOM

本篇文章主要內容來自於Android Doc,我翻譯之後又做了些加工,英文好的朋友也可以直接去讀原文。高效載入大圖片我們在編寫Android程式的時候經常要用到許多圖片,不同圖片總是會有不同的形狀、不同的大小,但在大多數情況下,這些圖片都會大於我們程式所需要的大小。比如說系統

資料倉庫建模對比: 比較表格和維解決方案 (Comparing tabular and multidimensional solutions)

筆記記下來,劃重點: https://docs.microsoft.com/zh-cn/sql/analysis-services/comparing-tabular-and-multidimensional-solutions-ssas?view=sql-server-2017 Model Featur

Android高效載入大圖、圖解決方案,有效避免程式OOM .

高效載入大圖片 我們在編寫Android程式的時候經常要用到許多圖片,不同圖片總是會有不同的形狀、不同的大小,但在大多數情況下,這些圖片都會大於我們程式所需要的大小。比如說系統圖片庫裡展示的圖片大都是用手機攝像頭拍出來的,這些圖片的解析度會比我們手機螢幕的解析度高得多。大家應該知道,我們編寫的應用程式都

初涉RxAndroid結合Glide實現圖片載入操作

roc mco avr spl asc 生命周期 png ret track 轉載請註明出處:王亟亟的大牛之路 本來周末就想發了然後各種拖拉就沒有然後了,那麽就今天早上寫吧,廢話不多開始正題 什麽是RxJava或者RxAndroid我就不多廢話了,理

iOS線程方案總結及使用詳解

alloc www nop 線程狀態 efault div elf don ddd 本篇文章整理了幾種iOS中主要的多線程方案,提供了Swift和Objective-C兩種語言的寫法。 概述 iOS目前有四種多線程解決方案: NSThread GCD NSOperatio

一臺電腦撥VPN方案,Openwrt+virtualbox

work 由器 多個 添加 face 軟路由 virt 必須 manage 1. 下載virtaulbox並安裝。 2. 下載openwrt的img在openwrt網站。 3. 把img轉換為VirtualBox格式: VBoxManage convertfromraw

藍綠發布、滾動發布、灰度發布等部署方案對比與總結

請求 san 自建 復雜 clas 基礎設施 也有 分鐘 日誌 在項目叠代的過程中,不可避免需要進行項目上線。上線對應著部署或者重新部署,部署對應著修改,修改則意味著風險。目前有很多用於部署的技術,有的簡單,有的復雜,有的得停機,有的不需要停機即可完成部署。本文將對目前常用

Android 監聽APP進入後臺或切換到前臺方案對比

api 5.0 等等 推薦一個 情況 lis 需要 推出 soc 在我們開發的過程中,經常會遇到需要我們判斷app進入後臺,或者切換到前臺的情況。比如我們想判斷app切換到前臺時,顯示一個解鎖界面,要求用戶輸入解鎖密碼才能繼續進行操作;我們想判斷app切換到後臺,記錄一下l

單線程和線程執行對比—Python線程編程

func __main__ nta one tin del don elf ces 單線程和多線程執行對比 本章使用遞歸求斐波那契、階乘與累加函數的執行來對比單線程與多線程; 斐波那契、階乘與累加(mtfacfib.py): ? 1 import threading

webpack版本控制方案

專案中有這麼一個需求,就是按需啟動mock功能。考慮到mock只是在特定情況下,所以考慮通過 cross-env 來處理。 cross-env修改生產環境變數 我想要的最終效果是npm run dev:mock 來啟動mock,所以先安裝 cross-env npm i --sa

實現條目載入

public class MyAdapter extends BaseAdapter { private Context context; private List<User.ResultBean.DataBean> list; public MyAdapter(Conte

git 倉庫拆分方案對比

此文已由作者張磊授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 前言 git 拆分倉庫在網上已有的案例上來看,分為 submodule 和 subtree。 還有基於這兩個方案進行改進的 subrepo、git-repo 等,當然還可以使用 npm 去管理。 準備工作 可以先閱

MYSQL之一主從搭建方案

原理 方案 環境 虛擬機器兩臺:192.168.153.11/12 系統:Centos6.7x64位(磁力下載) 資料版本:mysql-5.5.60-linux-glibc2.12-x86_64.tar.gz(可以通過迅雷或者shell命令wget在li

PHP指令碼佔用記憶體太,解決方案

Fatal Error: Allowed memory size of xxxxxx bytes exhausted今天遇到伺服器很多自動任務的php指令碼佔用服務記憶體過多,並且程式不在運行了。解決方法:在執行PHP程式,通常會遇到“Fatal Error: Allowed memory size of x

TabLayout+ViewPager+Fragment實現條目載入個介面)

要求: 實現如圖所示效果,上方TabLayout,下面ViewPager+Fragment,下拉重新整理,上拉載入更多,多條目載入,顯示title標題,根據images圖片數量進行多條目載入。 介面如下,其中page為頁數,lid為上方標題的id https://feed.mix.s

用XListView實現向上重新整理,向下追加資料,並且條目載入

開始佈局 此處只展示Xlistview的佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schema