Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >漫谈Android组件化及Web化

漫谈Android组件化及Web化

作者头像
IT大咖说
发布于 2018-07-30 02:47:44
发布于 2018-07-30 02:47:44
1.1K0
举报
文章被收录于专栏:IT大咖说IT大咖说

内容来源:2018 年 04 月 14 日,高级Android工程师陈家伟在“2018互联网开发者大会”进行《漫谈Android组件化及Web化》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:3326 | 9分钟阅读

摘要

本次分享主要讲述Android组件化和Android web化的原理与实践。

嘉宾演讲视频及PPT:http://t.cn/Rr62oSm

Android动态化介绍

动态化演进

安卓的动态化主要包含三个部分,分别是组件化、插件化、模块化。模块化很容易理解,指的是为了解耦将某一个功能拆分成独立的模块,最常见的模块有网络模块和下载模块。插件化和组件化的概念就比较模糊,不同的框架所做的定义都不一样,它们之间的边界也不太明显。

上图是某App对插件化和组件化的理解图示,左面表示的是组件化,右边表示的是插件化。组件化的机器人是由多个组件构成,插件化的机器人是一个整体可以进行分发。

这张示意图乍看没什么问题,但是其实还是存在漏洞,比如当组件化的机器人某一部分变的足够大的时候,该部分其实可以脱离出来成为新的机器人,而当插件化机器人功能越来越弱小的时候也可以演变从一个组件。总的来说组件化和插件化的边界并不是很明显,只是根据站的角度和处理问题的方法不同而产生的概念性上的定义。

Android动态化需要解决的问题

Android动态化需要解决4个问题,分别是Dex加载、资源加载、SO加载、四大组件加载。下文将介绍这四个问题所涉及的安卓的具体部分。

Dex是安卓编译后的产物,Java会被编译成class,安卓则对这些class文件进行压缩处理得到一个Dex。安卓的资源比较多,有图片、布局文件、动画等。SO是安卓的动态链接库,一般由C或者C++写成。安卓的四大组件Activity,Service,Content Provider,BroadcastReceiver必须在AndroidManifest.xml配置文件中声明才能够正常加载。

主流动态化框架

目前主流的动态化框架有Atlas、RePlugin、DroidPlugin、VirtualAPK,除开Atlas将自己定义为组件化框架外,其他三个都将自己定义为插件化框架。根据个人的观察发现,他们主要的区别在于对安卓的四大组件的处理上,Atlas是先定义这些组件再通过打包的方式处理。但是去年Atlas也做了一些插件化的处理,这使得目前的这四个框架都涉及到了插件化。

组件化和插件化

相信大家都经常遇到产品的某些需求要紧急上线的情况,但是App不同于H5开发那样可以随时发版,需要经过众多的渠道进行发布,而如果能够做到动态发版,对整个产品的演进和动态开发都会有比较好的推进作用。

另外减少包体积同样也很重要,一般同个App,iOS的包体积会比Android的更大,这是由于iOS无法进行本地代码的动态下发,而国内的安卓渠道审核相对比较松一些。还有一个需要关注的是热修复,它可以让我们即时的修复线上的BUG。

上文提到的这三点其实就是组件化和插件化共同目的,只不过他们在实现手段上有所不同。一般组件是和主工程一起打包,插件则可以独立打包、另外组件需要借助打包完成更多工作

动态加载原理

动态加载App思路之类加载

前面提到过插件化要解决的其中一个问题就是Dex加载。在Java中可以通过ClassLoader加载class文件,安卓方面则提供了BaseDexClassLoader。BaseDexClassLoader内部有很多DexFile,它是Dex的文件描述,要想实现类加载,可以直接将插件的DexFile前插到BaseDexClassLoader。这种方式就是单类加载器。

安卓中系统类由BootClassLoader加载,PathClassLoader继承自BootClassLoader,加载的是App类。Altlas为了实现类加载,将PathClassLoader替换为了自己的ClassLoader——DelegateClassLoader,这时所有类的加载都会经过DelegateClassLoader,且每个插件都由独立的PluginClassLoader加载,这些类的查找则由DelegateClassLoader完成。这种方式是多类加载器。

动态加载App思路之资源加载

安卓在打包的时候会为每个资源分配一个32位Int型的ID,采用16进制表示。0x后面是类似PPTTEEEE的形式,TT代表类别,EEEE代表条目,安卓中所有打包资源ID的PP都是7F。

安卓中的资源加载有两种方式,第一种是资源隔离。指的是每个插件由不同的Resources对象加载资源(安卓中通过Resources对象获取资源),这是为了避免由于资源ID相同造成的资源冲突问题。

第二个资源加载方式是资源分区,它通过修改安卓的打包工具,使得可以变更资源ID的PP,已达到避免ID重复的目的。

对比这两种方式可以发现,资源隔离的好处在于不需要修改打包工具, 毕竟打包工具是使用C++写的,维护起来也比较麻烦(aapt2已经支持资源分区)。资源分区的优势在于能够资源共用,因为它可以共用一个Resources对象,同时还可以避免资源冲突。

动态加载App之四大组件加载

四大组件的加载同样有两种方式。一种是通过合并manifest信息方式,比如手动拷贝或者打包,将插件Menifest信息合并入主APP。另一种是事先声明空的四大组件,再通过Hock掉系统的入口来启动四大组件。

Google玩转动态化

虽然动态框架在国内很流行,但国外对此却不是很热衷,他们更多的还是使用React Native

国内的动态框架主要是研究如何通过反射调用或者Hock掉系统API来达到目的,不过系统API的调用其实存在着风险,因为每个版本的私有API的变动都是挺大的。为此Google也提供了一种动态框架——Instant,它通过Google Play Service加载,即有插件化也有组件化的特点,通过aapt2来完成资源分区,对于四大组件的加载采用预埋、代理的方式启动Activity service。

Web化介绍

一般App的活动页都是使用H5开发,因为H5可以进行动态更新。但是H5体验上还是不如Native,在动画以及一些高级功能方面也不够强。

而组件化也存在着问题,在最新发布的Android P版本中限制了对私有API的访问,一旦访问私有API 应用就会崩溃。虽然可以通过某些技术手段攻克这一限制,但是其实还有另一种方式——SPA(单页面应用)。 对于Web端的SPA,它只有一个HTML文件,然后通过JS渲染,以达到在一个HTML的进行页面跳转的目的。

下面来看下Android中的web化。

首先是React Native。React Native中每个页面都是一个View,且都在Activity中,它通过控制View的切换来进行页面跳转。

Android提供了一种布局容器——Fragment,Activity可以承载很多Fragment,通过切换Fragment也可以达到页面切换的效果。这就是Android Native的web化。

Android web核心原理

Android Native web实现的核心是多类加载器、资源隔离以及context替换。

因为要保证命名和混淆规则不能出现同一个类名,所以无法使用单类加载器。多类加载器由于采用不同ClassLoader加载插件,因此不用顾虑命名是否重复。

Context替换指的是将Fragment中的Context替换成我们自定义的Context。Fragment中所有的类和资源都是通过Context访问,而通过自定义Context就能达到动态加载Activity外部插件的目的。

以上为今天的全部分享内容,谢谢大家!

推荐文章

  • 小米:VR产业中Android的现状与挑战
  • 精准送达目标客户——基于极光平台优化Android通知
  • Getting started with Kotlin on Android
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解Android插件化技术
插件化技术可以说是Android高级工程师所必须具备的技能之一,从2012年插件化概念的提出(Android版本),到2016年插件化的百花争艳,可以说,插件化技术引领着Android技术的进步。本篇
xiangzhihong
2018/02/06
1.8K0
深入理解Android插件化技术
【Android 插件化】Hook 插件化框架 ( 合并 “插件包“ 与 “宿主“ 中的 Element[] dexElements | 设置合并后的 Element[] 数组 )
【Android 插件化】插件化简介 ( 组件化与插件化 ) 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 ) 【Android 插件化】插件化原理 ( 类加载器 )
韩曙亮
2023/03/29
5420
史上最全的Android面试题集锦
在Android开发中,不管是插件化还是组件化,都是基于Android系统的类加载器ClassLoader来设计的。只不过Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码文件会生成一个.class文件,而Android是把所有Class文件进行合并、优化,然后再生成一个最终的class.dex,目的是把不同class文件重复的东西只需保留一份,在早期的Android应用开发中,如果不对Android应用进行分dex处理,那么最后一个应用的apk只会有一个dex文件。
做个快乐的码农
2021/12/17
8120
android插件化介绍
支持插件化的app可以在运行时加载和运行插件,这样便可以将app中一些不常用的功能模块做成插件,一方面减小了安装包的大小,另一方面可以实现app功能的动态扩展。
李小白是一只喵
2020/11/24
8790
android插件化介绍
Android插件化学习之路(一)之动态加载综述
前段时间,公司项目完成了插件化的开发,自己也因此学习了很多Android插件化的知识,于是想把这些内容记录下来,本次带来Android插件化的第一篇:动态加载综述
老马的编程之旅
2022/06/22
1.2K0
Atlas-组件化框架 入门
ps:如果您看过atlas的官方介绍,本片文章可以略过,期待我们追溯源码的过程中有你的参与
Anymarvel
2018/10/22
1.3K0
Atlas-组件化框架 入门
蘑菇街Android组件与插件化
插件化的基石 -- apk动态加载 随着我街业务的蓬勃发展,产品和运营随时上新功能新活动的需求越来越强烈,经常可以听到“有个功能我想周x上,行不行”。行么?当然是不行啦,上新功能得发新版本啊,到时候费时费力打乱开发节奏不说,覆盖率也是个问题。苏格拉底曾经说过:“现在移动端的主要矛盾是产品日益增长的功能需求与平台落后的发布流程之间的矛盾”。 当然,作为一个靠谱的程序猿,我们就是为了满足产品的需求而存在的(正义脸)。于是在一个阳光明媚的早晨,吃完公司的免费早餐后,我和小强、叶开,决定做一个完善的Andro
xiangzhihong
2018/02/01
7360
Android插件化系列一:Binder机制,ClassLoader
从今天开始,我会花较多的时间来跟大家一起学习Android插件化。这一篇文章是Android插件化的启动篇。
没关系再继续努力
2021/12/22
5480
Android 面试之必问高级知识点
在Android早期的版本中,应用程序的运行环境是需要依赖Dalvik虚拟机的。不过,在后来的版本(大概是4.x版本),Android的运行环境却换到了 Android Runtime,其处理应用程序执行的方式完全不同于 Dalvik,Dalvik 是依靠一个 Just-In-Time (JIT) 编译器去解释字节码。
xiangzhihong
2021/07/21
6500
【Android 插件化】“ 插桩式 “ 插件化框架 ( 代理 Activity 组件开发 )
【Android 插件化】插件化简介 ( 组件化与插件化 ) 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 ) 【Android 插件化】插件化原理 ( 类加载器 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 ) 【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
韩曙亮
2023/03/29
7180
有关Android插件化思考
最近几年移动开发业界兴起了「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优越性,令人目不暇接。随着公司业务快速发展,项目增多,开发资源却有限,如何能在有限资源内满足需求和项目的增长,同时又能快速响应问题和迭代新需求,这就是一个矛盾点。此时,插件化技术正好风生水起,去了解各个主流框架实现思路,看看能对目前工作是否有帮助,是很有必要的。
用户1269200
2018/10/08
1.3K0
有关Android插件化思考
《Android插件化技术——原理篇》
| 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头。从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结其中的技术原理。由于本人水平有限,插件化框架又相当复杂,文中若有错误或者不准确的地方望高手指点。 内容概要 一、发展历史 插件化技术最初源于免安装运行apk的想法,这个免安装的apk可以理解为插件。支持插件化的app可以在运行时加载和运行插件,这样便可以将app中一些不常用的功能模块做成插件,一方面减小了安
腾讯Bugly
2018/03/23
9.8K0
Android插件化原理解析
在解决插件中组件的生命周期,通常的做法是通过 Hook相应的系统对象,实现欺上瞒下,后面将通过Activity的插件化来进行讲解。
用户1205080
2019/02/26
9020
Android 面试必问高级知识点(2021)
在Android早期的版本中,应用程序的运行环境是需要依赖Dalvik虚拟机的。不过,在后来的版本(大概是4.x版本),Android的运行环境却换到了 Android Runtime,其处理应用程序执行的方式完全不同于 Dalvik,Dalvik 是依靠一个 Just-In-Time (JIT) 编译器去解释字节码。
没关系再继续努力
2021/11/16
4170
基于Google动态化方案的组件化演进
国内Android动态化方案已经蓬勃发展数年之久,在React Natvie、Flutter这些跨平台方案未出现之前,类似Atlas、Replugin、DLA等Android动态化方案在业界独领风骚。在国内动态化方案也分为两个流派:组件化与插件化。比如Atlas自称为组件化方案,另外诸如Replugin、DroidPlugin等称为插件化方案。本文不具体说明组件化与插件化区别相关介绍文章已多入牛毛,这里就不再赘述。
用户1907613
2018/07/25
2.4K0
基于Google动态化方案的组件化演进
android插件化
因为现在的一个app中功能模块的解耦和运维团队的分离越来越厉害, 如果每一个功能模块升级都对所有的模块进行升级,这样,发布流程的效率就太低了。
用户9854323
2022/06/25
3580
android插件化
【Android 逆向】类加载器 ClassLoader ( Android 的八种类加载器 | ClassLoader | BaseDexClassLoader | DexClassLoader )
ClassLoader 是抽象类 , 是所有 类加载器 ClassLoader 的父类 ;
韩曙亮
2023/03/30
1K0
【Android 逆向】类加载器 ClassLoader ( Android 的八种类加载器 | ClassLoader | BaseDexClassLoader | DexClassLoader )
插件化三问—字节真题
提到免安装应用,大家肯定第一想到的就是小程序,但是在Android中其实是有这么一项技术用于动态加载apk的,那就是插件化。今天一起来看看吧!
码上积木
2020/10/29
7200
插件化Activity: 技术方案分享
插件化技术从 2015 年就开始百花齐放,如: 奇虎 360 的 replugin,滴滴的 VirtualAPK,到现在的 VirtualApp,插件化经历了市场严峻的考验,也算逐步成熟,今天就带大家手把手实现一个插件化Activity框架,希望对你有所帮助~
小木箱
2020/11/24
9950
【Android 插件化】Hook 插件化框架 ( 通过反射获取 “宿主“ 应用中的 Element[] dexElements )
【Android 插件化】插件化简介 ( 组件化与插件化 ) 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 ) 【Android 插件化】插件化原理 ( 类加载器 )
韩曙亮
2023/03/29
4970
推荐阅读
相关推荐
深入理解Android插件化技术
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档