京東金融Dex拆分工具Scalpel技術揭秘

一、背景

隨著京東金融Android項目功能的不斷增加,代碼數(shù)量也隨之急劇增加钠四,雖然使用了MultiDex的處理,但是在不斷的加入更多類之后跪楞,我們依舊面臨著以下挑戰(zhàn):

問題1:編譯時出現(xiàn)錯誤com.Android.dex.DexException: Toomanyclasses in --main-dex-list, main dex capacity exceeded

產(chǎn)生原因:主dex超過最大方法數(shù)限制缀去。一個DEX文件中method個數(shù)采用使用原生類型short來索引文件中的方法,也就是4個字節(jié)共計最多表達65536個method甸祭,field/class的個數(shù)也均有此限制缕碎。

問題2:低端機上黑屏或白屏,冷啟動速度過慢

產(chǎn)生原因:dex加載耗時池户。在項目中使用Google提供的MultiDex后dex拆分為多個咏雌,而Android運行時只默認加載classes.dex這個文件(即主dex)。其他dex會在Application.attachBaseContext中使用Multidex.install進行解壓縮和加載校焦。Multidex.install是一個耗時大戶赊抖,會堵塞主線程,從而使主線程無法響應Activity的創(chuàng)建和初始化寨典。而5.0及以上版本已經(jīng)不存在這個問題氛雪,是由于ART模式的存在,app第一次安裝之后會進行一次預編譯(pre-compilation)耸成,如果這時候發(fā)現(xiàn)了classes(..N).dex文件就會將他們最終合成為一個.oat报亩,并在app啟動時一次性加載。

二墓猎、解決方案

面向問題1的解決方案:只要保證主dex中的方法數(shù)少于65536個捆昏,在gradle編譯腳本中加入dx.additionalParameters +='--set-max-idx-number=xxx'參數(shù)即可解決。

面向問題2的解決方案:首先想到的就是異步加載毙沾,但如果此時classloader需要加載某個類骗卜,而這個類卻沒有在主dex中,就會出現(xiàn)ClassNotfindException的異常崩潰,所以其實解決這兩個問題的根本方法是指定打包時將哪些類放到主dex中寇仓。

三举户、Scalpel介紹

Scalpel是京東金融客戶端研發(fā)的業(yè)界首個可以干預主dex生成的工具,可以根據(jù)配置文件指定某些符合規(guī)則的遍烦、及其必要的依賴類放到主dex中俭嘁。除了根據(jù)配置文件,Scalpel還會自動分析你的項目服猪,把一些必須放入主dex中的類找到并放進去供填。

在使用MultiDex時,BuildTool會自動把代碼拆成多個dex包罢猪,并通過掃描把Application , Activity , Service , ContentProvider和BrocastReceiver以及必要依賴類放進主dex包中近她,以下是Android的打包流程圖:

為了實現(xiàn)指定主dex中的類,我們在生成dex文件這一步時膳帕,使用gradle自定義Task來干預dex的生成過程,由于人工分析class有著不可維護性和高風險性粘捎,Scalpel則完美解決了對人工的依賴,從而極大的提高了生產(chǎn)效率危彩。

具體用法(寫法和混淆文件類似):

1.工程根目錄gradle.build中添加以下內容

repositories {

jcenter();

maven {

url "http://dl.bintray.com/gokuo/maven"

}

}

dependencies{

classpath 'com.jd.jrapp.plugin:Scalpel:1.0.1'

}

2:項目目錄下build.gradle中添加apply plugin: 'com.jd.jrapp.scalpel'

3:項目目錄下添加scalpel_rule.pro規(guī)則文件攒磨,并填寫以下內容

如:

(1)把supportv4包下所有的類和相關必要依賴類都打進主dex

-keep class android.support.v4.**{*;}

(2)把Fragment類打進主dex

-keep class android.support.v4.app.Fragment

(3)把Fragment類和相關必要依賴類打入主dex

-keep class android.support.v4.app.Fragment{*;}

(4)把所有Fragment的子類打入主dex

-keep class * extends android.support.v4.app.Fragment

四、實現(xiàn)原理

請參見源碼:https://github.com/gokuo/scalpel

五汤徽、提供支持

您如果有任何問題娩缰,可以在開源項目中提交bug報告,也可以發(fā)送郵件至 gaokuo@jd.com

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泻骤,隨后出現(xiàn)的幾起案子漆羔,更是在濱河造成了極大的恐慌,老刑警劉巖狱掂,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件演痒,死亡現(xiàn)場離奇詭異,居然都是意外死亡趋惨,警方通過查閱死者的電腦和手機鸟顺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來器虾,“玉大人讯嫂,你說我怎么就攤上這事≌咨常” “怎么了欧芽?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長葛圃。 經(jīng)常有香客問我千扔,道長憎妙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任曲楚,我火速辦了婚禮厘唾,結果婚禮上,老公的妹妹穿的比我還像新娘龙誊。我一直安慰自己抚垃,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布趟大。 她就那樣靜靜地躺著鹤树,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逊朽。 梳的紋絲不亂的頭發(fā)上魂迄,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音惋耙,去河邊找鬼。 笑死熊昌,一個胖子當著我的面吹牛绽榛,可吹牛的內容都是我干的。 我是一名探鬼主播婿屹,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼灭美,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了昂利?” 一聲冷哼從身側響起届腐,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜂奸,沒想到半個月后犁苏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡扩所,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年围详,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祖屏。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡助赞,死狀恐怖,靈堂內的尸體忽然破棺而出袁勺,到底是詐尸還是另有隱情雹食,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布期丰,位于F島的核電站群叶,受9級特大地震影響吃挑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜盖呼,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一儒鹿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧几晤,春花似錦约炎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至憾朴,卻和暖如春狸捕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背众雷。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工灸拍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砾省。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓鸡岗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親编兄。 傳聞我的和親對象是個殘疾皇子轩性,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,757評論 25 707
  • 今天又是異常的熱。 昨日之行換來今日的疲憊狠鸳,娘三仿佛一下子變成了非洲人揣苏。休息半日,稍微好點件舵。 下午沒事卸察,約上三倆好...
    呂玥媽咪閱讀 181評論 0 4
  • 夜又來了,以它優(yōu)雅的姿態(tài)芦圾,伴著幽寂的旋律蛾派。 這是我最喜歡的時刻,剔除一切浮華和喧囂个少,唯留內心的平靜洪乍,傾聽著燈的傾述...
    悅者閱讀 498評論 6 6
  • 1 我叫莫子魚,是一只狗魚夜焦,至今1000歲壳澳,熱愛寒冷和肉食。 人類經(jīng)常說茫经,我們最多能夠活到兩百多歲巷波,其實很多狗魚根...
    大錢小胖閱讀 825評論 23 11
  • 今天和一位拍紀錄片師兄聊他的路演項目萎津,在定位之外,擴展到資源整合抹镊、傳播和資金的統(tǒng)籌锉屈,最后還是回到眾籌的思維是最好的...
    韌性十足的牛皮糖閱讀 302評論 0 0