type
status
date
slug
summary
tags
category
password
icon
什么是组件化
- 组件化和模块化其实是⼀回事
- 另外不同的⼈对于它的定义是不⼀样的
- 定义:
- 拆成多个 module 开发就是组件化
- 以前的 Android 开发不是现在这样⽤ gradle 的,⽤的是 ant,做模块拆分⽐较麻烦
- 现在有了 gradle,拆模块⾮常⽅便了。不过模块化开发是在 gradle 到来之前就有了的
什么是插件化
App 的部分功能模块在打包时并不以传统⽅式打包进 apk ⽂件中,⽽是以另⼀种形式⼆次封装进 apk 内部,或者放在⽹络上适时下载,在需要的时候动态对这些功能模块进⾏加载,称之为插件化。
这些单独⼆次封装的功能模块 apk ,就称作「插件」,初始安装的 apk 称作「宿主」。
插件化是组件化的更进⼀步推进。
插件化基础:反射
反射的写法
反射的⽬的
Java 既然提供了可⻅性关键字 public private 等等,⽤来限制代码之间的可⻅性,为什么⼜要提供反射功能?
- 可⻅性特性的⽀持不是为了代码不被坏⼈使⽤,⽽是为了程序开发的简洁性。安全性的话,可⻅性的⽀持提供的是 Safety 的安全,⽽不是 Security 的安全。即,可⻅性的⽀持让程序更不容易写出 bug,⽽不是更不容易被⼈⼊侵。
- 反射的⽀持可以让开发者在可⻅性的例外场景中,可以突破可⻅性限制来调⽤⾃⼰需要的 API。这是基于对开发者「在使⽤反射时已经⾜够了解和谨慎」的假设的。
- 所以,可⻅性的⽀持不是为了防御外来者⼊侵,因此反射功能的⽀持并没有什么不合理。
关于 DEX:
- class:java 编译后的⽂件,每个类对应⼀个 class ⽂件
- dex:Dalvik Executable(虚拟机) 把 class 打包在⼀起,⼀个 dex 可以包含多个 class ⽂件
- odex:apk安装到手机后,Optimized DEX 会针对系统的优化,例如某个⽅法的调⽤指令,会把虚拟的调⽤转换为使⽤具体的 index,这样在执⾏的时候就不⽤再查找了,后缀仍然是.dex
- oat:Optimized Android file Type。apk在安装到手机后,使⽤ AOT 策略对 dex 预先编译(解释)成本地指令,这样再运⾏阶段就不需再经历⼀次解释过程,程序的运⾏可以更快
- AOT:Ahead-Of-Time compilation 预先编译
插件化原理:动态加载
通过⾃定义 ClassLoader 来加载新的 dex ⽂件,从⽽让程序员原本没有的类可以被使⽤,这就是插件化的原理。
例如:把 Utils 拆到单独的项⽬,打包 apk 作为插件引⼊
插件化有什么⽤?
- 早期:解决 dex 65535 问题。⾕歌后来也出了 multidex ⼯具来专⻔解决
- ⼀说:懒加载来减少软件启动速度:有可能,实质上未必会快
- ⼀说:减⼩安装包⼤⼩:可以
- ⼀说:项⽬结构拆分,依赖完全隔离,⽅便多团队开发和测试,解决了组件化耦合度太⾼的问题: 这个使⽤模块化就够了,况且模块化解耦不够的话,插件化也解决不了这个问题
- 动态部署:可以
- Android App Bundles:属于「模块化发布」。未来也许会⽀持动态部署,但肯定会需要结合应⽤商店(即 Play Store,或者未来被更多的商店所⽀持)
- bug 热修复:可以
- 作者:shuouyang
- 链接:https://notion-tree.vercel.app/article/8d34e230-dd6a-4ec6-b088-908ec7b88c71
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。