多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更快
太過複雜,每次都需重新掃描依賴集,而且使用的是比較大的間接依賴集
無
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