精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

支付寶Android包大小極致壓縮

移動開發 Android
本章節我們將圍繞《支付寶 App 構建優化解析》另啟新系列,細分拆解客戶端在“代碼管理”、“證書管理”、“版本管理”、“構建打包”等維度的具體實現方案展開討論,帶領大家進一步了解支付寶在 App 構建模塊下的持續優化。

前言

本章節我們將圍繞《支付寶 App 構建優化解析》另啟新系列,細分拆解客戶端在“代碼管理”、“證書管理”、“版本管理”、“構建打包”等維度的具體實現方案展開討論,帶領大家進一步了解支付寶在 App 構建模塊下的持續優化。

本節將主要記錄通過對支付寶 Android 包大小進行壓縮,來改善運行效率和質量。

背景

包大小的重要性已經不需要多說,包大小直接影響用戶的下載,留存,還有部分廠商預裝強制要求必須小于一定的值。但是隨著業務的迭代開發,應用會越來越大,安裝包會不停的膨脹,所以包大小縮減是一個長期的治理過程。

方案

支付寶也一直在優化包大小的方向上努力,我們引入了很多方案。

  • 比如:proguard 代碼混淆,圖片從 png 到 tinypng 到 webp,引入 7zip 壓縮方案等。

本方案是有別于上面這些常規的方案,是通過直接刪 dex 中的無用信息,達到支付寶包大小瞬間減小 2.1M 的目的,并且不影響整個的運行邏輯和性能,甚至還能降低一點運行內存。

方案介紹

引言

在講詳細方案前得稍微說說整個 Java 系的調試邏輯。

JVM 運行時加載的是 .class 文件,Android 為了使包大小更緊湊,并且運行更高效發明了 dalvik 和 art 虛擬機,兩種虛擬機運行的都是 .dex 文件(當然 art 虛擬機還可以同時運行 oat 文件,不在本文章討論范圍)。

所以 dex 文件里面信息的內容和 class 文件包含的信息是完全一致的,不同的是 dex 文件對 class 中的信息做了去重,一個 dex 包含了很多的 class 文件,并且在結構上有比較大的差異,class 是流式的結構,dex 是分區結構,各個區塊間通過 offset 索引。后面就只提 dex 的結構,不再提 class 的結構。dex 的結構可以用下面這張圖表示:

支付寶Android包大小極致壓縮

dex 文件的結構其實非常清晰,分幾個大塊,header 區,索引區,data 區,map 區。本優化方案優化刪除的就是 data 區中的 debugItems 區域。

debugItem 干嗎用?

首先得知道 debugItem 里面存了什么?

里面主要包含兩種信息:

  • 函數的參數變量和所有的局部變量
  • 所有的指令集行號和源文件行號的對應關系

有什么用呢:

  • 第一點其實很明顯,既然叫 debugItem,那么肯定就是 debug 的時候用的嘍,我們平時在用 IDE 進行斷點和單步調試的時候都會用到這個區域。
  • 第二點作用那就是上報 crash 或者主動獲取調用堆棧的時候用的,因為虛擬機真正執行的時候是執行的指令集,上報堆棧會上報 crash 的對應源文件行號,此時正是通過這個 debugItem 來獲取對應的行號,可以用下面的截圖比較直觀的了解:

支付寶Android包大小極致壓縮

上圖是一個比較常見的 crash 信息,紅框中的行號便是通過查找這個 debugItem 來獲取的。

debugItem 有多大?

在支付寶的場景下,debug 包有 4-5M,release 包有 3.5M 左右,占 dex 文件大小的比例在 5.5% 左右,和 google 官方的數據是一致的。如果能把這部分直接去掉,是不是很誘人!

debugItem 能直接去掉嗎?

顯然不能,如果去掉了,那所有上報的 crash 信息就會沒有行號,所有的行號都會變成 -1,會被噴的找不到北。

其實在 proguard 的時候就是有配置可以去掉或保留這個行號信息,-keep SourceFile, LineNumberTable 就是這個作用,為了方便定位問題,基本所有的開發都保留了這個配置。

所以,方案的核心思路就是去掉 debugItem,同時又能讓 crash 上報的時候能拿到正確的行號。至于 IDE 調試,這個比較好解決,我們只要處理 release 包就行了,debug 包不處理。

方案一

核心思路也比較簡單,就是行號查找離線化,讓本來存放在 App 中的行號對應關系提前抽離出來存放在服務端,crash 上報的時候通過提前抽離的行號表進行行號反解,解決 crash 信息上報無行號,無法定位的問題。

思路雖然簡單,實現的時候還是有點復雜,推動上線也比較曲折,方案經過幾次調整,大概的方案可以用下面一張圖來抽象:

支付寶Android包大小極致壓縮

如上圖,核心點有四個:

  • 修改 proguard,利用 proguard 來刪除 debugItem (去掉 -keep lineNumberTable),在刪除行號表之前 dump 出一個臨時的 dex。
  • 修改 dexdump,把臨時的 dex 中的行號表關系 dump 成一個 dexpcmapping 文件(指令集行號和源文件行號映射關系),并存至服務端。
  • hook app runtime 的 crash handler,把 crash 時的指令集行號上報到反解平臺。
  • 反解平臺通過上報指令集行號和提前準備好 dexpcmapping 文件反解出正確的行號。

上面這套方案大概花了兩個多星期,擼出了整個 demo,其它幾個改造點都不是很難,難點還是在指令集行號的上報。

我們知道所有的 crash 最終都是會有一個 throwable 對象,里面保存了整個堆棧信息,經過反復的閱讀源碼和嘗試,發現我要的指令集行號其實也在這個對象里面。可以用下面一幅簡單的圖示意:

支付寶Android包大小極致壓縮

在打印 crash 堆棧信息前,每個 throwable 都會調用art虛擬機提供的一個 jni 方法,返回一個內部的對象叫 stackTrace 保存在 Throwable 對象中,這個 stackTrace 對象里面保存的便是整個方法的調用棧,當然也包括指令集行號,后續獲取實際的堆棧信息時會再調用一個 art 的 jni 方法,把這個 stackTrace 方法丟過去,底層通過這個 stackTrace 對象中的指令集行號反解出正式的源文件行號。

好了,其實很簡單,反射獲取下這個 Throwable 中的 stackTrace 對象,拿到指令集行號,然后,上報。

這里要注意的一個點,比較惡心,每個虛擬機的實現都不一樣,首先內部對象的名字,有些叫 stackTrace,有些叫 backstrace,然后這個內部對象的類型也非常有,有些是 int 數組,有些是 long 數組,有些是對象數組,但是都會有這個指令集行號,需要針對不同的虛擬機版本使用不同的方法去解析這個對象,大概要兼容4種虛擬機,4.x, 5.x, 6.x, 7.x,7.x 虛擬機之后的就統一了。

方案二

上面這套方案其實挺完美的,沒有什么兼容性問題,刪除是直接利用 proguard,獲取指令集行號直接在 java 層獲取,不需要各種 hook,如果只需要處理 crash 的上報,方案一足夠了,但是在支付寶有很多場景是遠遠不夠的。

比如:

  • 性能,CPU,內存異常時調用棧。
  • native crash 時的 Java 調用棧。

上面這些 case 都會涉及到堆棧信息,方案一中通過反射調用 throwable 中的 stackTrace 內部對象根本搞不定,需要換種方法。

最開始的思路是嘗試 hook art 虛擬機,每天翻源碼,看看可以 hook 的點,最后還是放棄了,一個是擔心兼容性問題,另一個是 hook 的點太多,比較慌。

最后換了一種思路,嘗試直接修改 dex 文件,保留一小塊 debugItem,讓系統查找行號的時候指令集行號和源文件行號保持一致,這樣就什么都不用做,任何監控上報的行號都直接變成了指令集行號,只需修改 dex 文件。可以用下面的示意圖表示:

支付寶Android包大小極致壓縮

如上圖:本來每一個方法都會有一個 debugInfoItem,每一個 debuginfoItem 里面都有一個指令集行號和源文件行號的映射關系,我做的修改其實非常簡單,就是把多余的 debugInfoItem 全部刪掉了,只留了一個 debugInfoItem,所有的方法都指向同一個 debugInfoItem,并且這個 debugInfoItem 中的指令集行號和源文件行號保持一致,這樣不管用什么方式來查行號,拿到的都是指令集行號。

其中也踩過很多坑,其實光留一個 debugInfoItem 是不夠的,要兼容所有虛擬機的查找方式,需要對 debugInfoItem 進行分區,并且 debugInfoItem 表不能太大,遇到過一個坑就是 androidO 上進行 dex2oat 優化的時候,會頻繁的遍歷這個 debugInfoItem,導致 AOT 編譯比較慢,最后都通過 debugInfoItem 分區解決了。

這個方案比較徹底,不用改 proguard,也不用 hook native。不過如果只需要處理 crash 的行號問題,那還是首推方案一,這個方案改動有點大,前期也是每天研究 dex 的文件結構,摳每一個細節,有比較大的把握時才敢改。

小結

目前該方案已經在支付寶正式上線,前面經過好幾輪的外灰驗證,還是比較穩定的。支付寶整體包大小減少了 2.1M 左右,真實的 dex 大小減少 3.5M 左右。

通過本節內容,我們初步了解了支付寶在 Android 客戶端如何通過包大小壓縮以提升 App 運行效率和質量。關于 Android 端包大小壓縮的設計思路和具體實踐,同樣期待你們的反饋,歡迎一起探討交流。

責任編輯:未麗燕 來源: 安卓巴士Android開發者門戶
相關推薦

2021-01-25 14:13:26

iOS支付寶支付

2021-09-09 15:30:28

鴻蒙HarmonyOS應用

2014-11-17 10:52:56

支付寶去阿里化

2009-09-17 12:15:28

互聯網

2018-03-27 12:02:31

央行支付寶紅包

2011-04-21 11:27:42

Firefox支付寶

2017-12-18 18:23:09

支付寶掃碼賺錢支付寶套路

2013-10-31 11:24:53

支付寶漏洞支付寶漏洞

2009-12-14 16:31:00

Linux安裝支付寶

2009-11-23 10:02:22

PHP支付寶接口

2023-11-28 08:53:15

2009-08-26 16:07:09

支付寶網上購物安全邁克菲

2013-10-11 09:41:01

Windows 8.1支付寶

2025-09-25 09:31:53

2020-08-14 11:00:41

支付寶

2021-03-30 09:59:52

支付寶加密數據泄露

2015-05-28 09:52:21

光纖支付寶

2021-05-12 07:10:55

支付寶數字人民幣移動應用

2013-06-20 10:45:10

余額寶支付寶大數據

2025-02-18 16:00:00

SpringBoot支付Java
點贊
收藏

51CTO技術棧公眾號

欧美free嫩15| 国产在线观看黄| 在线日韩电影| 国产一区二区三区直播精品电影| 9久久婷婷国产综合精品性色| 99免在线观看免费视频高清| 国产乱码一区二区三区| 性欧美xxxx| 无码少妇精品一区二区免费动态| av日韩在线免费观看| 亚洲国产中文字幕在线视频综合| 欧美激情视频一区二区三区| 一级黄色片网站| 激情久久一区| www.久久色.com| 精品无码在线视频| 免费一级欧美片在线观看网站| 亚洲成人一区在线| 公共露出暴露狂另类av| 四虎精品成人影院观看地址| 国产一区二区三区免费播放| 欧美最顶级丰满的aⅴ艳星| 亚洲精品一区二区三区在线播放| 欧美久久香蕉| 日韩一区二区三区四区五区六区| 黑森林福利视频导航| 欧美v亚洲v| 亚洲柠檬福利资源导航| 视频在线观看成人| 四虎国产精品永远| 成人一区二区三区| 2014亚洲精品| 欧美视频xxxx| 久久久久国内| 欧洲s码亚洲m码精品一区| 久久久香蕉视频| 国产精品精品| 日韩中文字幕精品| 成熟人妻av无码专区| 亚洲免费观看高清完整版在线观| 日韩精品一区在线观看| 色婷婷一区二区三区在线观看| 日本少妇一区| 91福利在线免费观看| 国产免费一区二区三区视频| 草草视频在线| 午夜成人免费视频| 日本一级黄视频| 在线中文字幕视频观看| 日韩美女视频一区| 黄瓜视频免费观看在线观看www| 丁香在线视频| 欧美国产禁国产网站cc| 亚洲aⅴ天堂av在线电影软件| 日韩电影免费| 久久色视频免费观看| 欧美久久久久久久| 国产免费视频在线| 国产精品精品国产色婷婷| 亚洲bbw性色大片| 黄网页在线观看| 亚洲免费电影在线| 国产 国语对白 露脸| 最爽无遮挡行房视频在线| 亚洲激情六月丁香| 国产乱淫av片杨贵妃| 丰满诱人av在线播放| 亚洲成人动漫一区| 国产黄色一级网站| 日韩免费电影| 欧美久久久久免费| 美女被爆操网站| 精品综合久久88少妇激情| 亚洲福利视频专区| xxxx日本黄色| 羞羞答答成人影院www| 精品中文字幕视频| 成人午夜视频精品一区| 日本视频在线一区| 91美女高潮出水| 人妻91麻豆一区二区三区| 久久亚洲综合色| 婷婷视频在线播放| 国产又色又爽又黄刺激在线视频| 精品女同一区二区三区在线播放 | 视频国产在线观看| 国产调教视频一区| 天天想你在线观看完整版电影免费 | 粉嫩在线一区二区三区视频| 久久综合色一本| 免费a在线看| 午夜精品免费在线| 污污的网站18| 精品人人人人| 中文字幕在线成人| 久久9999久久免费精品国产| 首页国产欧美日韩丝袜| 91在线视频九色| 青青青手机在线视频观看| 国产精品久久久久7777按摩| 欧美视频在线观看网站| 国产成人午夜性a一级毛片| 日韩精品中午字幕| 九一在线免费观看| 精品不卡视频| 国产主播精品在线| 日韩国产福利| 一区av在线播放| 奇米影视四色在线| 免费看成人人体视频| 日韩视频免费观看| 亚洲欧美一区二区三区在线观看| 国产一区二区三区四区五区入口| 欧美日韩三区四区| av在线不卡免费| 欧美二区三区91| 亚洲最大成人网站| 亚洲大胆av| 99国产在线观看| 日韩欧美小视频| 欧美最猛性xxxxx直播| 妖精视频一区二区| 性欧美欧美巨大69| 国产日韩在线看片| 国产中文在线视频| 精品人伦一区二区三区蜜桃免费| 国产又粗又猛又爽又黄| 99久久夜色精品国产亚洲1000部| 欧美亚洲另类激情另类| 欧洲精品久久一区二区| 亚洲蜜臀av乱码久久精品| 91香蕉视频导航| 亚州av日韩av| 7777精品久久久久久| 性中国古装videossex| 中文字幕在线播放不卡一区| 男人搞女人网站| 国产伦一区二区三区| 18一19gay欧美视频网站| 欧美一级淫片aaaaaa| 亚洲综合视频网| 人妻换人妻仑乱| 影音先锋日韩在线| 91免费人成网站在线观看18| 日韩成人影视| 69堂国产成人免费视频| 久久国产高清视频| 激情文学综合丁香| 中文字幕免费在线不卡| 亚洲狼人综合| 伦伦影院午夜日韩欧美限制| 国产精品亚洲lv粉色| 中文字幕佐山爱一区二区免费| 亚洲第一区第二区第三区| 水蜜桃久久夜色精品一区| 国产日韩在线视频| bestiality新另类大全| 欧美xxxx在线观看| 日产亚洲一区二区三区| 2024国产精品| 亚洲精品一二三四五区| 日韩伦理视频| 亚洲精品日产aⅴ| 午夜影院免费在线| 亚洲国产精久久久久久久| 国产精品成人aaaa在线| 91小视频免费看| 国产免费视频传媒| 久久久久久久久久久久久久| 亚洲专区中文字幕| 97人人在线视频| 亚洲视频在线免费看| 中文字幕av在线免费观看| 亚洲视频免费在线观看| 男女性杂交内射妇女bbwxz| 亚洲一区网站| 亚洲欧美电影在线观看| 美女久久精品| 欧美一级大片在线观看| 精品视频二区| 91精品在线观看入口| 久久网中文字幕| 久久一夜天堂av一区二区三区| 亚洲一区二区三区四区五区| 欧美大片一区| 欧美大香线蕉线伊人久久| 韩国精品视频在线观看 | 久草中文在线视频| 91视频你懂的| 日韩成人精品视频在线观看| 国内在线观看一区二区三区| 欧美一二三区| 亚洲性视频在线| 国产精品777| 最新超碰在线| 在线日韩精品视频| 韩国中文字幕hd久久精品| 欧美偷拍一区二区| 日本一区二区不卡在线| 日本一区二区三区免费乱视频 | 久久久999精品免费| 色欲久久久天天天综合网| 欧美视频一区二区三区在线观看| 九九视频免费在线观看| 国产免费观看久久| 国产视频久久久久久| 激情综合色综合久久综合| 久久精品午夜福利| 国户精品久久久久久久久久久不卡| 台湾成人av| 人人香蕉久久| 99国产视频| 3d动漫一区二区三区在线观看| …久久精品99久久香蕉国产| 国产成人l区| 中文字幕亚洲专区| 日本在线视频1区| 日韩精品一区国产麻豆| 一级做a爱片性色毛片| 黑人与娇小精品av专区| 国产在线观看免费av| 综合自拍亚洲综合图不卡区| 最近中文字幕在线mv视频在线| 成人免费av在线| 日韩精品视频网址| 日本免费新一区视频| 精品久久久久久久免费人妻| 亚洲全部视频| 精品一二三四五区| 一区二区三区在线| 免费看av软件| 四虎成人精品永久免费av九九| 欧美日韩在线播放一区二区| 欧美大胆视频| 国产伦精品一区二区三区四区免费 | 色噜噜偷拍精品综合在线| 日本熟妇毛茸茸丰满| 樱花草国产18久久久久| 国产女人18水真多毛片18精品| 亚洲国产精品二十页| 五月天综合视频| 久久久国际精品| 国产色视频一区二区三区qq号| 99精品视频在线免费观看| 催眠调教后宫乱淫校园| 国产91精品露脸国语对白| 国产调教打屁股xxxx网站| 国产精品69久久久久水密桃| 手机在线观看日韩av| 国产精品99久久久| 国产成人av片| av在线这里只有精品| 老熟妇精品一区二区三区| 99麻豆久久久国产精品免费| 超碰caoprom| 久久久蜜桃精品| 国产真人做爰视频免费| 国产精品护士白丝一区av| 色欲一区二区三区精品a片| 亚洲视频一区在线| 国产一级一级片| 偷拍日韩校园综合在线| 亚洲欧美偷拍视频| 欧美日韩一区二区在线观看视频 | 亚洲草草视频| 久久久久亚洲| 久久99久久久久久| 国产亚洲福利| 中文字幕国内自拍| 国产精品18久久久久久久网站| 人妻 丝袜美腿 中文字幕| 91在线云播放| 在线观看天堂av| 一区二区三区国产精品| 99热在线观看免费精品| 色婷婷久久久久swag精品| 亚洲性在线观看| 精品成人一区二区| 午夜av免费观看| 中文字幕国内精品| 男女在线观看视频| 日韩av免费看| 日韩一二三区| 日韩精品最新在线观看| 欧美99在线视频观看| 奇米精品一区二区三区| 欧美aaaaaa午夜精品| 69xxx免费视频| 欧美国产日韩一二三区| 日本a级片视频| 欧美性猛交xxxx乱大交极品| 136福利视频导航| 亚洲国产小视频| 日本中文字幕在线看| 国自产精品手机在线观看视频| 亚洲第一会所001| 国产精品久久国产精品| 成人在线免费观看视频| 三上悠亚久久精品| 久久国产精品区| 少妇精品一区二区三区| 亚洲柠檬福利资源导航| 亚洲欧美综合自拍| 日韩免费性生活视频播放| 国产人成在线观看| 羞羞色国产精品| 成人精品视频在线观看| 欧美成人综合一区| 亚洲高清久久| 久草福利在线观看| 国产精品久久影院| 中文字幕在线看人| 亚洲国产精品推荐| 黄色动漫在线| 国产一区视频在线| 欧美人与物videos另类xxxxx| 国产高清不卡无码视频| 久久精品久久99精品久久| av无码av天天av天天爽| 亚洲曰韩产成在线| 国产亲伦免费视频播放| 中文字幕日韩精品有码视频| 忘忧草在线影院两性视频| 91久久精品国产91久久性色tv | 久久综合久久美利坚合众国| 欧美第一视频| 免费成人看片网址| 日韩午夜在线电影| 色哟哟视频在线| 亚洲国产一区视频| www.色播.com| 美日韩在线视频| 在线日韩三级| 免费在线观看污污视频| 久久99久久99小草精品免视看| 国产成人一区二区在线观看| 一本色道a无线码一区v| 日本中文字幕电影在线观看| 欧美性受xxxx黑人猛交| 人人精品视频| 亚洲成熟丰满熟妇高潮xxxxx| 91在线视频播放| 可以免费看的av毛片| 日韩激情在线视频| 春色校园综合激情亚洲| 狠狠色综合色区| 一区二区高清| 精品少妇一区二区三区免费观| 日韩欧美亚洲一二三区| 欧洲视频在线免费观看| 日韩av免费在线| 国精一区二区| 嫩草视频免费在线观看| 国产精品久线观看视频| 国产女人高潮时对白| 久久国产精品偷| 国产精品白浆| 一女被多男玩喷潮视频| 久久精品视频网| 中文字幕在线观看1| 久久精品中文字幕| 1204国产成人精品视频| 黄色免费视频大全| 国产日韩精品一区二区三区 | 在线观看亚洲视频啊啊啊啊| 激情综合色播五月| 国产在线观看免费视频今夜| 日韩经典一区二区三区| 欧美日韩尤物久久| 香蕉视频在线网址| 成人午夜大片免费观看| 国产尤物在线视频| 中文字幕精品网| 午夜久久av| 中文字幕乱码人妻综合二区三区 | 国产无人区码熟妇毛片多| 亚洲欧洲一区二区三区久久| 国产福利91精品一区二区| 99re6这里有精品热视频| 91婷婷韩国欧美一区二区| 亚洲视频一区在线播放| 欧美区在线播放| 国产精选一区| 中文字幕无码毛片免费看| 精品日韩中文字幕| 哥也色在线视频| 精品无人乱码一区二区三区的优势| 日韩专区欧美专区| 久久久久久久久精| 国产亚洲精品一区二555| 国产区一区二| 日本熟妇人妻xxxxx| 亚洲免费资源在线播放| 日本大片在线观看| 91免费版网站在线观看| 美女久久一区| 久草视频免费在线| 中文字幕亚洲一区在线观看| 卡通动漫国产精品| 红桃视频 国产|