# 开机动画与OTA

## 概述

开机动画和OTA升级是Android系统定制化的重要内容。本文档介绍开机动画的定制方法和OTA升级机制。

## 开机动画定制

### 1. 开机动画基础

#### 动画格式
- **bootanimation.zip**: 开机动画压缩包
- **desc.txt**: 动画描述文件
- **图片序列**: PNG格式图片序列

#### 动画位置
```
/system/media/bootanimation.zip
```

#### 动画结构
```
bootanimation.zip
├── desc.txt          # 描述文件
├── part0/            # 第一部分图片
│   ├── 00000.png
│   ├── 00001.png
│   └── ...
└── part1/            # 第二部分图片
    ├── 00000.png
    ├── 00001.png
    └── ...
```

### 2. 描述文件格式

#### desc.txt格式
```
width height fps
p type count path
p type count path
```

#### 参数说明
- **width**: 动画宽度（像素）
- **height**: 动画高度（像素）
- **fps**: 帧率（帧/秒）
- **p**: 部分标识
- **type**: 播放类型（c=循环，p=播放一次）
- **count**: 播放次数（0=无限循环）
- **path**: 图片路径

#### 示例
```
1080 1920 30
p 1 0 part0
p 0 0 part1
```

### 3. 制作开机动画

#### 步骤1: 准备图片
- 准备PNG格式图片序列
- 图片尺寸一致
- 图片命名规范（00000.png, 00001.png...）

#### 步骤2: 创建目录结构
```bash
mkdir bootanimation
cd bootanimation
mkdir part0 part1
# 复制图片到对应目录
```

#### 步骤3: 创建描述文件
```bash
# 创建desc.txt
cat > desc.txt << EOF
1080 1920 30
p 1 0 part0
p 0 0 part1
EOF
```

#### 步骤4: 打包
```bash
# 打包为zip文件（注意：使用zip命令，不要压缩）
zip -0 -r ../bootanimation.zip desc.txt part0 part1
```

#### 步骤5: 部署
```bash
# 推送到设备
adb push bootanimation.zip /system/media/

# 设置权限
adb shell chmod 644 /system/media/bootanimation.zip
adb shell chown root:root /system/media/bootanimation.zip
```

### 4. 开机动画优化

#### 性能优化
- 减少图片数量
- 优化图片大小
- 使用合适的帧率
- 减少动画时长

#### 图片优化
```bash
# 压缩图片
pngquant --quality=65-80 bootanimation/part0/*.png

# 优化图片大小
optipng -o7 bootanimation/part0/*.png
```

## OTA升级机制

### 1. OTA基础

#### OTA类型
- **增量OTA**: 只更新变更部分
- **全量OTA**: 完整系统更新
- **AB系统OTA**: A/B分区系统更新

#### OTA包结构
```
ota_package.zip
├── META-INF/
│   ├── com/
│   │   └── android/
│   │       ├── metadata
│   │       └── otacert
│   └── MANIFEST.MF
├── system/
│   └── ...
└── boot.img
```

### 2. OTA包制作

#### 使用build/tools制作
```bash
# 制作增量OTA包
./build/tools/releasetools/ota_from_target_files \
    -k build/target/product/security/testkey \
    -i previous.zip current.zip incremental.zip

# 制作全量OTA包
./build/tools/releasetools/ota_from_target_files \
    -k build/target/product/security/testkey \
    target_files.zip full_ota.zip
```

#### target_files.zip制作
```bash
# 从系统镜像制作target_files
./build/tools/releasetools/img_from_target_files \
    target_files.zip system.img
```

### 3. OTA升级流程

#### 升级步骤
```
1. 下载OTA包
    ↓
2. 验证OTA包签名
    ↓
3. 进入Recovery模式
    ↓
4. 安装OTA包
    ↓
5. 重启系统
    ↓
6. 完成升级
```

#### Recovery升级脚本
```bash
#!/sbin/sh
# update-binary脚本

# 挂载分区
mount /system
mount /data

# 应用更新
apply_patch SYSTEM:system.new.dat system.transfer.list

# 清理
unmount /system
unmount /data
```

### 4. OTA升级实现

#### 系统升级服务
```java
// SystemUpdateService.java
public class SystemUpdateService extends SystemService {
    private static final String TAG = "SystemUpdateService";
    
    public void checkForUpdates() {
        // 检查更新
        UpdateInfo updateInfo = fetchUpdateInfo();
        if (updateInfo != null) {
            // 下载更新
            downloadUpdate(updateInfo);
        }
    }
    
    public void installUpdate(File updateFile) {
        // 验证签名
        if (!verifySignature(updateFile)) {
            return;
        }
        
        // 进入Recovery安装
        rebootToRecovery(updateFile);
    }
}
```

#### Recovery升级
```java
// RecoverySystem.java
public class RecoverySystem {
    public static void installPackage(Context context, File packageFile) 
            throws IOException {
        // 验证包
        verifyPackage(packageFile);
        
        // 写入命令
        String command = "update_package=" + packageFile.getCanonicalPath();
        RecoverySystem.bootCommand(context, command);
    }
}
```

## 开机动画性能优化

### 1. 优化策略

#### 减少资源
- 减少图片数量
- 优化图片大小
- 使用压缩格式

#### 优化加载
- 预加载动画资源
- 优化解码性能
- 减少内存占用

### 2. 性能测试

#### 测试方法
```bash
# 测量开机动画加载时间
adb shell dmesg | grep bootanimation

# 测量动画播放帧率
adb shell dumpsys SurfaceFlinger | grep bootanimation
```

## OTA升级优化

### 1. 增量升级

#### 增量包制作
- 只包含变更文件
- 使用差分包
- 减少下载大小

#### 增量升级优势
- 下载速度快
- 节省带宽
- 升级时间短

### 2. A/B系统升级

#### A/B分区
- 双系统分区
- 无缝升级
- 快速回滚

#### A/B升级流程
```
当前系统在A分区
    ↓
下载更新到B分区
    ↓
安装更新到B分区
    ↓
重启切换到B分区
    ↓
B分区成为当前系统
```

## 常见问题

### 1. 开机动画不显示

#### 问题原因
- 文件路径错误
- 权限设置错误
- 格式不正确

#### 解决方法
- 检查文件路径
- 检查文件权限
- 验证zip格式

### 2. 开机动画卡顿

#### 问题原因
- 图片过大
- 帧率过高
- 资源加载慢

#### 解决方法
- 优化图片大小
- 降低帧率
- 优化加载流程

### 3. OTA升级失败

#### 问题原因
- 签名验证失败
- 空间不足
- 版本不匹配

#### 解决方法
- 检查签名
- 检查空间
- 检查版本

## 最佳实践

### 1. 开机动画
- 保持动画简洁
- 优化资源大小
- 测试不同设备

### 2. OTA升级
- 充分测试升级包
- 提供回滚机制
- 监控升级过程

## 相关链接

- [[README]]
- [[01-系统启动流程]]
- [[06-性能优化体系/启动优化方法论]]