OverviewHistoryStatsSecurity
npx skills add ...
Documentation
SKILL.md
npx skills add hyperb1iss/hyperdroid-skill --skill android-build
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".
npx skills add hyperb1iss/hyperdroid-skill --skill android-build
This skill covers building Android apps via Gradle CLI and building custom ROMs via AOSP/LineageOS.
Debug keystore location:
~/.android/debug.keystore~/.android/debug.keystoreC:\Users\<user>\.android\debug.keystorePassword: android, Alias: androiddebugkey
| Variant | Purpose |
|---|---|
user | Production, no root, limited debugging |
userdebug | Like user + root + debugging |
eng | Development, all debug tools |
BoardConfig.mk - Hardware configuration:
device.mk - Device packages:
| 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 |
| 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) |
./gradlew assembleFreeDebug # Flavor + build type
./gradlew assemblePaidRelease
./gradlew assembleDebug --info # Verbose output
./gradlew assembleRelease -x test # Skip tests./gradlew test # Unit tests
./gradlew testDebugUnitTest # Debug unit tests only
./gradlew connectedAndroidTest # Instrumented tests
./gradlew connectedCheck # All connected tests
# Run specific test
./gradlew test --tests "*.MyTestClass"./gradlew lint # Run lint
./gradlew lintDebug # Debug only (faster)
./gradlew ktlintCheck # Kotlin style (if configured)
./gradlew detekt # Detekt analysis (if configured)./gradlew clean # Clean build
./gradlew clean assembleDebug # Clean + build
./gradlew --refresh-dependencies # Force dependency refresh
./gradlew --stop # Stop Gradle daemon./gradlew dependencies # All dependencies
./gradlew app:dependencies # Module dependencies
./gradlew dependencyInsight --dependency <name># Create release keystore
keytool -genkey -v -keystore release.keystore \
-alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000./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 reportorg.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configuration-cache=true
android.useAndroidX=truesdkmanager --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 licensesavdmanager list device # List device profiles
avdmanager list avd # List created AVDs
# Create AVD
avdmanager create avd -n my_avd \
-k "system-images;android-34;google_apis;x86_64" \
-d pixel_6
avdmanager delete avd -n my_avdemulator -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# Install repo tool
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
mkdir android && cd android
repo init -u https://github.com/LineageOS/android.git -b lineage-21.0
# Or AOSP: repo init -u https://android.googlesource.com/platform/manifest
# Sync source
repo sync -c -j$(nproc) --force-sync --no-tags --no-clone-bundle# Setup environment
source build/envsetup.sh
# Select device
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
# Parallel build
m -j$(nproc)m bootimage # Kernel + ramdisk
m systemimage # System partition
m vendorimage # Vendor partition
m otapackage # OTA zip
mka bacon # LineageOS flashable zip
# Module-specific
m Settings # Just Settings app
mm # Build current directory
mmm packages/apps/Settings # Build specific pathbreakfast <device> # Setup + sync device deps
brunch <device> # breakfast + mka bacon
# Cherry-pick from Gerrit
repopick <change_number>
repopick -t <topic>
# Sync specific project
repo sync packages/apps/Settingsout/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/<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 overlaysTARGET_ARCH := arm64
TARGET_BOARD_PLATFORM := <platform>
TARGET_BOOTLOADER_BOARD_NAME := <device>
BOARD_KERNEL_CMDLINE := ...
BOARD_BOOT_HEADER_VERSION := 4PRODUCT_PACKAGES += \
android.hardware.audio@7.0-impl \
audio.primary.$(TARGET_BOARD_PLATFORM)
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/configs/audio_policy.conf:...# Setup
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
# Or for Clang:
export CC=clang
export CLANG_TRIPLE=aarch64-linux-gnu-
# Configure
make <device>_defconfig
# Build
make -j$(nproc)
# Output
arch/arm64/boot/Image.gz# In BoardConfig.mk
TARGET_KERNEL_SOURCE := kernel/<vendor>/<device>
TARGET_KERNEL_CONFIG := <device>_defconfig
TARGET_KERNEL_CLANG_COMPILE := true# OOM
export GRADLE_OPTS="-Xmx4g"
# Daemon issues
./gradlew --stop
rm -rf ~/.gradle/daemon
# Cache issues
./gradlew clean --refresh-dependencies# Ninja error - usually dependency issue
m clean && m
# Jack server (old builds)
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
# SELinux issues
audit2allow -i audit.log# Gradle
./gradlew assembleDebug --stacktrace
./gradlew assembleDebug --info
# AOSP
m 2>&1 | tee build.log