©wequick GalenLin All rights reserved

Slides:



Advertisements
Similar presentations
第一章 讲师:张晓飞 微信 : zxf_zxy_rxf Android 快速入门. 1. 介绍 Android 2. 完成第一个 Android 应用 3. 三个开发调试工具 4. 应用练习 1.1 Android 相关基础知识 1.2 Android 系统架构 2.1 搭建开发环境 2.2 开发第一个应用.
Advertisements

尔雅慕课学生操作手册说明 学校自建尔雅课程 QQ 群 密码登录问题 如何参加学习 如何查看统计 如何做作业 如何参加考试 手机客户端学习 目 录目 录.
开发入门 一个 android 初学者的心得与体会. 前言 两周前张老师通知我说,让我根据教练助手的学习与开发的过程讲下 android 开发的心得与体会,我觉得自己在这么多 Android 前辈大佬面前讲 android 简 直是班门弄斧。由于是刚入门的初学者,水平有限,很多方面还很不足,对 错误或不周到之处欢迎批评指正。顺便还得提下,我这个标题有抄袭积聚童.
Android ADT + Android SDK Eclipse Eclipse 編輯器 JAVA JAVA 開發工具.
钱富宝 V1.5.0 版本 APP 用户手册 钱富宝 APP 下载地址:
Android开发入门 -----第一个Android程序 主讲:李晓蕾
第二节 时间和位移.
拒做“低头族” 婚庆1333班 龚秀萍.
公会之家游戏圈社交软件 游戏联通世界.
移动校园Hybrid应用开发介绍 2015年11月.
102年度統一入學測驗 報名作業說明會 時 間:101年12月14日(星期五) A.M.9:00~10:20 地 點:行政七樓講堂
学生教育办介绍 2015年9月.
第一章 Android简介与环境搭建 QQ号: QQ群: (Android编程入门) 网络资源:
中国(成都)斯宝特房地产营销策划有限公司 2007年5月22日
未来协同项目计划书.
尔雅慕课学生操作手册说明.
尔雅慕课学生操作手册说明.
史上最賣座動漫-海賊王 3/19/ 張依琳.
上海宏弈源软件科技有限公司 — 12年专注益智软件研发 和配套产品服务 上海宏弈源软件科技有限公司.
OUTLINE Android app Devolpment Flow App反組譯解說 實例 簽名詳解 DalvikByteCode
幼儿戏剧的特点和价值 合肥幼儿师范高等专科学校 王丽.
荷福威士顿机器人科技有限公司 上海荷福集团
尔雅慕课学生操作手册说明 尔雅客服中心.
读秀学术搜索 读秀的图书搜索. 能够为我们解决一个 什么问题? 是什么东西? 读秀 1. 读秀知识库是以 170 万种中文图书、 6 亿页 全文资料为基础的超大型数据库。 2. 为读者提供深入到图书内容章节和全文的精 度检索,全面立体的多面检索,部分文献的 原文试读,以及参考咨询服务,是一个真正.
第6章 PLC控制系统设计与应用 教学目的与要求:熟悉相关指令的综合应用,掌握PLC控制系统设计方法,掌握PLC程序编制方法,巩固所学内容。
Interprocedural distributive environment problem (IDE) & EPICC &SOOT
Android App 系統開發教學 Luna 陳雯琳 2014/12/18
使用Android Studio 開發Android App 靜宜大學資管系 楊子青
建立Android新專案 建國科技大學 資管系 饒瑞佶 2010/10.
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
APP課程:Android程式設計開發環境與工具介紹
第9章 App提交 倚动实验室.
第2章 建立Android應用程式 2-1 Java語言、XML文件與Android 2-2 建立第一個Android應用程式
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
第17章 使用B4J建立跨平台應用程式 17-1 認識B4J整合開發環境 17-2 下載與安裝B4J開發環境
ANDROID與OSGI平台整合.
EBSCOhost平台在移动设备 --IOS/Android系统的应用
EBSCOhost平台在移动设备 --IOS/Androd系统的应用
尔雅慕课学生操作手册说明 尔雅客服中心.
尔雅慕课学生操作手册说明.
Ch5 Android應用程式的主要組成.
绿豆芽科技 让科技融入生活. 绿豆芽科技 让科技融入生活 让天下没有非互联网的公司 传统行业公司 新型科技公司 绿豆芽科技 产品研发 供应链 渠道 物联网硬件 云计算平台 APP应用 传统优势 竞争力 用户体验 团队由数十名硕士生及博士生组成,有着在德州仪器、中兴等知名企业的工作经历,项目经验丰富。团队成员获得过:电子设计竞赛国家一等奖、“Intel杯”嵌入式邀请赛冠军、“微软创新杯”
第9章 使用意圖啟動活動與內建應用程式 9-1 意圖的基礎 9-2 使用意圖啟動活動
ANDROID PROGRAMMING2.
尔雅慕课学生操作手册说明 尔雅客服中心.
Native Development Kit
教務行政資訊系統 簡介 資訊科技中心 資訊系統組 徐振琦
建立Android新專案 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
移动知网 同方知网(北京)技术有限公司.
福智 學員平台 2018/6/9 幹部月會 羅東教室.
第1章 静力学基础 几个重要名词 静力学:研究力的基本性质和力系的合成以及物体在力系作用下平衡规律及其应用。
本章目錄 10-1 物聯網介紹 10-2 物聯網系統與物聯網策略聯盟模式 10-3 物聯網系統服務聯盟實證分析 10-4 結論與建議.
尔雅慕课学生操作手册说明 尔雅客服中心.
主编:钟元生 赵圣鲁.
金蝶KIS商贸同步服务器1分钟教程 1.设置 2.设备授权 3.同步 4.查看日志 5.Android端下载.
Android 开发入门.
中国科学院计算机网络信息中心 中国科技网网络中心 All rights reserved
iSoftStone Information Service Corporation
劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
可愛的鍬形蟲 五年四班2.
Location Based Services - LBS
人因設計 阿倫online分析 第四組 組員 : 劉雅欣 黃莉媛 林威志 王畯銨 林倢伃.
第16章 天气预报 --Web Service调用
尔雅慕课学生操作手册说明 尔雅客服中心.
Android进程间通讯.
明日夫子APP 下載流程與操作說明 中大團隊.
美和科技大學資訊科技系 助理教授 美和科技大學資訊科技系 學生士
104學年度 進修學校期初工作報告.
Part 8 Broadcast Receiver、Service和App Widget
如何著手入門MyLion 如何下載和註冊 讓我們來談談如何確保所有獅友知道如何下載和註冊app。.
Presentation transcript:

©wequick GalenLin All rights reserved FBI WARNING 本文件仅作为学习交流之用 请勿用以商业用途 ©wequick GalenLin All rights reserved

Small:插件化轻巧之道 林光亮

首页 0x00 诞生 0x01 轻 0x02 巧 0x03 TODO

0x00 诞生 诞生-头疼 模块1 模块2 模块3 模块4 模块5 模块6

两篇文章 诞生 分析支付宝客户端插件机制 @唐巧-猿题库 手机淘宝客户端架构探索实践 @于佳-阿里 模块1 模块2 模块3 模块4 模块5 模块6 分析支付宝客户端插件机制 @唐巧-猿题库 手机淘宝客户端架构探索实践 @于佳-阿里

基础架构 诞生 + Bundle Launcher 分析支付宝客户端插件机制 @唐巧-猿题库 手机淘宝客户端架构探索实践 @于佳-阿里 iOS HTML Android Bundle Launcher

开源探索 诞生 + Bundle Launcher Dynamic-Load-APK @任玉刚-百度 Direct-Load-APK Android Bundle Launcher + iOS HTML Dynamic-Load-APK @任玉刚-百度 Direct-Load-APK @罗迪-高中生

DLA架构 诞生 Host Dynamic-Load-APK @任玉刚-百度 Direct-Load-APK @罗迪-高中生 模块1 模块2 Android 模块1 模块2 模块3 Dynamic-Load-APK @任玉刚-百度 Host Direct-Load-APK @罗迪-高中生

诞生 不支持公共库 模块1 公共 模块 Host 模块3

诞生 公共并宿主 模块1 公共 模块 公共 模块 Host 模块3

DLA改造 诞生 Host 使用public.xml 锁定公共资源ID 打通宿主与插件的资源与代码共享 模块1 公共 模块 DLA 改进 模块3

重新探索 诞生 Gradle 1.3+ Unsupported Host 使用public.xml 锁定公共资源ID 模块1 模块3 公共 模块 DLA 改进 Host 使用public.xml 锁定公共资源ID 打通宿主与插件的资源与代码共享 Gradle 1.3+ Unsupported Android-Plugin-Framework @Limpoxe ACDD @Bunny Blue

aapt改造 诞生 aapt Android-Plugin-Framework @Limpoxe ACDD @Bunny Blue 模块1 0x7A 模块2 0x7B 模块3 0x7C Android-Plugin-Framework @Limpoxe aapt ACDD @Bunny Blue

诞生 Small诞生 模块1 0x7A 模块2 0x7B 模块3 0x7C aapt

轻 轻 A A’ B A C B 轻盈产出 @Compile-time 轻度Hook @Run-time

APK结构 B C 轻/轻盈产出 APK A A’ B AM.xml classes.dex resources.arsc res/* A 轻度Hook @Run-time A A’ B AM.xml 轻盈产出 @Compile-time A C B classes.dex APK resources.arsc res/*

APK拆解 轻/轻盈产出 AM$1 dex$1 arsc$1 res$1 AM.xml classes.dex resources.arsc 文本 文件(*.jar) 二进制 文件(*.xml/png) 拆分粒度/方案 AM$1 dex$1 arsc$1 res$1 AM.xml classes.dex resources.arsc res/* AM$2 dex$2 arsc$2 res$2

Arsc结构 轻/轻盈产出 resources.arsc 0000000: 0000010: 0000020: 0000030: 0000040: 0000050: 0000060: 0000070: 0000080: 0000090: 00000a0: 00000b0: 00000c0: 00000d0: 00000e0: 00000f0: 0000100: 0000110: 0000120: 0000130: 0200 0c00 4804 0000 0100 0000 0100 1c00 8c00 0000 0400 0000 0000 0000 0001 0000 2c00 0000 0000 0000 0000 0000 2500 0000 4800 0000 5700 0000 2222 7265 732f 6d69 706d 6170 2d68 6470 692d 7634 2f69 635f 6c61 756e 6368 6572 2e70 6e67 0020 2072 6573 2f6d 6970 6d61 702d 6864 7069 2d76 342f 6963 5f70 6c75 6769 6e2e 706e 6700 0c0c 4c65 6172 6e69 6e67 4172 7363 0006 0650 6c75 6769 6e00 0002 2001 b003 0000 7f00 0000 6e00 6500 7400 2e00 7700 6500 7100 7500 6900 6300 6b00 2e00 6100 7200 7300 6300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ....H........... ................ ,...........%... H...W...""res/mi pmap-hdpi-v4/ic_ launcher.png. r es/mipmap-hdpi-v 4/ic_plugin.png. ..LearningArsc.. .Plugin... ..... ....n.e.t...w.e. q.u.i.c.k...a.r. s.c............. resources.arsc

Arsc区域高亮 轻/轻盈产出/arsc格式 0000000: 0000010: 0000020: 0000030: 0000040: 0000050: 0000060: 0000070: 0000080: 0000090: 00000a0: 00000b0: 00000c0: 00000d0: 00000e0: 00000f0: 0000100: 0000110: 0000120: 0000130: 0200 0c00 4804 0000 0100 0000 0100 1c00 8c00 0000 0400 0000 0000 0000 0001 0000 2c00 0000 0000 0000 0000 0000 2500 0000 4800 0000 5700 0000 2222 7265 732f 6d69 706d 6170 2d68 6470 692d 7634 2f69 635f 6c61 756e 6368 6572 2e70 6e67 0020 2072 6573 2f6d 6970 6d61 702d 6864 7069 2d76 342f 6963 5f70 6c75 6769 6e2e 706e 6700 0c0c 4c65 6172 6e69 6e67 4172 7363 0006 0650 6c75 6769 6e00 0002 2001 b003 0000 7f00 0000 6e00 6500 7400 2e00 7700 6500 7100 7500 6900 6300 6b00 2e00 6100 7200 7300 6300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ....H........... ................ ,...........%... H...W...""res/mi pmap-hdpi-v4/ic_ launcher.png. r es/mipmap-hdpi-v 4/ic_plugin.png. ..LearningArsc.. .Plugin... ..... ....n.e.t...w.e. q.u.i.c.k...a.r. s.c.............

Arsc区段 轻/轻盈产出/arsc格式 0000000: 0000010: 0000020: 0000030: 0000040: 0000050: 0000060: 0000070: 0000080: 0000090: 00000a0: 00000b0: 00000c0: 00000d0: 00000e0: 00000f0: 0000100: 0000110: 0000120: 0000130: 0200 0c00 4804 0000 0100 0000 0100 1c00 8c00 0000 0400 0000 0000 0000 0001 0000 2c00 0000 0000 0000 0000 0000 2500 0000 4800 0000 5700 0000 2222 7265 732f 6d69 706d 6170 2d68 6470 692d 7634 2f69 635f 6c61 756e 6368 6572 2e70 6e67 0020 2072 6573 2f6d 6970 6d61 702d 6864 7069 2d76 342f 6963 5f70 6c75 6769 6e2e 706e 6700 0c0c 4c65 6172 6e69 6e67 4172 7363 0006 0650 6c75 6769 6e00 0002 2001 b003 0000 7f00 0000 6e00 6500 7400 2e00 7700 6500 7100 7500 6900 6300 6b00 2e00 6100 7200 7300 6300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ....H........... ................ ,...........%... H...W...""res/mi pmap-hdpi-v4/ic_ launcher.png. r es/mipmap-hdpi-v 4/ic_plugin.png. ..LearningArsc.. .Plugin... ..... ....n.e.t...w.e. q.u.i.c.k...a.r. s.c............. hex(LE) 小端代码 struct 数据结构 0200 ResTable_header 0100 ResStringPool_header 0002 ResTable_package 0202 ResTable_typeSpec 0102 ResTable_type

Arsc读取 轻/轻盈产出/arsc格式 1c00 8c00 0000 0400 0000 0000 0000 0001 0000 4800 0000 5700 0000 2222 7265 732f 6d69 706d 6170 2d68 6470 692d 7634 2f69 635f 6c61 756e 6368 6572 2e70 6e67 0020 2072 6573 2f6d 6970 6d61 702d 6864 7069 2d76 342f 6963 5f70 6c75 6769 6e2e 706e 6700 0c0c 4c65 6172 6e69 6e67 4172 7363 0006 0650 6c75 6769 6e00 0200 0c00 4804 0000 0100 0000 0100 hex(LE) 小端代码 struct 数据结构 0200 ResTable_header 0100 ResStringPool_header 0002 ResTable_package 0202 ResTable_typeSpec 0102 ResTable_type                2001 b003 0000 7f00 0000 6e00 6500 7400 2e00 7700 6500 7100 7500 6900 6300 6b00 2e00 6100 7200 7300 6300 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0002

Arsc/ID解析 轻/轻盈产出/arsc格式 资源ID 并非实际存在 hex(LE) 小端代码 struct 数据结构 0200 ResTable_header 0100 ResStringPool_header 0002 ResTable_package 0202 ResTable_typeSpec 0102 ResTable_type table: { package: { id: 0x7F, name: "net.wequick.arsc" }, strings: [ "res/mipmap-hdpi-v4/ic_launcher.png", "res/mipmap-hdpi-v4/ic_plugin.png", "LearningArsc", "Plugin" ], typeStrings: [ "attr", "mipmap", "string", "style" ], keyStrings: [ "ic_launcher", "ic_plugin", "app_name", "s_plugin", "AppTheme", "PluginTheme" typeSpecs: [ { types: [] }, { types: [ Configs@ic_launcher, Configs@ic_plugin ] }, { types: [ Configs@app_name, Configs@s_plugin ] }, { types: [ Configs@AppTheme, Configs@PluginTheme ] } ] } 7F 资源ID PP 包ID TT 类型ID NNNN 项目ID 01 02 03 04 0x 01 0000 0001 02 资源ID 并非实际存在 Configs@ic_launcher 03 04

分离方案1 轻/轻盈产出/arsc分离 想象中最简单的分离方式 存在问题:必须补齐资源(输出变大)、只能分离一个插件 host (0x7f) table: { package: { id: 0x7F, name: "net.wequick.arsc" }, strings: [ "res/mipmap-hdpi-v4/ic_launcher.png", "res/mipmap-hdpi-v4/ic_plugin.png", "LearningArsc", "Plugin" ], typeStrings: [ "attr", "mipmap", "string", "style" ], keyStrings: [ "ic_launcher", "ic_plugin", "app_name", "s_plugin", "AppTheme", "PluginTheme" typeSpecs: [ { types: [] }, { types: [ Configs@ic_launcher, Configs@ic_plugin ] }, { types: [ Configs@app_name, Configs@s_plugin ] }, { types: [ Configs@AppTheme, Configs@PluginTheme ] } ] } 01 02 03 04 0001 host (0x7f) |-- mipmap (02) | |-- ic_launcher (0000) | `-- values |-- strings.xml (03) | |-- app_name (0000) `-- syles.xml (04) |-- AppTheme (0000) plugin (0x7f) |-- mipmap (02) | |-- | `-- values |-- strings.xml (03) `-- syles.xml (04) |-- `-- ic_plugin (0001) `-- s_plugin (0001) `-- PluginTheme (0001) padding_mipmap_0000 资源ID PP 包ID TT 类型ID NNNN 项目ID 02 7F 0x 0000 padding_string_0000 padding_style_0000 存在问题:必须补齐资源(输出变大)、只能分离一个插件

分离方案2 轻/轻盈产出/arsc分离 实践中最极致的分离方式 host (0x7f) |-- mipmap (02) | |-- ic_launcher (0000) | `-- values |-- strings.xml (03) | |-- app_name (0000) `-- syles.xml (04) |-- AppTheme (0000) plugin ( |-- mipmap (02) | | | `-- ic_plugin ( `-- values |-- strings.xml (03) | `-- s_plugin ( `-- syles.xml (04) | `-- PluginTheme ( 0x7e ) 0000 0000 0000

融合 轻/轻盈产出 plugin ( |-- mipmap (02) | | | `-- ic_plugin ( `-- values | | | `-- ic_plugin ( `-- values |-- strings.xml (03) | `-- s_plugin ( `-- syles.xml (04) | `-- PluginTheme ( ) 0000 0x7e HOST 0x7e 0x7d 7c

轻度Hook 我重写一个「对象」的「方法」 轻/轻度Hook 我是一个Hook 让她忘了从前 0x7e HOST 方法A Hook A 方法B 我是一个Hook 我重写一个「对象」的「方法」 让她忘了从前 HOST 0x7e 0x7d 7c 一个对象

Hook条件 我重写一个「对象」的「方法」 轻/轻度Hook 我是一个Hook 让她忘了从前 但是首先 我要找到她 她「静态」的坐着 方法A Hook A 方法B 我是一个Hook 我重写一个「对象」的「方法」 让她忘了从前 但是首先 我要找到她 在我的「进程」里 她「静态」的坐着 她的方法向我「开放」 一个对象

Hook任务 轻/轻度Hook 但是首先 我要找到她 在 我的「进程」 里 她「静态」的坐着 她的方法向我「开放」 一个对象 方法A Hook A 方法B 但是首先 我要找到她 在 她「静态」的坐着 她的方法向我「开放」 com.user.galen 我的「进程」 里 启动 插件Activity

Activity启动过程 轻/轻度Hook Not Found 系统进程 我的「进程」 我的「进程」 system.process Intent解析 任务栈调度 Activity栈调度 我的「进程」 com.user.galen 启动 插件Activity 我的「进程」 com.user.galen 实际启动 插件Activity Not Found

伪装宿主 轻/轻度Hook Not Found 系统进程 我的「进程」 我的「进程」 system.process Intent解析 任务栈调度 Activity栈调度 我的「进程」 我的「进程」 com.user.galen 实际启动 插件Activity com.user.galen 启动 插件Activity Hook 伪装宿主 Not Found

还原插件 轻/轻度Hook 系统进程 我的「进程」 我的「进程」 system.process com.user.galen Intent解析 任务栈调度 Activity栈调度 我的「进程」 我的「进程」 com.user.galen com.user.galen 启动 插件Activity Hook 伪装宿主 Hook 还原插件 实际启动 插件Activity

还原解析 轻/轻度Hook 我的「进程」 系统进程 com.user.galen system.process Intent解析 任务栈调度 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { // 创建Activity if (r.activityInfo.targetActivity != null) { component = new ComponentName(r.activityInfo.packageName, r.activityInfo.targetActivity); } java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); // 绑定Context Context appContext = createBaseContextForActivity(r, activity); activity.attach(appContext, this, getInstrumentation(), ...); // 设置主题 int theme = r.activityInfo.getThemeResource(); if (theme != 0) { activity.setTheme(theme); // 触发onCreate mInstrumentation.callActivityOnCreate(activity, r.state); 我的「进程」 com.user.galen 系统进程 system.process Intent解析 任务栈调度 Activity栈调度 启动 插件Activity Hook 伪装宿主 还原插件 Small Droid Plugin 实际启动 插件Activity Android-Plugin- Framework ACDD Dynamic-Load-APK Direct-Load-APK

Android-Plugin-Framework 轻/轻度Hook 方案对比 插件方案 代表框架 包数 类加载器 个数 资源管理器 Context 完全隔离 Droid Plugin 1/插件 Dynamic-Load-APK 1 1/插件Activity Direct-Load-APK 宿主插件 两两融合 Android-Plugin-Framework 除主题外 完全融合 ACDD Small

巧 巧 IDE友好 @Debug 模块变身 @Release

IDE友好 巧/IDE友好 支持创建插件模块 支持编译插件模块 支持插件模块间依赖 支持联合调试 模块变身 @Release IDE友好 @Debug 支持创建插件模块 支持编译插件模块 支持插件模块间依赖 支持联合调试

IDE多模块 巧/IDE友好 支持创建插件模块 支持编译插件模块 支持插件模块间依赖 支持联合调试 app.* web.* app lib.* lib.*

模块依赖 巧/IDE友好 app.* web.* app lib.* lib.* vendor lib.* vendor vendor

模块变身 巧/模块变身 模块是开发态,插件是目标态。 模块 开发态 目标态 转换难点 app.* Application模块 可以依赖其他模块、可以独立运行 带代码、资源的插件 AAR(代码/资源)剥离 lib.* Library模块 可以被app.*依赖 资源ID锁定 [other].* 可以独立运行 仅含assets的插件

AAR分离1 巧/模块变身 模块是开发态,插件是目标态。 模块 开发态 目标态 转换难点 app.* Application模块 dependencies { provided fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.2.1' compile 'com.android.support:design:23.2.1' } 巧/模块变身 AAR分离1 模块是开发态,插件是目标态。 模块 开发态 目标态 转换难点 app.* Application模块 可以依赖其他模块、可以独立运行 带代码、资源的插件 AAR(代码/资源)剥离 lib.* Library模块 可以被app.*依赖 资源ID锁定 [other].* 可以独立运行 仅含assets的插件 AAR

AAR分离2 巧/模块变身 classes.jar *.class classes.dex classes.dex res/* res/* dependencies { provided fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.2.1' compile 'com.android.support:design:23.2.1' } app.main `-- build/intermediates/exploded-aar `-- com.android.support/appcompat-v7/23.2.1 dex classes.jar *.class classes.dex classes.dex aapt Small res/* res/* arsc res/* arsc res/*

总结 巧/模块变身 总结 classes.jar res/* arsc classes.dex *.class 开发时聚合 编译时分离 AAR dependencies { provided fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.2.1' compile 'com.android.support:design:23.2.1' } app.main `-- build/intermediates/exploded-aar `-- com.android.support/appcompat-v7/23.2.1 classes.jar res/* aapt arsc Small dex classes.dex *.class IDE多模块 公共库依赖 开发时聚合 PP分段 AAR分离 编译时分离 并入宿主 轻度Hook 运行时融合

TODO 总结 TODO 开发时聚合 编译时分离 运行时融合 按需加载 iOS插件化App Store布局 IDE多模块 公共库依赖 插件间依赖关系 iOS插件化App Store布局 xib级别的warm swap IDE多模块 公共库依赖 开发时聚合 PP分段 AAR分离 编译时分离 并入宿主 轻度Hook 运行时融合

Small@wequick GalenLin