# 第1课：安卓系统架构概述

## 课程目标
- 理解安卓系统的整体架构和各层次的作用
- 掌握APK文件的结构组成
- 学会分析AndroidManifest.xml配置文件
- 为后续逆向分析打下坚实基础

---

## 1. 安卓系统层次结构

安卓系统采用分层架构设计，从底层到上层共分为五个主要层次：

### 1.1 架构总览

```mermaid
graph TB
    subgraph 应用层
        A1[系统应用<br/>电话 短信 设置]
        A2[第三方应用<br/>微信 抖音 游戏]
    end
    
    subgraph 应用框架层
        B1[Activity Manager]
        B2[Window Manager]
        B3[Content Provider]
        B4[Package Manager]
        B5[Notification Manager]
    end
    
    subgraph 运行时层
        C1[ART/Dalvik VM]
        C2[Core Libraries<br/>java.lang java.util]
    end
    
    subgraph 硬件抽象层HAL
        D1[Camera HAL]
        D2[Audio HAL]
        D3[Sensor HAL]
        D4[GPS HAL]
    end
    
    subgraph Linux内核层
        E1[Binder驱动]
        E2[Display驱动]
        E3[Camera驱动]
        E4[进程管理]
        E5[内存管理]
    end
    
    A1 --> B1
    A2 --> B2
    B1 --> C1
    B3 --> C1
    B4 --> C2
    C1 --> D1
    C2 --> D2
    D1 --> E1
    D2 --> E2
    D3 --> E3
    
    style 应用层 fill:#e1f5ff
    style 应用框架层 fill:#b3e5fc
    style 运行时层 fill:#81d4fa
    style 硬件抽象层HAL fill:#4fc3f7
    style Linux内核层 fill:#29b6f6
```
*图1-1：安卓系统五层架构示意图*

> **架构说明**：上图展示了安卓系统的完整分层架构，从最底层的Linux内核到最上层的应用程序，每一层都有明确的职责分工，层与层之间通过标准接口进行通信。

---

## 2. Linux内核层 (Linux Kernel)

### 2.1 核心功能
安卓系统基于Linux内核构建，提供底层系统服务：

- **进程管理**：负责进程的创建、调度和销毁
- **内存管理**：虚拟内存、物理内存分配与回收
- **文件系统**：支持ext4、F2FS等文件系统
- **网络协议栈**：TCP/IP协议实现
- **驱动程序**：
  - Display驱动（显示）
  - Camera驱动（摄像头）
  - Bluetooth驱动（蓝牙）
  - WiFi驱动
  - Binder驱动（进程间通信）
  - Audio驱动（音频）

### 2.2 安卓特有的内核特性

- **Binder IPC机制**：安卓进程间通信的核心
- **Ashmem**：匿名共享内存
- **Low Memory Killer**：低内存管理机制
- **Wakelocks**：电源管理锁
- **Logger**：内核日志系统

### 2.3 逆向关注点
- 内核版本信息可能影响漏洞利用
- SELinux策略影响权限提升
- 驱动层Hook可实现深层监控

```mermaid
graph LR
    subgraph Android运行时
        A[应用进程]
    end
    
    subgraph Linux内核
        B[Binder驱动]
        C[进程调度器]
        D[内存管理]
        E[文件系统]
        F[网络协议栈]
        G[设备驱动]
    end
    
    subgraph 硬件层
        H[CPU]
        I[内存]
        J[存储设备]
        K[网络设备]
    end
    
    A -->|系统调用| B
    A -->|系统调用| C
    A -->|系统调用| D
    B --> C
    C --> H
    D --> I
    E --> J
    F --> K
    G --> H
    
    style A fill:#ffeb3b
    style Linux内核 fill:#4caf50
    style 硬件层 fill:#9e9e9e
```
*图2-1：Linux内核在安卓系统中的位置和作用*

---

## 3. 硬件抽象层 (HAL - Hardware Abstraction Layer)

### 3.1 HAL的作用
HAL层位于Linux内核和Android运行时之间，提供统一的硬件访问接口：

- 屏蔽底层硬件差异
- 为上层提供标准化API
- 保护厂商硬件驱动知识产权

### 3.2 常见HAL模块

| HAL模块 | 功能描述 |
|---------|----------|
| camera.hal | 摄像头控制接口 |
| audio.hal | 音频输入输出 |
| sensors.hal | 传感器数据获取 |
| gps.hal | GPS定位服务 |
| lights.hal | LED灯光控制 |
| gralloc.hal | 图形内存分配 |

### 3.3 HAL接口形式
- **传统HAL**：.so共享库形式
- **HIDL**：Hardware Interface Definition Language（Android 8.0+）
- **AIDL**：Android Interface Definition Language（Android 11+）

```mermaid
graph TB
    subgraph 应用层
        A[Camera应用]
    end
    
    subgraph Framework层
        B[CameraService]
    end
    
    subgraph HAL层
        C[Camera HAL接口]
        D[camera.hal.so]
    end
    
    subgraph 内核层
        E[Camera驱动]
    end
    
    subgraph 硬件层
        F[摄像头硬件]
    end
    
    A -->|调用API| B
    B -->|标准接口| C
    C -->|加载| D
    D -->|系统调用| E
    E -->|控制| F
    
    style A fill:#e1f5ff
    style B fill:#b3e5fc
    style C fill:#81d4fa
    style D fill:#4fc3f7
    style E fill:#29b6f6
    style F fill:#0288d1
```
*图3-1：HAL层在系统中的位置（以Camera为例）*

---

## 4. 运行时层 (Android Runtime)

### 4.1 虚拟机演进

```mermaid
graph TB
    subgraph Dalvik虚拟机流程
        A1[Java/Kotlin源码] --> A2[.class字节码]
        A2 --> A3[.dex字节码]
        A3 --> A4[安装到设备]
        A4 --> A5[运行时JIT编译]
        A5 --> A6[机器码执行]
    end
    
    subgraph ART虚拟机流程
        B1[Java/Kotlin源码] --> B2[.class字节码]
        B2 --> B3[.dex字节码]
        B3 --> B4[安装到设备]
        B4 --> B5[AOT预编译]
        B5 --> B6[生成OAT文件]
        B6 --> B7[直接执行机器码]
    end
    
    style A5 fill:#ff9800
    style B5 fill:#4caf50
    style A6 fill:#ffeb3b
    style B7 fill:#8bc34a
```

**对比表格：**

| 特性 | Dalvik | ART |
|------|--------|-----|
| 编译方式 | JIT即时编译 | AOT预编译 |
| 编译时机 | 运行时 | 安装时 |
| 安装速度 | 快 | 慢 |
| 运行速度 | 较慢 | 快 |
| 存储占用 | 小 | 大 |
| 电池消耗 | 高 | 低 |
| Android版本 | 4.4及以前 | 5.0及以后 |

*图4-1：Dalvik虚拟机与ART虚拟机的对比*

#### Dalvik虚拟机（Android 4.4及以前）
- 基于寄存器架构
- JIT（Just-In-Time）即时编译
- 执行.dex字节码
- 每个应用独立虚拟机实例

#### ART虚拟机（Android 5.0+）
- AOT（Ahead-Of-Time）预编译
- 安装时将DEX编译为本地机器码
- 更快的执行速度
- 更大的存储空间占用
- 支持64位架构

### 4.2 核心库 (Core Libraries)

安卓运行时提供Java核心类库的子集：
- java.lang.*
- java.util.*
- java.io.*
- java.net.*
- javax.crypto.*（加密库）
- org.apache.http.*（网络请求）

### 4.3 逆向关键点
- **DEX文件**：Java代码编译后的字节码
- **OAT文件**：ART编译后的本地代码
- **ODEX文件**：优化后的DEX文件
- **内存Dump**：运行时内存中的DEX提取

```mermaid
graph LR
    A[DEX文件格式] --> B[Header]
    A --> C[String IDs]
    A --> D[Type IDs]
    A --> E[Proto IDs]
    A --> F[Field IDs]
    A --> G[Method IDs]
    A --> H[Class Defs]
    A --> I[Data Section]
    
    B --> B1[Magic Number<br/>dex\n035]
    B --> B2[Checksum]
    B --> B3[File Size]
    
    H --> H1[类定义]
    H --> H2[访问标志]
    H --> H3[方法列表]
    H --> H4[字段列表]
    
    I --> I1[类数据]
    I --> I2[代码数据]
    I --> I3[字符串数据]
    
    style A fill:#ff9800
    style B fill:#4caf50
    style H fill:#2196f3
    style I fill:#f44336
```
*图4-2：DEX文件内部结构*

---

## 5. 应用框架层 (Application Framework)

### 5.1 核心服务

应用框架层为开发者提供丰富的API接口：

```mermaid
graph TB
    subgraph 应用框架层核心服务
        A[Activity Manager<br/>Service]
        B[Package Manager<br/>Service]
        C[Window Manager<br/>Service]
        D[Content Provider<br/>Manager]
        E[Notification<br/>Manager]
        F[Location<br/>Manager]
        G[Telephony<br/>Manager]
        H[Connectivity<br/>Manager]
    end
    
    subgraph 应用层
        I[App 1]
        J[App 2]
        K[App 3]
    end
    
    I --> A
    I --> B
    J --> C
    J --> D
    K --> E
    K --> F
    
    A -.->|Binder IPC| B
    B -.->|Binder IPC| C
    C -.->|Binder IPC| D
    
    style A fill:#ff9800
    style B fill:#4caf50
    style C fill:#2196f3
    style D fill:#9c27b0
    style E fill:#f44336
```
*图5-1：应用框架层核心服务架构*

#### Activity Manager Service (AMS)
- 管理Activity生命周期
- 任务栈管理
- 进程管理

#### Package Manager Service (PMS)
- APK安装、卸载、更新
- 应用信息查询
- 权限管理

#### Window Manager Service (WMS)
- 窗口管理
- 屏幕旋转
- 动画效果

#### Content Provider
- 数据共享机制
- 跨应用数据访问

#### Notification Manager
- 通知栏管理
- 消息推送

### 5.2 常用框架API

```java
// Activity管理
android.app.Activity
android.app.ActivityManager

// 资源访问
android.content.res.Resources
android.content.Context

// 视图系统
android.view.View
android.widget.*

// 网络通信
android.net.http.*
java.net.*
```

### 5.3 逆向价值
- 理解API调用流程
- Hook框架层方法
- 分析系统服务交互

```mermaid
sequenceDiagram
    participant App as 应用进程
    participant AMS as ActivityManager
    participant PMS as PackageManager
    participant Binder as Binder驱动
    
    App->>AMS: startActivity()
    AMS->>PMS: 查询Activity信息
    PMS-->>AMS: 返回Activity信息
    AMS->>Binder: 跨进程通信
    Binder->>App: 创建Activity实例
    App->>App: onCreate()
    App->>App: onStart()
    App->>App: onResume()
    App-->>AMS: Activity已启动
    
    Note over App,AMS: Binder IPC机制<br/>实现进程间通信
```
*图5-2：Activity启动流程（Framework层交互）*

---

## 6. 应用层 (Applications)

### 6.1 应用类型

#### 系统应用
- 预装在/system/app目录
- 具有系统权限
- 例如：电话、短信、设置

#### 用户应用
- 安装在/data/app目录
- 受权限限制
- 可被卸载

### 6.2 应用组件
- Activity（界面）
- Service（后台服务）
- BroadcastReceiver（广播接收器）
- ContentProvider（内容提供者）

```mermaid
graph TB
    subgraph 安卓四大组件
        A[Activity<br/>用户界面]
        B[Service<br/>后台服务]
        C[BroadcastReceiver<br/>广播接收器]
        D[ContentProvider<br/>内容提供者]
    end
    
    subgraph 生命周期
        A1[onCreate]
        A2[onStart]
        A3[onResume]
        A4[onPause]
        A5[onStop]
        A6[onDestroy]
    end
    
    subgraph 通信机制
        E[Intent]
        F[Bundle]
        G[URI]
    end
    
    A --> A1
    A1 --> A2
    A2 --> A3
    A3 --> A4
    A4 --> A5
    A5 --> A6
    
    A -.->|启动| E
    B -.->|启动| E
    C -.->|接收| E
    D -.->|查询| G
    
    style A fill:#4caf50
    style B fill:#2196f3
    style C fill:#ff9800
    style D fill:#9c27b0
```
*图6-1：安卓四大组件及其生命周期*

---

## 7. APK文件结构与组成

### 7.1 APK文件本质
APK（Android Package）本质上是一个ZIP压缩包，包含应用运行所需的所有文件。

### 7.2 APK标准目录结构

```mermaid
graph TD
    A[MyApp.apk] --> B[AndroidManifest.xml]
    A --> C[classes.dex]
    A --> D[classes2.dex]
    A --> E[resources.arsc]
    A --> F[res/]
    A --> G[assets/]
    A --> H[lib/]
    A --> I[META-INF/]
    
    F --> F1[drawable/]
    F --> F2[layout/]
    F --> F3[values/]
    F --> F4[mipmap/]
    
    G --> G1[data/]
    G --> G2[fonts/]
    
    H --> H1[armeabi-v7a/]
    H --> H2[arm64-v8a/]
    H --> H3[x86/]
    H --> H4[x86_64/]
    
    H1 --> H1A[libnative.so]
    H2 --> H2A[libnative.so]
    
    I --> I1[MANIFEST.MF]
    I --> I2[CERT.SF]
    I --> I3[CERT.RSA]
    
    style B fill:#ff9800
    style C fill:#4caf50
    style E fill:#2196f3
    style I fill:#f44336
```
*图7-1：APK文件的完整目录结构*

```
MyApp.apk
├── AndroidManifest.xml          # 应用配置清单（二进制XML）
├── classes.dex                  # Dalvik字节码文件
├── classes2.dex                 # 多DEX情况下的额外DEX文件
├── resources.arsc               # 编译后的资源索引表
├── res/                         # 资源目录
│   ├── drawable/                # 图片资源
│   ├── layout/                  # 布局文件（二进制XML）
│   ├── values/                  # 字符串、颜色等资源
│   └── ...
├── assets/                      # 原始资源文件
│   └── data/
├── lib/                         # Native库文件
│   ├── armeabi-v7a/            # 32位ARM架构
│   │   └── libnative.so
│   ├── arm64-v8a/              # 64位ARM架构
│   │   └── libnative.so
│   ├── x86/                    # 32位x86架构
│   └── x86_64/                 # 64位x86架构
├── META-INF/                    # 签名信息目录
│   ├── MANIFEST.MF             # 文件摘要清单
│   ├── CERT.SF                 # 签名文件
│   └── CERT.RSA                # 证书和签名
└── kotlin/                      # Kotlin元数据（如果使用Kotlin）
```

### 7.3 关键文件详解

#### classes.dex
- Java/Kotlin代码编译后的字节码
- 可被反编译为Smali代码或Java代码
- 多DEX应用会有classes2.dex、classes3.dex等

#### resources.arsc
- 资源ID与资源文件的映射表
- 包含字符串资源池
- 支持多语言、多分辨率适配

#### lib/目录
- 存放Native库（.so文件）
- 按CPU架构分目录存放
- 包含C/C++编写的本地代码

#### META-INF/目录
- **MANIFEST.MF**：记录所有文件的SHA-1摘要
- **CERT.SF**：对MANIFEST.MF的签名
- **CERT.RSA**：开发者证书和RSA签名

```mermaid
flowchart TB
    A[APK签名流程] --> B[计算文件摘要]
    B --> C[生成MANIFEST.MF]
    C --> D[对MANIFEST.MF签名]
    D --> E[生成CERT.SF]
    E --> F[使用私钥加密]
    F --> G[生成CERT.RSA]
    G --> H[打包到META-INF/]
    
    I[APK验证流程] --> J[读取CERT.RSA]
    J --> K[提取公钥]
    K --> L[验证CERT.SF]
    L --> M[验证MANIFEST.MF]
    M --> N[验证各文件摘要]
    N --> O{签名有效?}
    O -->|是| P[安装成功]
    O -->|否| Q[安装失败]
    
    style A fill:#4caf50
    style I fill:#2196f3
    style P fill:#8bc34a
    style Q fill:#f44336
```
*图7-3：APK签名与验证流程*

### 7.4 APK解包方法

#### 方法1：直接解压
```bash
unzip MyApp.apk -d MyApp/
```

#### 方法2：使用APKTool
```bash
apktool d MyApp.apk -o MyApp/
```
优势：
- 自动解析二进制XML为可读格式
- 反编译DEX为Smali代码
- 保留资源ID映射关系

```mermaid
sequenceDiagram
    participant U as 用户
    participant A as APKTool
    participant F as APK文件
    participant O as 输出目录
    
    U->>A: apktool d app.apk -o output
    A->>F: 读取APK文件
    F-->>A: 返回文件内容
    A->>A: 解析AndroidManifest.xml
    A->>A: 反编译DEX为Smali
    A->>A: 解码资源文件
    A->>O: 写入解包文件
    O-->>U: 反编译完成
    
    Note over A,O: 生成可编辑的Smali代码<br/>和可读的XML文件
```
*图7-2：使用APKTool反编译APK的流程*

---

## 8. AndroidManifest.xml文件解析

### 8.1 Manifest文件作用
AndroidManifest.xml是APK的核心配置文件，定义应用的基本信息和权限需求。

### 8.2 基本结构

```mermaid
graph TD
    A[manifest] --> B[uses-sdk]
    A --> C[uses-permission]
    A --> D[application]
    
    B --> B1[minSdkVersion]
    B --> B2[targetSdkVersion]
    
    C --> C1[INTERNET]
    C --> C2[CAMERA]
    C --> C3[READ_STORAGE]
    
    D --> D1[Activity]
    D --> D2[Service]
    D --> D3[Receiver]
    D --> D4[Provider]
    
    D1 --> D1A[intent-filter]
    D1A --> D1A1[action.MAIN]
    D1A --> D1A2[category.LAUNCHER]
    
    D2 --> D2A[exported]
    D3 --> D3A[intent-filter]
    D4 --> D4A[authorities]
    
    style A fill:#ff9800
    style D fill:#4caf50
    style D1 fill:#2196f3
    style D1A fill:#f44336
```
*图8-1：AndroidManifest.xml文件的层次结构*

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    android:versionCode="1"
    android:versionName="1.0">

    <!-- 最低SDK版本要求 -->
    <uses-sdk
        android:minSdkVersion="21"
        android:targetSdkVersion="33" />

    <!-- 权限声明 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <!-- 应用信息 -->
    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:debuggable="false"
        android:usesCleartextTraffic="true">

        <!-- Activity声明 -->
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- Service声明 -->
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="false" />

        <!-- BroadcastReceiver声明 -->
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <!-- ContentProvider声明 -->
        <provider
            android:name=".MyProvider"
            android:authorities="com.example.myapp.provider"
            android:exported="false" />

    </application>

</manifest>
```

### 8.3 关键属性解析

#### package属性
```xml
package="com.example.myapp"
```
- 应用的唯一标识符
- 用于应用签名和权限管理
- 逆向时的重要识别信息

#### versionCode & versionName
```xml
android:versionCode="1"
android:versionName="1.0"
```
- **versionCode**：内部版本号（整数）
- **versionName**：用户可见版本号（字符串）

#### 权限声明
```xml
<uses-permission android:name="android.permission.INTERNET" />
```

常见权限：
- `INTERNET`：网络访问
- `CAMERA`：摄像头
- `READ_EXTERNAL_STORAGE`：读取外部存储
- `WRITE_EXTERNAL_STORAGE`：写入外部存储
- `ACCESS_FINE_LOCATION`：精确定位
- `READ_PHONE_STATE`：读取手机状态
- `SEND_SMS`：发送短信

#### debuggable属性
```xml
android:debuggable="true"
```
- `true`：允许调试（开发版本）
- `false`：禁止调试（发布版本）
- 逆向时可修改此属性以便调试

#### exported属性
```xml
android:exported="true"
```
- `true`：组件可被外部应用访问
- `false`：仅应用内部访问
- 安全漏洞的常见来源

### 8.4 逆向分析要点

```mermaid
flowchart LR
    A[APK文件] --> B{解析工具}
    B -->|APKTool| C[反编译Manifest]
    B -->|AAPT| D[提取基本信息]
    B -->|Androguard| E[安全分析]
    
    C --> F[查看组件]
    C --> G[查看权限]
    C --> H[查看配置]
    
    D --> I[包名]
    D --> J[版本号]
    D --> K[权限列表]
    
    E --> L[导出组件检测]
    E --> M[危险权限检测]
    E --> N[安全漏洞扫描]
    
    F --> O[逆向分析]
    G --> O
    L --> O
    M --> O
    
    style A fill:#ffeb3b
    style B fill:#4caf50
    style O fill:#f44336
```
*图8-2：Manifest分析工具和流程*

#### 1. 查找入口点
```xml
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.category.LAUNCHER" />
</intent-filter>
```
标识应用的启动Activity

#### 2. 识别敏感权限
分析应用申请的权限，判断其功能和潜在风险

#### 3. 检查exported组件
```bash
# 使用ADB查询exported组件
adb shell dumpsys package com.example.myapp
```

#### 4. 分析自定义权限
```xml
<permission
    android:name="com.example.myapp.permission.CUSTOM"
    android:protectionLevel="signature" />
```

#### 5. 查看Application类
```xml
android:name=".MyApplication"
```
Application类通常包含初始化代码，可能有反调试、加固逻辑

```mermaid
graph TB
    A[应用启动] --> B[加载Application类]
    B --> C{是否自定义Application?}
    C -->|是| D[执行自定义初始化]
    C -->|否| E[使用默认Application]
    
    D --> F[attachBaseContext]
    F --> G[onCreate]
    G --> H[初始化第三方SDK]
    H --> I[反调试检测]
    I --> J[加固壳初始化]
    J --> K[启动MainActivity]
    
    E --> K
    
    subgraph 逆向关注点
        I
        J
        H
    end
    
    style D fill:#ff9800
    style I fill:#f44336
    style J fill:#f44336
    style K fill:#4caf50
```
*图8-3：Application类初始化流程（逆向关注点）*

---

## 9. 实战练习

### 练习1：解包分析APK
1. 下载一个简单的APK文件
2. 使用APKTool解包
3. 查看目录结构
4. 分析AndroidManifest.xml

```bash
# 解包APK
apktool d sample.apk -o sample_output

# 查看目录结构
cd sample_output
tree -L 2

# 查看Manifest
cat AndroidManifest.xml
```

```mermaid
graph TD
    A[sample_output/] --> B[AndroidManifest.xml ✓]
    A --> C[apktool.yml]
    A --> D[smali/]
    A --> E[res/]
    A --> F[assets/]
    A --> G[lib/]
    A --> H[original/]
    A --> I[unknown/]
    
    D --> D1[com/example/app/]
    D1 --> D1A[MainActivity.smali]
    D1 --> D1B[MyService.smali]
    
    E --> E1[layout/]
    E --> E2[drawable/]
    E --> E3[values/]
    
    E1 --> E1A[activity_main.xml ✓]
    E3 --> E3A[strings.xml ✓]
    
    G --> G1[armeabi-v7a/]
    G1 --> G1A[libnative.so]
    
    H --> H1[AndroidManifest.xml]
    H --> H2[META-INF/]
    
    style B fill:#4caf50
    style D1A fill:#2196f3
    style E1A fill:#4caf50
    style G1A fill:#ff9800
```
*图9-1：APK解包后的完整目录结构（✓表示可直接编辑的文件）*

### 练习2：识别APK基本信息
使用以下命令获取APK信息：
```bash
# 查看APK基本信息
aapt dump badging sample.apk

# 查看权限
aapt dump permissions sample.apk

# 查看AndroidManifest
aapt dump xmltree sample.apk AndroidManifest.xml
```

### 练习3：对比不同架构的SO库
```bash
# 解压APK
unzip sample.apk -d sample_unzip

# 查看lib目录
ls -lh sample_unzip/lib/*/

# 对比不同架构的SO文件大小
du -h sample_unzip/lib/*/libnative.so
```

```mermaid
graph LR
    A[APK中的SO库] --> B[armeabi-v7a]
    A --> C[arm64-v8a]
    A --> D[x86]
    A --> E[x86_64]
    
    B --> B1[32位ARM<br/>大多数手机]
    C --> C1[64位ARM<br/>现代手机]
    D --> D1[32位x86<br/>模拟器]
    E --> E1[64位x86<br/>模拟器]
    
    F[设备选择] --> G{CPU架构?}
    G -->|ARM 32位| B
    G -->|ARM 64位| C
    G -->|x86 32位| D
    G -->|x86 64位| E
    
    style C fill:#4caf50
    style C1 fill:#8bc34a
```
*图9-2：不同CPU架构的SO库选择机制*

---

## 10. 常用工具命令速查

### APKTool
```bash
# 反编译APK
apktool d app.apk -o output_dir

# 重新打包APK
apktool b output_dir -o new_app.apk

# 查看版本
apktool --version
```

```mermaid
mindmap
  root((安卓逆向工具))
    反编译工具
      APKTool
        解包APK
        重打包APK
        Smali代码
      dex2jar
        DEX转JAR
      JADX
        DEX转Java
        图形界面
      JEB
        商业工具
        强大功能
    静态分析
      IDA Pro
        SO分析
        ARM汇编
      Ghidra
        免费开源
        反编译
      Radare2
        命令行
        脚本化
    动态调试
      Frida
        Hook框架
        JavaScript
      Xposed
        模块化
        系统级Hook
      GDB/LLDB
        Native调试
    抓包工具
      Charles
        HTTPS抓包
      Fiddler
        代理抓包
      Wireshark
        网络分析
```
*图10-1：常用安卓逆向工具分类*

### AAPT (Android Asset Packaging Tool)
```bash
# 查看APK信息
aapt dump badging app.apk

# 查看权限
aapt dump permissions app.apk

# 查看资源
aapt dump resources app.apk

# 查看配置
aapt dump configurations app.apk
```

### ADB
```bash
# 安装APK
adb install app.apk

# 卸载应用
adb uninstall com.example.app

# 查看已安装应用
adb shell pm list packages

# 查看应用路径
adb shell pm path com.example.app

# 导出APK
adb pull /data/app/com.example.app-1/base.apk
```

---

## 11. 知识点总结

### 核心概念
1. **安卓系统分层架构**：Linux内核 → HAL → 运行时 → 框架层 → 应用层
2. **APK本质**：ZIP压缩包，包含DEX、资源、SO库、签名
3. **AndroidManifest.xml**：应用配置清单，定义组件和权限

### 逆向关键点
- DEX文件：Java代码的字节码形式
- SO库：Native代码，需要ARM/x86汇编知识
- AndroidManifest.xml：入口点、权限、组件信息
- 签名机制：完整性校验的基础

### 下节预告
第2课将学习Java基础与Kotlin，为理解APK代码逻辑打下编程基础。

