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 热修复:可以
注解 Annotation Processing热更新|热修复
Loading...
shuouyang
shuouyang
android开发 ReactNative开发 小程序开发
最新发布
AOSP 环境搭建
2025-3-29
View 绘制流程-源码解析
2025-3-12
HTTP
2025-3-4
JVM 虚拟机
2025-2-28
蓝牙-BLE-基础
2025-2-28
从 OkHttp 的原理来看 HTTP
2025-2-19
公告
🎉热点信息🎉
--- 1 ---
Jet Brains 推出新的跨平台支持 Kotlin MultiPlatform
--- 2 ---
新的小巧便捷的依赖注入框架 Koin
--- 3 ---
新一代 API 查询语言 GraphQL