应用基本概念
本教程共 100 篇 · 第 19 篇 · 更新于 2026-07-28 · 约 7 分钟阅读
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 在内存紧张时会按优先级杀进程回收内存:
- 前台进程:用户正在交互,优先级最高,最后被杀。
- 可见进程:可见但不在前台(如被对话框遮住)。
- 服务进程:跑着
startForeground之外的服务。 - 缓存进程:后台的 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 章讲。
组件的特点
四大组件有几个共同点:
- 都要在 Manifest 声明:没声明的组件系统不认。
- 由系统实例化:你不能
new Activity(),要靠 Intent 启动,系统创建。 - 有生命周期:系统按一定规则创建、暂停、销毁组件。
- 是入口点:别的应用能通过 Intent 启动你的 Activity、Service、Receiver。
Tip
- 理解「组件由系统管理」是关键。你不能控制组件何时创建销毁,只能响应生命周期回调。这跟普通对象不同,是 Android 开发要适应的思维。
Context:组件的「身份证」
Context 是 Android 里到处都是的概念,可以理解为「应用环境的入口」。它能:
- 访问资源(
getString、getColor)。 - 启动组件(
startActivity、startService)。 - 获取系统服务(
getSystemService)。 - 访问文件(
getFilesDir、getSharedPreferences)。
Activity、Service、Application 都是 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 是组件通信桥梁。下一节看项目的文件结构。