[TOC]
# 總體方案
## 目標
獨立發布(一周一個版本)
## 插件化方案選型
目前的插件化框架,大部分都是使用 hook 系統的方式來做的。使用代理的基本上沒有成體系的框架,Shadow 框架的開源,在系統 api 控制越來越嚴格的趨勢下,算是一個新的方向。
Shadow 最大的兩個亮點是:
1\. 零反射
2\. 框架自身動態化
3\. 開發無感知
4\. 插件與宿主完全隔離,通過白名單橋街
## 獨立編譯
### 背景:
1. 單向依賴:
2. 插件對宿主依賴嚴重,直接依賴幾百個,依賴的類接著依賴
### 方案1:AS的Analyze工具
1. 只能分析一層依賴
2. 純手工
### 方案2: 編譯前自建依賴分析插件
s1:分析插件文件對宿主的import//todo import如何轉文件
s2: 工具分析插件加載宿主的依賴類,獲取AST語法樹(java javaparser,kotlin分析用kastree)
s3: 對依賴類進行裁剪
刪除 私有變量、私有方法、方法內部實現
保留對外飲用
s4:遞歸的對依賴類的依賴類繼續處理(處理過了不在處理)
s5:將裁剪過的類打包成jar,插件依賴改jar包編譯。
### 成果:
全量1m,增量30s
## 插件過程中遇到的問題
### 插件對宿主賴需要加混淆白名單
現狀:開發人員容易漏加白名單
方案:transform自動完成
### 重復打包導致方法內聯問題
現狀:插件化第一次灰度,收到上報錯誤java.lang.IncompatibleClassChangeError,只在Android N上
分析:
debug包無問題,線上包有問題,區別在于去掉重復打包
導出dex,無異常
懷疑dex2oat階段,內聯出現異常
root過的手機,將優化后的oat產物pull到電腦,然后使用oatdump反編譯
方案:編譯時,加上檢查
### ClassNotDef/NotSuchMethod
現狀:宿主的方法改變了,插件無法感知
方案 :空test方法校驗:
宿主的被調的方法生產test\\\_\\\*方法
插件動態生產一個 pluginCheck類,里面包含了對宿主方法的test方法,發送異常就推出
結果
### 成果:
外網crash率0.01%
# 參考資料
[Shadow源碼解析](https://github.com/ChenSiLiang/android-toy/blob/master/Shadow%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E7%AC%94%E8%AE%B0/Shadow%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90.md)
[Android 插件化的今生前世大揭秘](https://mp.weixin.qq.com/s/EuCqudpPnBRidtmZBocNYg)
[Java Parser應用介紹](https://cloud.tencent.com/developer/news/740798)
[QFix探索之路——手Q熱補丁輕量級方案](https://mp.weixin.qq.com/s/ce22vVN5zyqY0vAkNt1DDw)
- Android
- 四大組件
- Activity
- Fragment
- Service
- 序列化
- Handler
- Hander介紹
- MessageQueue詳細
- 啟動流程
- 系統啟動流程
- 應用啟動流程
- Activity啟動流程
- View
- view繪制
- view事件傳遞
- choreographer
- LayoutInflater
- UI渲染概念
- Binder
- Binder原理
- Binder最大數據
- Binder小結
- Android組件
- ListView原理
- RecyclerView原理
- SharePreferences
- AsyncTask
- Sqlite
- SQLCipher加密
- 遷移與修復
- Sqlite內核
- Sqlite優化v2
- sqlite索引
- sqlite之wal
- sqlite之鎖機制
- 網絡
- 基礎
- TCP
- HTTP
- HTTP1.1
- HTTP2.0
- HTTPS
- HTTP3.0
- HTTP進化圖
- HTTP小結
- 實踐
- 網絡優化
- Json
- ProtoBuffer
- 斷點續傳
- 性能
- 卡頓
- 卡頓監控
- ANR
- ANR監控
- 內存
- 內存問題與優化
- 圖片內存優化
- 線下內存監控
- 線上內存監控
- 啟動優化
- 死鎖監控
- 崩潰監控
- 包體積優化
- UI渲染優化
- UI常規優化
- I/O監控
- 電量監控
- 第三方框架
- 網絡框架
- Volley
- Okhttp
- 網絡框架n問
- OkHttp原理N問
- 設計模式
- EventBus
- Rxjava
- 圖片
- ImageWoker
- Gilde的優化
- APT
- 依賴注入
- APT
- ARouter
- ButterKnife
- MMKV
- Jetpack
- 協程
- MVI
- Startup
- DataBinder
- 黑科技
- hook
- 運行期Java-hook技術
- 編譯期hook
- ASM
- Transform增量編譯
- 運行期Native-hook技術
- 熱修復
- 插件化
- AAB
- Shadow
- 虛擬機
- 其他
- UI自動化
- JavaParser
- Android Line
- 編譯
- 疑難雜癥
- Android11滑動異常
- 方案
- 工業化
- 模塊化
- 隱私合規
- 動態化
- 項目管理
- 業務啟動優化
- 業務架構設計
- 性能優化case
- 性能優化-排查思路
- 性能優化-現有方案
- 登錄
- 搜索
- C++
- NDK入門
- 跨平臺
- H5
- Flutter
- Flutter 性能優化
- 數據跨平臺