Atlas 动态组件框架 APK 结构深度解析:bundleinfo 清单、lib 伪装 so 与 Manifest 元数据
移动开发原生移动插件系统【免费下载链接】atlasA powerful Android Dynamic Component Framework.项目地址https://gitcode.com/gh_mirrors/atlas/atlas点击查看免费下载基于 Atlas 构建出的宿主 APKHost APK在外观上与普通 APK 无异但内部结构经过精心改造assets/下新增 bundle 信息清单文件主AndroidManifest.xml中为每个组件注入归属元数据lib/目录里则藏着一批伪装成 so 的 bundle 产物。本文以 Apk_architecture.md 为骨架结合 atlas-gradle-plugin 与 atlas-core 的源码实现逐层拆解这套 APK 结构的生成原理与运行期消费逻辑帮助读者理解组件按需安装、过程对开发者透明的底层机制。一、整体视角Atlas 构建后的 APK 结构基于 Atlas 构建完成的 APK其顶层结构与普通 APK 保持一致依然是AndroidManifest.xml、classes.dex、lib/、res/、assets/、resources.arsc等标准组成部分。差别在于细节Manifest 与 assets 被追加了 Atlas 特有的内容lib/目录中则混入了 bundle 构建产物。上图展示的是典型的 Atlas APK 内部结构AndroidManifest.xml构建后的主 Manifest被注入了 bundle 归属信息详见第三节classes.dex宿主host自身的字节码包含公共中间件、Application 等基础代码lib/按 ABIarmeabi、x86等分目录存放原生库。除了真正的 native so如图中标注的security.so还混入了形如libcom_android_update.so、libcom_android_firstbundle.so的 bundle 产物res/与assets/宿主资源与 assets 文件其中 assets 下新增了bundleinfo-version.json清单resources.arsc资源索引表。从源码结构看ApkFileListUtils.java 等构建工具类专门负责在打包阶段解析、重组这些目录与文件是上述结构在构建期的落点。二、lib 目录里的伪装 sobundle 的安装载体与命名规则文档明确指出构建后armeabi目录中会增加若干个 bundle 构建的产物其命名为String.format(lib%s.so, packageName.replace(., _))即把 bundle 在AndroidManifest.xml中声明的packageName里的.全部替换为_再套上lib前缀与.so后缀。例如包名com.taobao.firstbundle对应libcom_taobao_firstbundle.so包名com.android.update对应libcom_android_update.so。为什么要把 APK 改名为 so这些so文件本身是结构完整的正常 APK内含 bundle 的 dex、资源、Manifest 等之所以放进lib/目录并改名为.so是为了借用系统安装时的解压能力Android 安装器会在安装过程中把lib/下的原生库自动解压到应用私有目录Atlas 借此省去自己从 assets 手动解压 bundle 的步骤bundle 随 APK 安装后被预置到本地后续可直接被加载。这一命名规则在构建插件源码中得到印证AwbBundle.java 中的getAwbSoName()方法public String getAwbSoName() { if (org.apache.commons.lang3.StringUtils.isEmpty(soFileName)) { String packageName getPackageName(); if (packageName null) { return null; } soFileName lib StringUtils.replace(packageName, ., _) .so; } return soFileName; }此外LibVariantContext.java 中同样以awbOutputName .so的形式产出 bundle 的 so 文件说明该命名约定贯穿于 awbAndroid Wireless Bundle见名词解释到整包产物的整个链路。与真 so 的区分这些 bundle so 与真正的 native so如security.so混在同一lib/目录下但它们不是原生库而是借壳的 bundle 包。打包与签名阶段对此有专门处理例如 LocalSignHelper.java 在签名时会识别.so条目进行对齐与校验NativeSoFilter.java 则负责在合并原生库时区分真实 so 与 bundle 伪装 so避免误处理。三、assets/bundleinfo-version.jsonbundle 的全局信息清单构建完成的 APK其 host 的assets/目录下会生成一个bundleinfo-version.json文件文件名中的version取自 host Manifest 中的versionName。这份清单在构建时生成记录了每一个 bundle 的大小size、版本version、名字name、包名pkgName、md5 校验值、是否含 sohasSO、是否内部 bundleisInternal、下载路径packageUrl、依赖dependency以及该 bundle 暴露的全部组件信息activities、services、receivers、contentProviders 等。以上图为例一个典型的 bundle 条目包含以下关键字段字段含义示例值namebundle 名称remotebundlepkgNamebundle 包名Manifest 中声明com.taobao.remotebundleartifactId构件 IDRemoteBundleversionbundle 版本1.32.1.5.open-SNAPSHOTsizebundle 大小字节37369md5bundle 内容校验值84082f7f92492f531a5d539441d89e81hasSO是否包含原生 sofalse/trueisInternal是否为内置打进 APK 的bundletruepackageUrlbundle 对应 so 的下载路径bundle/.../libcom_taobao_remotebundle.sodependency依赖的其他 bundle可空数组activities暴露的 Activity 全限定类名数组com.taobao.remotebundle.RemoteBundleActivityservices/receivers/contentProviders暴露的其他组件可空数组applicationNamebundle 自定义 Applicationcom.taobao.firstbundle.FirstBundleApplication其中applicationName字段在 BasicBundleInfo.java 与 BundleInfo.java 等模型类中均有对应定义如version、size、md5等属性构建期的 PrepareBundleInfoTask.java 与 BundleInfoUtils.java 负责收集、校验并序列化这些信息。这份清单有什么用按需安装的地图清单的价值在于基于这些信息每个 bundle 可以在某个 component 被触发时按需完成安装整个过程对开发者透明。运行期AtlasBundleInfoManager.java 负责加载这份清单通过RuntimeVariables.getFrameworkProperty(bundleInfo)获取并解析把 JSON 解析为内存中的 BundleListing 结构当某个 Activity/Service 等组件被启动时容器根据组件所属 bundle 的信息在触发瞬间完成该 bundle 的加载与安装相关运行时文件结构可参考运行期文件结构中的bundlelisting、baselineinfo与storage目录说明。从中也可以看到 Atlas 的一个设计要点默认情况下bundle 对外暴露的只是基于 Android 原生的 Activity、Service、Receiver 等 componentbundle 内部更细粒度的 API 并不直接对开发者暴露。四、主 AndroidManifest 中的 bundle 元数据注入bundleinfo 的信息不仅存在于 assets 的 JSON 文件中构建后主 Manifest 同样会体现这些信息主要分为两类组件级component 级别meta-data每个 bundle 内暴露的 component在其声明下方会追加一条bundleLocation元数据值为该 component 所属 bundle 的包名应用级application 级别meta-databundle 特有的信息如 bundle 对应的 Application 类、是否开启 multidex 等记录在application节点下的 meta-data 中。上图清晰展示了这两类注入三个 Activity 声明下各有一条红框标注的bundleLocation元数据例如activity android:namecom.taobao.firstbundle.FirstBundleActivity meta-data android:namebundleLocation android:valuecom.taobao.firstbundle / /activity activity android:namecom.taobao.remotebundle.RemoteBundleActivity meta-data android:namebundleLocation android:valuecom.taobao.remotebundle / /activitybundleLocation的值即 component 所属 bundle 的包名。当系统按组件名发起启动时Atlas 容器读取该元数据即可定位到目标 bundle 并触发其安装加载。可以看到同一个 bundle 可以拥有多个 Activity如RemoteBundleActivity与RemoteBundle2Activity同属com.taobao.remotebundle。application级别的 meta-data 则形如meta-data android:namebundle_com.android.update android:valuecom.taobao.update.UpdateApplication,true, / meta-data android:namebundle_com.taobao.firstbundle android:valuecom.taobao.firstbundle.FirstBundleApplication,true, / meta-data android:nameREAL_APPLICATION android:valuecom.taobao.demo.DemoApplication / meta-data android:namemultidex_enable android:valuetrue /其中bundle_包名格式的条目把 bundle 与其 Application 类绑定起来true为附加配置参数REAL_APPLICATION记录整个应用真实的 Applicationmultidex_enable声明开启分包支持。构建插件中的 GenerateAtlasSourceTask.java 等任务负责在构建期把上述元数据写入最终 Manifest。五、从构建到运行这套结构的完整闭环把前三部分串起来Atlas APK 结构设计的完整闭环如下构建期Gradle 插件把每个 awb 打包为 bundle命名成lib包名下划线化.so放入lib/abi/目录同时生成assets/bundleinfo-version.json含各 bundle 的大小、版本、组件清单并向主 Manifest 注入bundleLocation与bundle_包名等 meta-data安装期系统安装 APK 时自动把lib/下的 bundle so 解压到应用私有目录bundle 完成预置运行期Atlas 容器解析bundleinfo清单AtlasBundleInfoManager.java当某个组件被触发时依据 Manifest 中的bundleLocation定位 bundle、按需完成加载安装更新期后续通过动态部署installorUpdate 与 atlas-update产生的新版本 bundle 会替换或新增 storage 目录下的版本文件详见运行期文件结构。整体上宿主与普通 APK 无异所有 bundle 相关的额外内容都收敛在 Manifest 元数据、assets 清单与 lib 伪装 so 三处这正是 Atlas 实现组件化按需加载、同时保持对开发者透明的结构基础。赞分享移动开发原生移动插件系统【免费下载链接】atlasA powerful Android Dynamic Component Framework.项目地址https://gitcode.com/gh_mirrors/atlas/atlas点击查看免费下载相关推荐DeepSeek-R1-0528-MXFP4-MTP-MoEFP4震撼发布AMD MI350平台上的终极AI性能革命DeepSeek R1 0528 MXFP4 MTP MoEFP4震撼发布AMD MI350平台上的终极AI性能革命 DeepSeek R1 0528 MXF人工智能大模型推理模型模型量化模型优化本地部署DeepSeek如何配置triangular-arbitrage机器人从API密钥到CouchDB数据库的完整教程如何配置triangular arbitrage机器人从API密钥到CouchDB数据库的完整教程 triangular arbitrage是一款功能强大的数PearAI vs 传统编辑器AI如何彻底改变编程方式PearAI vs 传统编辑器AI如何彻底改变编程方式 PearAI作为一款基于VSCode的开源AI代码编辑器通过深度整合人工智能技术正在重新定义程序员上一篇jeffding/gpt2-large-openmind最佳实践5个提升文本生成质量的技巧下一篇突破AI图像描述瓶颈上海AI实验室CapRL框架实现小模型性能跃升创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考