android-build

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Android Build Systems

Android构建系统

This skill covers building Android apps via Gradle CLI and building custom ROMs via AOSP/LineageOS.

本技能涵盖通过Gradle CLI构建Android应用,以及通过AOSP/LineageOS构建自定义ROM的内容。

App Building (Gradle CLI)

应用构建(Gradle CLI)

Essential Commands

核心命令

bash
./gradlew tasks                     # List available tasks
./gradlew assembleDebug             # Build debug APK
./gradlew assembleRelease           # Build release APK
./gradlew installDebug              # Build + install to device
./gradlew bundleRelease             # Build AAB (App Bundle)
bash
./gradlew tasks                     # 列出可用任务
./gradlew assembleDebug             # 构建调试版APK
./gradlew assembleRelease           # 构建正式版APK
./gradlew installDebug              # 构建并安装到设备
./gradlew bundleRelease             # 构建AAB(应用包)

APK output location

APK输出位置

app/build/outputs/apk/debug/app-debug.apk

app/build/outputs/apk/debug/app-debug.apk

app/build/outputs/apk/release/app-release.apk

app/build/outputs/apk/release/app-release.apk

undefined
undefined

Build Variants

构建变体

bash
./gradlew assembleFreeDebug         # Flavor + build type
./gradlew assemblePaidRelease
./gradlew assembleDebug --info      # Verbose output
./gradlew assembleRelease -x test   # Skip tests
bash
./gradlew assembleFreeDebug         # 产品风味 + 构建类型
./gradlew assemblePaidRelease
./gradlew assembleDebug --info      # 详细输出
./gradlew assembleRelease -x test   # 跳过测试

Testing

测试

bash
./gradlew test                      # Unit tests
./gradlew testDebugUnitTest         # Debug unit tests only
./gradlew connectedAndroidTest      # Instrumented tests
./gradlew connectedCheck            # All connected tests
bash
./gradlew test                      # 单元测试
./gradlew testDebugUnitTest         # 仅运行调试版单元测试
./gradlew connectedAndroidTest      # 仪器化测试
./gradlew connectedCheck            # 所有连接设备测试

Run specific test

运行特定测试

./gradlew test --tests "*.MyTestClass"
undefined
./gradlew test --tests "*.MyTestClass"
undefined

Linting & Analysis

代码检查与分析

bash
./gradlew lint                      # Run lint
./gradlew lintDebug                 # Debug only (faster)
./gradlew ktlintCheck               # Kotlin style (if configured)
./gradlew detekt                    # Detekt analysis (if configured)
bash
./gradlew lint                      # 运行Lint检查
./gradlew lintDebug                 # 仅检查调试版(速度更快)
./gradlew ktlintCheck               # Kotlin代码风格检查(需配置)
./gradlew detekt                    # Detekt代码分析(需配置)

Clean & Refresh

清理与刷新

bash
./gradlew clean                     # Clean build
./gradlew clean assembleDebug       # Clean + build
./gradlew --refresh-dependencies    # Force dependency refresh
./gradlew --stop                    # Stop Gradle daemon
bash
./gradlew clean                     # 清理构建产物
./gradlew clean assembleDebug       # 清理后构建
./gradlew --refresh-dependencies    # 强制刷新依赖
./gradlew --stop                    # 停止Gradle守护进程

Dependencies

依赖管理

bash
./gradlew dependencies              # All dependencies
./gradlew app:dependencies          # Module dependencies
./gradlew dependencyInsight --dependency <name>
bash
./gradlew dependencies              # 查看所有依赖
./gradlew app:dependencies          # 查看模块依赖
./gradlew dependencyInsight --dependency <name>

Signing

签名配置

Debug keystore location:
  • Linux:
    ~/.android/debug.keystore
  • macOS:
    ~/.android/debug.keystore
  • Windows:
    C:\Users\<user>\.android\debug.keystore
Password:
android
, Alias:
androiddebugkey
bash
undefined
调试密钥库位置:
  • Linux:
    ~/.android/debug.keystore
  • macOS:
    ~/.android/debug.keystore
  • Windows:
    C:\Users\<user>\.android\debug.keystore
密码:
android
, 别名:
androiddebugkey
bash
undefined

Create release keystore

创建正式版密钥库

keytool -genkey -v -keystore release.keystore
-alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
undefined
keytool -genkey -v -keystore release.keystore
-alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
undefined

Performance

性能优化

bash
./gradlew assembleDebug --parallel  # Parallel builds
./gradlew assembleDebug --build-cache  # Use cache
./gradlew assembleDebug --offline   # Offline mode
./gradlew --scan                    # Build scan (uploads data)
./gradlew --profile                 # Local profile report
bash
./gradlew assembleDebug --parallel  # 并行构建
./gradlew assembleDebug --build-cache  # 使用构建缓存
./gradlew assembleDebug --offline   # 离线模式
./gradlew --scan                    # 构建扫描(上传数据)
./gradlew --profile                 # 本地性能分析报告

gradle.properties Optimization

gradle.properties优化

properties
org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true
android.useAndroidX=true

properties
org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true
android.useAndroidX=true

SDK Management

SDK管理

sdkmanager

sdkmanager

bash
sdkmanager --list                   # List available packages
sdkmanager --list | grep system     # Filter system images
sdkmanager "platform-tools"         # Install package
sdkmanager "platforms;android-34"   # Install platform
sdkmanager "system-images;android-34;google_apis;x86_64"
sdkmanager --update                 # Update all
sdkmanager --licenses               # Accept licenses
bash
sdkmanager --list                   # 列出可用包
sdkmanager --list | grep system     # 过滤系统镜像
sdkmanager "platform-tools"         # 安装包
sdkmanager "platforms;android-34"   # 安装平台
sdkmanager "system-images;android-34;google_apis;x86_64"
sdkmanager --update                 # 更新所有包
sdkmanager --licenses               # 接受许可协议

avdmanager

avdmanager

bash
avdmanager list device              # List device profiles
avdmanager list avd                 # List created AVDs
bash
avdmanager list device              # 列出设备配置文件
avdmanager list avd                 # 列出已创建的AVD

Create AVD

创建AVD

avdmanager create avd -n my_avd
-k "system-images;android-34;google_apis;x86_64"
-d pixel_6
avdmanager delete avd -n my_avd
undefined
avdmanager create avd -n my_avd
-k "system-images;android-34;google_apis;x86_64"
-d pixel_6
avdmanager delete avd -n my_avd
undefined

Emulator CLI

模拟器CLI

bash
emulator -list-avds                 # List AVDs
emulator @my_avd                    # Start AVD
emulator @my_avd -no-snapshot       # Fresh boot
emulator @my_avd -no-window         # Headless
emulator @my_avd -wipe-data         # Factory reset

bash
emulator -list-avds                 # 列出AVD
emulator @my_avd                    # 启动AVD
emulator @my_avd -no-snapshot       # 全新启动(不加载快照)
emulator @my_avd -no-window         # 无头模式
emulator @my_avd -wipe-data         # 恢复出厂设置

ROM Building (AOSP/LineageOS)

ROM构建(AOSP/LineageOS)

Environment Setup

环境搭建

bash
undefined
bash
undefined

Install repo tool

安装repo工具

mkdir -p ~/.bin curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo chmod a+x ~/.bin/repo export PATH="$HOME/.bin:$PATH"
mkdir -p ~/.bin curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo chmod a+x ~/.bin/repo export PATH="$HOME/.bin:$PATH"

Initialize repo

初始化repo

mkdir android && cd android repo init -u https://github.com/LineageOS/android.git -b lineage-21.0
mkdir android && cd android repo init -u https://github.com/LineageOS/android.git -b lineage-21.0

Sync source

同步源码

repo sync -c -j$(nproc) --force-sync --no-tags --no-clone-bundle
undefined
repo sync -c -j$(nproc) --force-sync --no-tags --no-clone-bundle
undefined

Build Commands

构建命令

bash
undefined
bash
undefined

Setup environment

配置环境

source build/envsetup.sh
source build/envsetup.sh

Select device

选择设备

lunch <device>-userdebug # AOSP breakfast <device> # LineageOS
lunch <device>-userdebug # AOSP breakfast <device> # LineageOS

Build

构建

m # Full build mka bacon # LineageOS (with flashable zip) mka bootimage # Just boot.img mka systemimage # Just system
m # 完整构建 mka bacon # LineageOS(生成可刷入zip包) mka bootimage # 仅构建boot.img mka systemimage # 仅构建系统镜像

Parallel build

并行构建

m -j$(nproc)
undefined
m -j$(nproc)
undefined

Build Variants

构建变体

VariantPurpose
user
Production, no root, limited debugging
userdebug
Like user + root + debugging
eng
Development, all debug tools
变体名称用途
user
生产环境,无root权限,调试功能受限
userdebug
类似user,增加root权限和调试功能
eng
开发环境,包含所有调试工具

Common Targets

常见构建目标

bash
m bootimage                         # Kernel + ramdisk
m systemimage                       # System partition
m vendorimage                       # Vendor partition
m otapackage                        # OTA zip
mka bacon                           # LineageOS flashable zip
bash
m bootimage                         # 内核 + 内存磁盘
m systemimage                       # 系统分区镜像
m vendorimage                       # 厂商分区镜像
m otapackage                        # OTA升级包
mka bacon                           # LineageOS可刷入zip包

Module-specific

模块特定构建

m Settings # Just Settings app mm # Build current directory mmm packages/apps/Settings # Build specific path
undefined
m Settings # 仅构建设置应用 mm # 构建当前目录 mmm packages/apps/Settings # 构建指定路径
undefined

LineageOS Specifics

LineageOS专属操作

bash
breakfast <device>                  # Setup + sync device deps
brunch <device>                     # breakfast + mka bacon
bash
breakfast <device>                  # 配置环境并同步设备依赖
brunch <device>                     # breakfast + mka bacon

Cherry-pick from Gerrit

从Gerrit挑选提交

repopick <change_number> repopick -t <topic>
repopick <change_number> repopick -t <topic>

Sync specific project

同步特定项目

repo sync packages/apps/Settings
undefined
repo sync packages/apps/Settings
undefined

Build Output

构建输出

out/target/product/<device>/
├── boot.img                        # Kernel + ramdisk
├── system.img                      # System partition
├── vendor.img                      # Vendor partition
├── lineage-*.zip                   # Flashable zip (LineageOS)
└── recovery.img                    # Recovery (non-A/B)

out/target/product/<device>/
├── boot.img                        # 内核 + 内存磁盘
├── system.img                      # 系统分区镜像
├── vendor.img                      # 厂商分区镜像
├── lineage-*.zip                   # 可刷入zip包(LineageOS)
└── recovery.img                    # 恢复分区(非A/B分区设备)

Device Trees

设备树

Structure

结构

device/<vendor>/<device>/
├── AndroidProducts.mk              # Product makefiles list
├── BoardConfig.mk                  # Board configuration
├── device.mk                       # Device makefile
├── lineage_<device>.mk             # LineageOS product
├── extract-files.sh                # Vendor blob extraction
├── proprietary-files.txt           # Blob list
├── sepolicy/                       # SELinux policies
└── overlay/                        # Resource overlays
device/<vendor>/<device>/
├── AndroidProducts.mk              # 产品Makefile列表
├── BoardConfig.mk                  # 主板配置
├── device.mk                       # 设备Makefile
├── lineage_<device>.mk             # LineageOS产品配置
├── extract-files.sh                # 厂商二进制文件提取脚本
├── proprietary-files.txt           # 二进制文件列表
├── sepolicy/                       # SELinux策略
└── overlay/                        # 资源覆盖

Key Files

关键文件

BoardConfig.mk - Hardware configuration:
makefile
TARGET_ARCH := arm64
TARGET_BOARD_PLATFORM := <platform>
TARGET_BOOTLOADER_BOARD_NAME := <device>
BOARD_KERNEL_CMDLINE := ...
BOARD_BOOT_HEADER_VERSION := 4
device.mk - Device packages:
makefile
PRODUCT_PACKAGES += \
    android.hardware.audio@7.0-impl \
    audio.primary.$(TARGET_BOARD_PLATFORM)

PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/configs/audio_policy.conf:...

BoardConfig.mk - 硬件配置:
makefile
TARGET_ARCH := arm64
TARGET_BOARD_PLATFORM := <platform>
TARGET_BOOTLOADER_BOARD_NAME := <device>
BOARD_KERNEL_CMDLINE := ...
BOARD_BOOT_HEADER_VERSION := 4
device.mk - 设备包配置:
makefile
PRODUCT_PACKAGES += \
    android.hardware.audio@7.0-impl \
    audio.primary.$(TARGET_BOARD_PLATFORM)

PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/configs/audio_policy.conf:...

Kernel Building

内核构建

Standalone

独立构建

bash
undefined
bash
undefined

Setup

配置环境

export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu-

Or for Clang:

或使用Clang:

export CC=clang export CLANG_TRIPLE=aarch64-linux-gnu-
export CC=clang export CLANG_TRIPLE=aarch64-linux-gnu-

Configure

配置内核

make <device>_defconfig
make <device>_defconfig

Build

构建

make -j$(nproc)
make -j$(nproc)

Output

输出文件

arch/arm64/boot/Image.gz
undefined
arch/arm64/boot/Image.gz
undefined

In AOSP Tree

在AOSP源码树中构建

makefile
undefined
makefile
undefined

In BoardConfig.mk

在BoardConfig.mk中配置

TARGET_KERNEL_SOURCE := kernel/<vendor>/<device> TARGET_KERNEL_CONFIG := <device>_defconfig TARGET_KERNEL_CLANG_COMPILE := true

---
TARGET_KERNEL_SOURCE := kernel/<vendor>/<device> TARGET_KERNEL_CONFIG := <device>_defconfig TARGET_KERNEL_CLANG_COMPILE := true

---

Troubleshooting

故障排除

Common Gradle Issues

常见Gradle问题

bash
undefined
bash
undefined

OOM

内存不足

export GRADLE_OPTS="-Xmx4g"
export GRADLE_OPTS="-Xmx4g"

Daemon issues

守护进程问题

./gradlew --stop rm -rf ~/.gradle/daemon
./gradlew --stop rm -rf ~/.gradle/daemon

Cache issues

缓存问题

./gradlew clean --refresh-dependencies
undefined
./gradlew clean --refresh-dependencies
undefined

Common AOSP Issues

常见AOSP问题

bash
undefined
bash
undefined

Ninja error - usually dependency issue

Ninja错误 - 通常是依赖问题

m clean && m
m clean && m

Jack server (old builds)

Jack服务器(旧版本构建)

./prebuilts/sdk/tools/jack-admin kill-server ./prebuilts/sdk/tools/jack-admin start-server
./prebuilts/sdk/tools/jack-admin kill-server ./prebuilts/sdk/tools/jack-admin start-server

SELinux issues

SELinux问题

audit2allow -i audit.log
undefined
audit2allow -i audit.log
undefined

Build Logs

构建日志

bash
undefined
bash
undefined

Gradle

Gradle

./gradlew assembleDebug --stacktrace ./gradlew assembleDebug --info
./gradlew assembleDebug --stacktrace ./gradlew assembleDebug --info

AOSP

AOSP

m 2>&1 | tee build.log

---
m 2>&1 | tee build.log

---

Quick Reference

快速参考

Gradle

Gradle

TaskCommand
Build debug
./gradlew assembleDebug
Build release
./gradlew assembleRelease
Install
./gradlew installDebug
Test
./gradlew test
Lint
./gradlew lint
Clean
./gradlew clean
Dependencies
./gradlew dependencies
任务命令
构建调试版
./gradlew assembleDebug
构建正式版
./gradlew assembleRelease
安装应用
./gradlew installDebug
运行测试
./gradlew test
代码检查
./gradlew lint
清理构建
./gradlew clean
查看依赖
./gradlew dependencies

AOSP/LineageOS

AOSP/LineageOS

TaskCommand
Setup env
source build/envsetup.sh
Select device
lunch <device>-userdebug
Full build
m
LineageOS zip
mka bacon
Just boot
mka bootimage
Sync
repo sync -c -j$(nproc)
任务命令
配置环境
source build/envsetup.sh
选择设备
lunch <device>-userdebug
完整构建
m
生成LineageOS包
mka bacon
仅构建boot镜像
mka bootimage
同步源码
repo sync -c -j$(nproc)
undefined