当前位置: 首页 > news >正文

aar, aab,apk三种应用格式的区别

一、APK (Android Package)

  • 本质可安装的应用包
  • 用途:直接安装在 Android 设备上的应用格式
  • 特点
    • 包含完整的应用代码(.dex)、资源(图片/布局)、清单文件和签名
    • 支持所有 Android 版本(从 Android 1.0 至今)
    • 可通过任何渠道分发(应用商店、网站、邮件等)
  • 生成位置app/build/outputs/apk/
  • 文件结构
    APK
    ├── AndroidManifest.xml
    ├── classes.dex         # 编译后的代码
    ├── res/                # 资源文件
    ├── lib/                # 原生库(armeabi-v7a, arm64-v8a等)
    └── META-INF/           # 签名信息
    

二、AAB (Android App Bundle)

  • 本质Google Play 专用发布格式(不可直接安装)
  • 用途:上传到 Google Play 的应用分发格式
  • 特点
    • 动态交付:Google Play 按用户设备生成优化版 APK(仅包含所需资源)
    • 体积更小:比通用 APK 平均小 15%(省去未使用的语言/分辨率资源)
    • 强制要求:2021年8月起,新应用必须使用 AAB 上架 Google Play
    • 包含所有资源:支持多语言、多分辨率、动态功能模块
  • 生成位置app/build/outputs/bundle/
  • 工作流程


三、AAR (Android Archive)

  • 本质代码/资源库(非应用)
  • 用途:封装可复用的 Android 库(如 SDK、自定义控件)
  • 特点
    • 包含代码(.jar)、资源、清单文件和 C/C++ 库
    • 可被其他 Android 项目依赖(类似 Java 的 .jar
    • 不可直接安装
  • 生成位置library-module/build/outputs/aar/
  • 文件结构
    AAR
    ├── AndroidManifest.xml
    ├── classes.jar        # 库代码
    ├── res/               # 资源文件
    ├── jni/               # 原生库(.so文件)
    └── R.txt              # 资源ID映射
    

四、核心对比表

特性APKAABAAR
安装性✅ 可直接安装❌ 需 Google Play 转换❌ 不可安装
用途应用分发与安装Google Play 发布代码/资源复用
体积优化❌ 包含所有资源✅ 按设备动态生成❌ 包含全部库资源
分发渠道所有应用商店/网站仅限 Google Play项目依赖/Maven仓库
包含内容完整应用应用所有变体资源库代码+资源
生成命令./gradlew assembleRelease./gradlew bundleRelease./gradlew :lib:assemble
文件大小较大(通用包)较小(基础包+按需资源)中等(库内容决定)

五、使用场景指南

  1. 开发调试 → 生成 APK(快速安装测试)
  2. 上架 Google Play → 构建 AAB(满足政策要求)
  3. 开发公共组件 → 发布 AAR(如 glide.aarretrofit.aar
  4. 企业内部分发 → 签名 APK(绕过商店限制)
  5. 模块化开发 → 子模块打包为 AAR(功能解耦)

关键提示

  • 从 Android Studio 3.2 开始,AAB 成为默认发布格式
  • 使用 AAB 可启用 Play Feature Delivery(动态功能模块)
  • 本地测试 AAB 需通过 bundletool 转换:
    bundletool build-apks --bundle=app.aab --output=app.apks
    bundletool install-apks --apks=app.apks
    

理解这三者的区别,能显著提升 Android 开发效率与应用发布质量。

http://www.dtcms.com/a/305291.html

相关文章:

  • Linux网络编程——IP地址与端口、通信协议、Socket套接字基础概念解析
  • 【C语言】指针深度剖析(一)
  • Router 动态路由
  • FPGA数码管驱动模块
  • Netty中FastThreadLocal解读
  • C++多态:面向对象编程的灵魂之
  • Linux_库制作与原理浅理解
  • 青木川古镇
  • Flex布局面试常考的场景题目
  • 墨者:SQL过滤字符后手工注入漏洞测试(第3题)
  • MC0244多重堡垒
  • kotlin使用mybatis plus lambdaQuery报错
  • Java中什么是类加载?类加载的过程?
  • TGD第八篇:二维应用——图像边缘检测
  • FastAPI入门:Cookie参数、Header参数、Cookie参数模型、Header参数模型
  • 移动端 WebView 调试实战,多平台行为差异排查与统一调试流程
  • Gartner发布CTEM指南:使用持续威胁暴露管理来减少网络攻击
  • 应急前端“黄金3分钟”设计:极端场景下的操作界面极速搭建技术
  • COPRAS(Complex Proportional Assessment)简介与简单示例
  • 汇总10个高质量免费AI生成论文网站,支持GPT4.0和DeepSeek-R1
  • [学习记录]URP流程解析(2)--初始化阶段
  • 最新优茗导航系统源码/全开源版本/精美UI/带后台/附教程
  • Effective_C++09: 绝不在构造和析构过程中调用virtual函数
  • 【解决办法】pip install albumentations安装下载遇19kB/s超级慢细水管
  • 无代码测试平台ATECLOUD全场景测试方案
  • Java中Boolean.getBoolean方法误用与修复
  • 【监控】非IP监控系统改造IP监控系统
  • 中科米堆CASAIM空调扇叶自动蓝光三维测量解决方案
  • <RT1176系列12>DMAMUX入门级应用和DMAMUX MAP表
  • Linux定时器和时间管理源码相关总结