首页 / Android 入门教程 / 应用基本概念

Android 入门教程

应用基本概念

本教程共 100 篇 · 第 19 篇 · 更新于 2026-07-28 · 约 7 分钟阅读

AndroidAndroid 入门教程应用基础APK应用沙箱四大组件进程

19. 应用基本概念

本节目标:理解 Android 应用打包后的结构、应用沙箱怎么隔离、进程和虚拟机怎么回事、四大组件是什么,建立对「应用」的整体认知。

APK 是什么

Android 应用编译后打包成 APK(Android Package,.apk 文件)。APK 是个 ZIP 压缩包,里面装着运行应用所需的一切。

APK 内部结构大致:

app.apk
├── AndroidManifest.xml      (编译后的二进制清单)
├── classes.dex              (编译后的字节码,可能有多个)
├── res/                     (编译后的资源)
├── assets/                  (原始资源,原样打包)
├── lib/                     (native 库,按 ABI 分目录)
│   ├── arm64-v8a/
│   ├── armeabi-v7a/
│   └── x86_64/
├── META-INF/                (签名信息)
└── resources.arsc           (编译后的资源表)

要点:

  • classes.dex:Kotlin/Java 代码编译成 Dalvik 字节码(dex 格式),在 ART 上跑。方法数太多会拆成多个 dex( multidex)。
  • res/:图片、布局、字符串这些资源编译后放这。
  • lib/:NDK 编译的 .so 文件,按 CPU 架构分目录。
  • assets/:你想原样保留的文件(JSON、字体、HTML),不参与资源编译。

AAB 是什么

AAB(Android App Bundle,.aab)是发布格式,不能直接装到设备上。上传 Google Play 时用 AAB,Google Play 根据用户设备生成只含所需资源和代码的小 APK(Dynamic Delivery)。

Note
  • 日常调试用 APK,上架 Google Play 用 AAB。国内应用商店大多仍要 APK,按平台要求来。

应用沙箱

Android 基于 Linux,每个应用是一个独立的 Linux 用户(UID 不同)。这形成了沙箱

  • 文件隔离:应用只能访问自己的文件目录,别人读不到。
  • 进程隔离:每个应用跑在独立进程,内存空间隔离。
  • 虚拟机隔离:每个应用有自己的 ART 实例,代码互不干扰。
  • 权限控制:默认最小权限,访问相机、位置等要用户授权。
应用 A (UID 10001)        应用 B (UID 10002)
   ↓                          ↓
独立进程                    独立进程
独立文件目录                独立文件目录
独立 ART                    独立 ART

应用之间想共享数据,得通过系统提供的机制:

  • ContentProvider:结构化数据共享(联系人、媒体库)。
  • Intent:调用别的应用的功能(拍照、分享)。
  • 广播:一对多消息通知。
  • 共享 UID:两个应用用相同证书签名并声明同一 sharedUserId,能访问彼此文件(已不推荐,新版本受限)。

进程与生命周期

默认每个应用一个进程,进程名就是包名。组件(Activity、Service)都在这个进程里跑。

进程不是常驻的。Android 在内存紧张时会按优先级杀进程回收内存:

  1. 前台进程:用户正在交互,优先级最高,最后被杀。
  2. 可见进程:可见但不在前台(如被对话框遮住)。
  3. 服务进程:跑着 startForeground 之外的服务。
  4. 缓存进程:后台的 Activity,优先级最低,最先被杀。
Warning
  • 进程被杀不代表应用退出。用户回到应用时系统会重建 Activity(如果还在任务栈里)。你的状态保存逻辑要适应这一点(第 26 章细讲)。

多进程

想让某个组件跑在独立进程,在 Manifest 里声明 android:process

<service
    android:name=".RemoteService"
    android:process=":remote" />

:remote 表示私有进程(前面加冒号),其他应用进不来。不加冒号是全局进程(少用)。多进程用于隔离崩溃、占用内存优化,但跨进程通信(IPC)要用 AIDL 或 Messenger,复杂度上升。

四大组件

Android 应用的基本构建块是四大组件,每个组件是应用的一个入口点。

1. Activity(活动)

用户界面的载体,一个屏幕通常对应一个 Activity。用户能看到的、能点的,都在 Activity 里。

  • 负责管理 UI、接收用户输入。
  • 有完整的生命周期(创建、可见、前台、暂停、停止、销毁)。
  • 第 24-28 章专门讲。

2. Service(服务)

后台执行长时间任务的组件,没有界面。

  • 播放音乐、下载文件、后台同步。
  • 分启动式和绑定式两种。
  • 注意:Service 默认跑在主线程,耗时操作还是要开线程。
  • 第 32-34 章讲。

3. BroadcastReceiver(广播接收器)

接收系统或应用发出的广播消息。

  • 系统广播:开机、网络变化、电量低、屏幕亮起。
  • 自定义广播:应用间发消息。
  • 第 35-36 章讲。

4. ContentProvider(内容提供者)

跨应用共享结构化数据。

  • 系统的:联系人、媒体库、日历。
  • 自己的:给别的应用提供数据。
  • 通过 ContentResolver 查询。
  • 第 37-38 章讲。

组件的特点

四大组件有几个共同点:

  1. 都要在 Manifest 声明:没声明的组件系统不认。
  2. 由系统实例化:你不能 new Activity(),要靠 Intent 启动,系统创建。
  3. 有生命周期:系统按一定规则创建、暂停、销毁组件。
  4. 是入口点:别的应用能通过 Intent 启动你的 Activity、Service、Receiver。
Tip
  • 理解「组件由系统管理」是关键。你不能控制组件何时创建销毁,只能响应生命周期回调。这跟普通对象不同,是 Android 开发要适应的思维。

Context:组件的「身份证」

Context 是 Android 里到处都是的概念,可以理解为「应用环境的入口」。它能:

  • 访问资源(getStringgetColor)。
  • 启动组件(startActivitystartService)。
  • 获取系统服务(getSystemService)。
  • 访问文件(getFilesDirgetSharedPreferences)。

ActivityServiceApplication 都是 Context 的子类。日常里 this(在 Activity 里)、context 参数、applicationContext 都是 Context。

// Activity 里
val inflater = LayoutInflater.from(this)
startActivity(Intent(this, SecondActivity::class.java))

// 非组件里要传 Context
class UserRepository(private val context: Context) {
    fun loadConfig() {
        context.assets.open("config.json").use { /* ... */ }
    }
}
Warning
  • 别把 Activity 的 Context 长期持有(如放静态变量),会导致 Activity 无法回收,内存泄漏。需要长期持有的用 applicationContext

Intent:组件的沟通桥梁

四大组件之间通信靠 Intent(意图)。Intent 描述「我想干一件事」:

  • 启动某个 Activity。
  • 启动某个 Service。
  • 发送广播。

Intent 分显式(指定类名)和隐式(指定 action 让系统找)。第 29-31 章细讲。

小结

Android 应用打包成 APK,包含 dex、资源、native 库、清单。应用跑在沙箱里,文件、进程、虚拟机隔离,共享数据要靠系统机制。四大组件(Activity、Service、BroadcastReceiver、ContentProvider)是应用入口,由系统管理生命周期。Context 是访问应用环境的入口,Intent 是组件通信桥梁。下一节看项目的文件结构。