GMTC分享——当插件化遇到 Android P

2023-11-06

转自:https://blog.csdn.net/xinzhou201/article/details/80881604

GMTC分享——当插件化遇到 Android P

手机京东技术团队 2018-06-30

举报

GMTC分享——当插件化遇到 Android P前言

 

Android P 来了,插件化将何去何从?Android作为操作系统涉及的面比较广,不可能在所有的方面都能走在大家的需求之前,尤其是这几年,App越来越大,而相应的Android官方给出的方案一直不太符合中国的国情,先是65536问题,再是多团队协同开发,再到App如何瘦身,这些问题一直困扰着中国的开发者。国内的开发者们在经过了无数高手的实践之后,在2016、2017年插件化技术越来越成熟,发展到了顶峰,井喷了许多高质量的插件化框架,以应对大型App的开发。2018年,Google官方也终于祭出了大杀器 -- 禁止调用私有API,并推出官方的动态化框架Android App Bundles。 随着Android P的发布,使用插件化的你们做好应对方案了吗?

GMTC分享——当插件化遇到 Android P

 

京东商城资深Android系统架构师,Android组件化技术负责人,致力于Android系统构架和优化,带领团队从无到有实现了Aura组件化体系建设。

GMTC分享——当插件化遇到 Android P   导读

GMTC分享——当插件化遇到 Android P

全球移动技术大会(GMTC):是由InfoQ主办的全球顶级技术盛会,大会的目的是促进全球移动技术交流,推动国内技术升级。

手机京东开放平台:基于手机京东数年移动研发技术实践积累,为企业移动应用研发提供一站式技术解决方案,帮助企业快速构建高可用移动应用。

Aura:是手机京东开放平台 Android 端解决方案,提供了适合大型企业开发的模块化,插件化框架和平台,可有效提高企业的开发效率。

2018年6月22日,我有幸在北京国际会议中心的GMTC大会上,分享了一个主题《当插件化遇到AndroidP》。分享这个议题的初衷是由于今年Google放出了Android P的开发者预览版的同时加入了限制App调用非SDK接口的计划,它这是释放了一个将会治理目前各种篡改Android系统乱象的信号,随着这项计划的推进,将会涉及到国内的很多App,尤其是使用加固和插件化技术的App。作为App的开发者,早一步重视这个事情,则将会早一步受益,基于这个前提,京东已经开始着手进行此方面的研究和推进工作了。

演讲的主题主要分为以下五个部分:

● 解读一下Android P的禁令

● 我们一起来学习一下Android官方的动态化框架Android app bundles

● 插件化的路在何方

● 与大家一起分享京东的架构升级和重构是怎么做的

● 解决京东架构升级中的一些关键技术点

Android P 是 google 将在2018年推出的 Android 新版本,将于第三季度发出正式版本,在这之前会有五个预览版本。在3月份放出第一个预览版本的时候,宣布了禁止应用调用系统非SDK接口的消息;在5月初,Google IO 开发者大会上,推出了 Android 的官方动态化框架 Android app bundles。下面篇幅中我将会对这两个方面进行一个全面解读,并对可以采取的一些应对方案进行分析和阐述。

 

GMTC分享——当插件化遇到 Android P  Android P 的禁令解读

GMTC分享——当插件化遇到 Android P

访问非SDK接口的后果

在 Android 官网上面列出了几种通过反射调用访问非SDK接口的方式和引发的后果,从表格中我们看到后果主要有两个分别是抛出异常和返回的结果列表中没有私有API接口。

 

实施计划

但是,Google 并没有一刀切的直接执行禁令,而是分步骤的进行,给了开发者一个缓冲期去修改自己的App。采用的办法是维护三个名单,分别是浅灰名单,深灰名单,黑名单:

浅灰名单中的接口还可以继续在 AndroidP 中使用,但是在未来的版本中就有可能会移到黑名单中,也可能会开发新的public API来供开发者光明正大的使用。

深灰名单中的接口,在Android P 的后续预览版中将不可访问,所以如果有使用深灰名单中的接口,必须马上进行整改。

黑名单中的接口就不允许调用了,如果调用直接就是抛异常等行为。

 

注意

这个禁令是在 Android P 上起作用,而且针对应用的 target SDK 是否是 28 会有不同的表现;Google Play 要求从 2018 年 8 月份开始应用的最低版本为 Target SDK 26,明年可能将会要求最低的 Target SDK 为 28,所以开发者一定要重视。

 

GMTC分享——当插件化遇到 Android P Android App bundles

GMTC分享——当插件化遇到 Android P

Android 官方动态化框架 Android App Bundles,简称 AAB,是今年5月初在Google IO 开发者大会上首次亮相,这是官方支持的动态化框架,值得开发者尽快学习和使用。GMTC分享——当插件化遇到 Android P

通过一张动图来感性的认识一下AAB,左图是legacy APK,右图是动态分发 apk, 可以看到左图是把所有的代码和资源统统塞到了用户的App中,所以导致App体积变大,而右图只把适合用户手机分辨率和语言等按维度划分的相关部分动态下发到用户手机上,这样能够极大的减小APK的大小。

 

Android App bundles的内部结构

AAB拆分后主要分为三种类型的APK,它们分别是Base APK, configuration APKs, Dynamic feature APKs;

Base APK是首次安装的APK,它提供了应用的基本功能,并且包含其它Splite Apks 可以访问的代码和资源;

Configuration Apks包含了特定的屏幕密度,cpu架构和语言资源等,有两种类型的configuration apk, 一种是 Base Configuration Apks, 一种是 Feature Configuration Apks,当用户下载Base APK或者Dynamic feature Apk的时候,只需要下载其对应的特定资源;

Dynamic feature Apks是首次安装的时候不需要的代码和资源,是由开发者自行定义和开发出来的,在代码中使用 Play Core Library 动态下载和安装

 

AAB的整体流程

GMTC分享——当插件化遇到 Android P

 

首先,开发者研发自己的APP,并把它编译打包成AAB格式,然后上传到Google Play服务器上;

 

服务器会把客户的AAB文件拆分成三种类型的APK,并存储在Google Play的服务器中;

 

当用户使用时,会从市场上首次安装Base apk, 然后按需下载 Dynmaic Apk, 对于以上两种APK, 均有配套对应的 feature configuration APK进行下载。

 

Android App Bundles 总结

优点

● 官方推出的,背景强大

● 通过了两种方式减小了 APK 的体积,一是去除了与用户机型不匹配的代码和资源,二是动态下发首次不需要安装的部分

 

限制

● 目前只能通过 Google Play发布

● 处于测试阶段,用户需要申请加入 Google 的 Dynamic feature beta program 计划才能使用

● 最低支持的版本是 Android 5.0,

● 只是单纯的减小了包体积,不能通过动态下发来修复Bug和增加之前未预算的新功能,也不能增加Base Apk的manifest中没有的四大组件

 

使用成本

● 需要开发者的 IDE 升级到 Android Studio 3.2

● 需要集成 Play Core Library 来支持 dynamic feature 的下载和安装

● 可以加入 SplitCompat 库以支持6.0以下的手机来热更新D ynamic feature apk

● 所有的模块必须位于同一个工程

● 如果之前的Library想改改造成Dynamic Feature Module 必须手动改造

GMTC分享——当插件化遇到 Android P

 

GMTC分享——当插件化遇到 Android P   插件化的路在何方

GMTC分享——当插件化遇到 Android P

实现插件化的黑科技

插件化的流派比较多,但不管是哪种流派,它们一般都用到了一些黑科技,主要有三种:

● Hook App运行的关键点,以达到动态检测是否调用了插件中的代码和资源,比如Hook Instrumentation等

● 动态的加载插件中的类,这里分为单Class Loader和多Class Loader技术,这两种技术都用到了反射技术,以达到替换系统的ClassLoader或者是增加自己的Class Path的目的

● 动态的加载插件中的资源,一般会反射调用 AssetManager.addAssetPaths 这个方法.下面这张图是通过官方的扫描脚本扫描出来的手机京东的插件化框架Aura使用非sdk接口的结果,从中可以看出使用了浅灰名单中的两个方法 

 

GMTC分享——当插件化遇到 Android P

 

路在何方

当初为什么要研发和使用插件化技术,现在我们的真实需要是什么?

GMTC分享——当插件化遇到 Android P

 

研发和使用插件化技术的原因

● 绕过65536问题,快速启动

● 模块解耦

● 多个团队并行开发

● 加快编译速度

● 动态部署

 

现在的真实需求

● 去黑科技

● 平稳过渡

● 边界隔离

● 并行开发

● 独立调试

● 快速编译

● 动态部署

 

探索道路

● Follow官方的方案

● 组件化方案

● 大前端:RN, Weex, 快应用等

 

方案对比

功能 插件化 AAB 组件化 前端
边界隔离 ✔️ ✔️ ✔️ ✔️
并行开发 ✔️ ✔️ ✔️
独立调试 ✔️ ✔️ ✔️
兼容性
成熟度 黑科技 需研发
动态部署 ✔️ 打折 ✔️
迁移成本 /

这几个方案各有优缺点,其中AAB方案还不太成熟,前端和AAB的迁移成本都比较高,组件化的方案也需要研发一个适合自己公司的框架。

 

适配步骤

● 增加组件化功能

● 组件化和插件化相结合,具有两者的优点

● 从长期来看,可以向AAB和前端方向靠拢

● 持续改进和优化,以保持自身的活力

 

手机京东的架构升级和重构

GMTC分享——当插件化遇到 Android P

 

制定重构目标

第一要务就是去除插件化去除黑科技

第二要务是从现有的方案平稳过渡到新方案

第三是我们在重构的过程中顺便把京东之前的一个毒瘤去除掉,也就是体积庞大并且中心化的基础类库JdLib去中心化

最后是插件和组件可随时互相转换

 

升级手机京东的架构

目前京东的插件化框架使用的是阿凡达(Avatar)项目中的 Aura 框架,我们将现在的的插件化框架 Aura 升级到插件化和组件化相结合的 AuraPlus 框架,它具有灵活互转,无缝调用,优势互补等优点。

GMTC分享——当插件化遇到 Android P

从图中,我们看到,一切皆组件,最下层是基础组件,再往上层是业务组件和业务插件,业务组件是直接依赖基础组件的,它们中间不再存在JDLIB这个中心化的基础类库了。再上层是通过业务模块任意组合成的京东的应用。

 

GMTC分享——当插件化遇到 Android P 插件化关键技术点

GMTC分享——当插件化遇到 Android P

一个核心,四大技术

GMTC分享——当插件化遇到 Android P

一个核心

● 我们是围绕"高内聚,低耦合"这个核心思想来进行的重构和升级的。

 

四大技术

● 以 Project 和 Module 为边界进行组件间物理隔离

● 使用了一个巧妙和灵活的组件间通讯的方式,在自由和隔绝之间寻找到了一个最佳平衡点

● 处理组件间的依赖关系

● 其它的关键技术点

 

架构的项目结构

 

我们采用的是一主工程多子工程的开发模型,一切皆组件,组件是采用的小团队独立开发的模式。

 

我们这个模型与网上流行的一般的 Library和 Application 承着编译类型的不同而转换的方式是不同的,我们这种方式需要在每个组件内实现一个独立的 Application 壳工程

 

这样带来的好处是避免了很多 Library和 Application 互相转换带来的坑,比如 ButterKnife 中的 R 和 R2 问题。

 

组件间的通讯

 

GMTC分享——当插件化遇到 Android P

 

组件最终的编译结果生成了两个产物,一个是Api.jar,一个是Full.aar

 

当组件需要依赖其它组件时,只需要provided其它组件的Api.jar,而在宿主工程编译整体APK时,再 Compile Full.aar

 

这种巧妙的方式,能够在自由和隔离之间找到一个最佳平衡点。

 

组件依赖

GMTC分享——当插件化遇到 Android P

 

我们看一下这个图,组件A依赖组件B,C,D,组件B依赖组件E。

 

那么能不能通过依赖传递让组个A再依赖组件E呢,答案是不能,我们制定了一个规则,如果组件A想依赖组件B,则必须明确写出

 

这样做的好处是简化了组件之间的依赖关系,使它们基于接口的依赖更加明确和清晰化。

 

组件提效武林秘籍

GMTC分享——当插件化遇到 Android P

 

前边我们重构的的结构图中介绍到,我们去除了 JDLIB 这个庞大而臃肿的基础类库,业务组件和业务插件是直接依赖基础组件的

 

但是常用的基础组件有好多个,如果每个业务组件都写一遍的话,则会比较麻烦和重复,这对于追求完(tou)美(lan)的程序员来说是不可接受的

 

所以我们使用 Gradle 插件做了一个薄而灵活的SDK层,这样,业务组件和业务插件只需要一行代码即可引入多个常用的基础组件,起到了原先JDLIB的功能,但又不致于耦合和臃肿。

 

其它秘籍

 

预防资源ID冲突,可以加上resourcePrefix前缀;

 

为了方便管理第三方库,做了一个统一管理第三方库的组件 ThirdBundle;

 

因为组件对外暴露的API是jar,不能有资源,所以还专门实现了一个BaseResBundle来存放公共资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GMTC分享——当插件化遇到 Android P 的相关文章

  • 【VUE】基于VUE的图片预览插件 vue-photo-preview

    使用方法 1 安装 npm install vue photo preview save 2 在 main js 中引入配置文件 import vuePicturePreview from vue picture preview Vue u
  • 游戏开发unity插件Magica Cloth:学习贴汇总(持续更新)

    插件说明 高效的布料系统 支持jobs 开源 官方下载地址 https assetstore unity com packages tools physics magica cloth 160144 unity插件初步配置 BoneSpri
  • pg常用插件

    pg软件包自带插件 前言 pg的插件是基于库的 pg的数据字典介绍 1 pg stat statements插件 Pg stat statements 是一个扩展 而不是核心数据库的一部分 它是一个contrib 扩展 随 postgres
  • vue封装插件并发布到npm上

    vue封装插件并发布到npm上 项目初始化 首先 要创建项目 封装vue的插件用webpack simple很合适 vue init webpack simple 项目名称此命令创建我们的项目的目录 创建文件夹和文件 最后结构是这样的 然后
  • 推荐几个 VS Code 扩展、主题和字体

    前言 工欲善其事 必先利其器 VS Code 作为当前最流行的开源代码编辑器之一 要说它为什么这么受大众喜爱 我觉得一是它现代化的界面 二是它强大的扩展系统 得益于 VS Code 的扩展系统 我们可以给编辑器加上各种 Buff 让它变成自
  • 做一个统计单词数目的Atom插件

    本文是Atom 教程 制作单词计数插件的简化介绍 所有代码都来自这篇文章 如果希望参考详细的文档 请直接查看原文 这篇文章用一个简单的小例子 为我们讲解了如何编写一个Atom编辑器插件 该例子使用的是CoffeeScript 所以为了更好地
  • 微信 Android 模块化架构重构实践(上)

    转自 https cloud tencent com developer article 1005631 作者 carlguo 微信Android架构历史 微信Android诞生之初 用的是常见的分层结构设计 这种架构简单 清晰并一直沿袭至
  • Eclipse上的HTML/JSP/XML编辑器插件Eclipse HTML Editor

    官网 http amateras sourceforge jp cgi bin fswiki en wiki cgi page EclipseHTMLEditor Eclipse HTML Editor is an Eclipse plug
  • Android博客周刊专题之#插件化开发#

    转自 http www androidblog cn index php Index detail id 16 本期专栏目讨论插件化开发 插件化涉及的东西很多 所以我们需要多个维度去学习 大概分为5个部分 预备知识 入门 进阶 系列 类库
  • js复制功能插件

    JavaScript内容复制插件Clipboard js
  • js-image-compressor 图片压缩插件

    1 安装插件 npm i js image compressor 2 引入 import ImageCompressor from js image compressor 3 使用 compressionImage file return
  • 关于谷歌浏览器安装油猴插件失败的解决方法

    今天拿到了一台二手电脑 刷完之后开始安装需要的程序 在给谷歌浏览器安装油猴插件的时候出现了很多错误 现在一一道来 希望对大家有所帮助 一 不知道如何找油猴插件 上某度搜了一下 都是exe执行文件 运行一下不知道会带来多少 兄弟姐妹 官网又没
  • JavaScript 生成流程图

    插件地址 dagre d3 引用的资源 d3 v3 min js http d3js org d3 v3 min js dagre d3 min js http cpettitt github io project dagre d3 v0
  • Eclipse中启动Tomcat无任何反应

    推动了软件业不断发展的可以说有3个方面的东西 过程 方法 技术 方法附会到哲学上应该就是方法论了 做很多事情都是需要方法的 比如写一篇案例 随心随意写也可以写出来 但是别人能否理解 如何检测自己描述清晰都是没有参考的 如果有个模板的 这样按
  • Android中so使用知识和问题总结以及插件开发过程中加载so的方案解析

    转自 https blog csdn net jiangwei0910410003 article details 52312451 一 前言 Android中有时候为了效率以及平台开发库的支持 难免会用到NDK开发 那么都会产生一个so文
  • chrome扩展开发调试

    chrome扩展由content scripts browser actions background等多个部分组成 其中 content scripts属于注入web页面 所以在contentscripts中的console log会被正
  • element-ui 下拉菜单 el-dropdown-menu 组件 不能动态渲染数据怎么解决?

    关于element ui 下拉菜单 el dropdown menu 组件 不能动态渲染 数据怎么解决 element ui 官网中的例子是这样写的
  • jspdf

    使用html2canval将html转为canvas 再使用jspdf实现导出pdf 需设置要导出的每一页为1400 900 要导出pdf的父元素容器不能有隐藏和滚动条 隐藏部分html2canval无法截屏转为canvas functio
  • Echarts出现图表被压缩到很窄的情况的解决方法

    图表被压缩到很窄 可能是因为JSs执行太快 CSS来不及渲染 导致canvas只有默认的宽度 可以使用setTimeout 延迟加载JS
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面

随机推荐

  • 微信记录怎么恢复?恢复已删除微信历史记录的4种方式

    恢复已删除微信历史记录的4种方式 如何在有 没有备份的情况下在 iPhone 和 Android 上恢复旧的或已删除的微信历史记录 如聊天对话 语音消息 照片 图片和视频剪辑 参考本指南 祝您成功恢复微信数据 关于微信数据恢复 说真的 微信
  • 【CVPR2022 BoostMIS 论文笔记】自适应伪标记和信息主动标注的医学图像半监督学习

    目录 摘要 1 Introduction 目的 贡献 3 Method 3 1 公式化符号 3 2 医学图像任务模型 3 3 基于一致性的自适应标签传播器 3 4 对抗性不稳定选择器 3 5 平衡不确定性选择器 3 6 训练算法 4 实验
  • Springboot + Vue ElementUI 实现MySQL&&Postgresql可视化

    一 功能展示 PostgreSQL教程 实现类似于MySQL的show create table功能实现见末尾 效果如图 DB连接配置维护 Schema功能 集成Screw生成文档 导出库的表结构 导出表结构和数据 表对象操作 翻页查询 查
  • Mybatis快速入门

    目录 MyBatis简介 MyBatis基于xml的快速入门 1 案例准备 2 引入依赖 3 编写全局配置文件 4 编写持久层接口的映射文件 5 编写测试类 MyBatis基于注解的快速入门 MyBatis简介 MyBatis 是一个优秀的
  • nodejs安装及环境配置

    一 下载 安装 1 下载node js 下载地址 Node js 2 安装 2 1选择Node js runtime 2 2这里不用选择安装其他的插件 如果选择会消耗2 3g流量的 2 3安装完成 3 检查是否安装成功 3 1 node v
  • C语言——时间制转换

    C语言 写一个程序 要求用户输入24小时制的时间 然后显示12小时制的时间 首先我们得搞清楚24小时制和12小时制之间的差异 从上步的差异中 我们得到规律 整理思路 并完成代码 考虑到代码的健壮性和实用性 考虑可能会遇到的问题 比如用户输入
  • 时间序列——季节系数法

    注 参考司守奎老师的数学建模与算法书籍 在数学建模问题中 有很多类问题具有 季节性特点 类似于不同蔬菜在一年四季中的价格变化 季节性服装在一年四季的价格变化等 对于季节性时间序列的预测 可以采用 季节系数法 来预测时间序列的变化趋势 在时间
  • 【python 1】python 基础

    文章目录 一 格式化输出 1 占位符 2 拼接输出 3 message 输出 4 format 输出 二 input 输入 三 pass break 四 字符串 五 列表 六 元组 七 字典 八 集合 一 格式化输出 1 占位符 s str
  • 文件读写的理论

    为了提高效率 稍微复杂一些的操作系统对文件的读写都是带缓冲的 Linux当然也不例外 所谓缓冲 就是操作系统为最近刚读写的文件内容在内核保留一份副本 以便当再次需要已经缓冲存储在副本中的内容时就不必再临时从设备上读入 而需要写的时候则可以先
  • Jmeter-使用http proxy代理录制脚本

    Jmeter 使用http proxy代理录制脚本 第1步 打卡jmeter工具新增1个线程组 第2步 给线程组添加1个HTTP请求默认值 第3步 设置下HTTP请求默认值第4步 在工作台中新增1个 HTTP代理服务器 第5步 设置HTTP
  • c语言中weak用法,c语言中weak的作用

    c语言中weak的作用 转载参考至 https blog csdn net q251900 在u boot源码中看到 weak关键字 在移植过程中遇到了问题 用例 weak在不同的环境中用法不同 在stm32源码中也比较常见 在u boot
  • BeanCreationException: Error creating bean with name ‘org.springframework.web.servlet.mvc.method.ann

    BeanCreationException Error creating bean with name org springframework web servlet mvc method annotation ExceptionHandl
  • 测试中

    root ubu blockchain2 ll total 44 drwx 5 root root 4096 Aug 4 09 48 drwxr xr x 23 root root 4096 Jul 26 11 26 rw r r 1 ro
  • MVC模式实现学生信息管理

    MVC全名是Model View Controller 是模型 model 视图 view 控制器 controller 的缩写 一种软件设计典范 用一种业务逻辑 数据 界面显示分离的方法组织代码 将业务逻辑聚集到一个部件里面 在改进和个性
  • Markdown表格-换行、合并单元格

    文章目录 1表格中对其 换行处理 1 1 一般我们都会这样用表格如下 1 2 当然这里也可以通过设置 左对齐 右对齐 1 3 实现表格内容换行 2 合并表格 2 1 合并表格行 2 2 合并表格列 2 3 综合实例 1表格中对其 换行处理
  • MyCat配置文件

    1 MyCat 配置文件简介 Mycat的架构其实很好理解 Mycat是代理 Mycat后面就是物理数据库 和 Web 服务器的 Nginx 类似 对于使用者来说 访问的都是Mycat 不会接触到后端的数据库 我们现在做一个主从 读写分离
  • 区块链改革杭州闭门会议——分享链改机遇,探讨价值联动!

    2018年8月19日14点 区块链改革 链改 闭门会暨链改超级节点 杭州 会议在杭州钱江新城华润大厦隆重召开 大会围绕 分享链改机遇 探讨价值联动 为主题 展开系列讨论 基于各界对区块链赋能实体经济的广泛共识 和区块链赋能实体经济场景的逐步
  • python计算距今时间

    计算距今时间 计算一个 ISO 8601 格式的时间字符串距离今天的天数 import datetime 定义时间字符串 time str 2023 08 03T09 30 29 359 08 00 解析时间字符串为datetime对象 d
  • 关于openldap/bdb的一些配置和维护的问题

    一 配置部份在基本配置完成之后 可以在slapd conf设置一些提高安全和效率的选项 cachesize 5000 checkpoint 1024 5 cachesize是ldap在内存中缓存的记录条数 这个缓存是openldap自己维护
  • GMTC分享——当插件化遇到 Android P

    转自 https blog csdn net xinzhou201 article details 80881604 GMTC分享 当插件化遇到 Android P 手机京东技术团队 2018 06 30 举报 前言 Android P 来