| name | android-build |
| description | Use when building Android apps (Gradle CLI) or ROMs (AOSP, LineageOS). Triggers on "gradle build", "assemble", "AOSP", "LineageOS", "lunch", "mka", "breakfast", "brunch", "compile android", "device tree", "kernel build". |
Android Build Systems
This skill covers building Android apps via Gradle CLI and building custom ROMs via AOSP/LineageOS.
App Building (Gradle CLI)
Essential Commands
./gradlew tasks
./gradlew assembleDebug
./gradlew assembleRelease
./gradlew installDebug
./gradlew bundleRelease
Build Variants
./gradlew assembleFreeDebug
./gradlew assemblePaidRelease
./gradlew assembleDebug --info
./gradlew assembleRelease -x test
Testing
./gradlew test
./gradlew testDebugUnitTest
./gradlew connectedAndroidTest
./gradlew connectedCheck
./gradlew test --tests "*.MyTestClass"
Linting & Analysis
./gradlew lint
./gradlew lintDebug
./gradlew ktlintCheck
./gradlew detekt
Clean & Refresh
./gradlew clean
./gradlew clean assembleDebug
./gradlew --refresh-dependencies
./gradlew --stop
Dependencies
./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
keytool -genkey -v -keystore release.keystore \
-alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
Performance
./gradlew assembleDebug --parallel
./gradlew assembleDebug --build-cache
./gradlew assembleDebug --offline
./gradlew --scan
./gradlew --profile
gradle.properties Optimization
org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true
android.useAndroidX=true
SDK Management
sdkmanager
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 list device
avdmanager list 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
Emulator CLI
emulator -list-avds
emulator @my_avd
emulator @my_avd -no-snapshot
emulator @my_avd -no-window
emulator @my_avd -wipe-data
ROM Building (AOSP/LineageOS)
Environment Setup
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 android && cd android
repo init -u https://github.com/LineageOS/android.git -b lineage-21.0
repo sync -c -j$(nproc) --force-sync --no-tags --no-clone-bundle
Build Commands
source build/envsetup.sh
lunch <device>-userdebug
breakfast <device>
m
mka bacon
mka bootimage
mka systemimage
m -j$(nproc)
Build Variants
| Variant | Purpose |
|---|
user | Production, no root, limited debugging |
userdebug | Like user + root + debugging |
eng | Development, all debug tools |
Common Targets
m bootimage
m systemimage
m vendorimage
m otapackage
mka bacon
m Settings
mm
mmm packages/apps/Settings
LineageOS Specifics
breakfast <device>
brunch <device>
repopick <change_number>
repopick -t <topic>
repo sync packages/apps/Settings
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)
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
Key Files
BoardConfig.mk - Hardware configuration:
TARGET_ARCH := arm64
TARGET_BOARD_PLATFORM := <platform>
TARGET_BOOTLOADER_BOARD_NAME := <device>
BOARD_KERNEL_CMDLINE := ...
BOARD_BOOT_HEADER_VERSION := 4
device.mk - Device packages:
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
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=clang
export CLANG_TRIPLE=aarch64-linux-gnu-
make <device>_defconfig
make -j$(nproc)
arch/arm64/boot/Image.gz
In AOSP Tree
TARGET_KERNEL_SOURCE := kernel/<vendor>/<device>
TARGET_KERNEL_CONFIG := <device>_defconfig
TARGET_KERNEL_CLANG_COMPILE := true
Troubleshooting
Common Gradle Issues
export GRADLE_OPTS="-Xmx4g"
./gradlew --stop
rm -rf ~/.gradle/daemon
./gradlew clean --refresh-dependencies
Common AOSP Issues
m clean && m
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
audit2allow -i audit.log
Build Logs
./gradlew assembleDebug --stacktrace
./gradlew assembleDebug --info
m 2>&1 | tee build.log
Quick Reference
Gradle
| Task | Command |
|---|
| Build debug | ./gradlew assembleDebug |
| Build release | ./gradlew assembleRelease |
| Install | ./gradlew installDebug |
| Test | ./gradlew test |
| Lint | ./gradlew lint |
| Clean | ./gradlew clean |
| Dependencies | ./gradlew dependencies |
AOSP/LineageOS
| Task | Command |
|---|
| 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) |