Prerequisites:
- Docker
- adb (
android-platform-tools) installed locally
Build notes:
maketargets run Gradle from Docker containers and adb from host.- Compose is resolved by
scripts/compose.sh(localdocker composeplugin, ordocker/composecontainer fallback). - Container platform is auto-detected from host arch (
arm64->linux/arm64,x86_64->linux/amd64). - Gradle builds default to
linux/amd64containers (including Apple Silicon) for reliableaapt2. - Gradle container heap defaults to
-Xmx1536m; override withANDROBOT_GRADLE_JVMARGS. - Optional override example:
ANDROBOT_PLATFORM=linux/amd64 make build-release
Validate tooling:
make doctorBuild release APK (default):
make build-releaseBuild release AAB (Google Play artifact):
make build-bundleRelease artifact output:
app/build/outputs/apk/release/app-release-unsigned.apkapp/build/outputs/bundle/release/app-release.aab
Use this for emulator/dev loops.
Build debug APK:
make buildInstall to Docker emulator:
make installManual emulator control:
make emu-up
make emu-logs
make emu-downUnit tests:
make test-unitDevice tests:
make test-deviceCI emulator job also runs SMS integration verification (.ci/verify-sms-flow.sh):
- installs debug APK
- configures first trusted sender via debug test receiver
- sends emulator SMS
volume maxfrom untrusted sender and verifies no volume change - sends invalid command from trusted sender and verifies no volume change
- sends untrusted
call me backand verifies call path is ignored - sends emulator SMS
volume max - asserts media volume reaches max
- sends trusted
call me backand verifies callback path is reached - sends trusted
wifi onand verifies command route reaches execution or graceful ignore
CI emulator job also runs app lifecycle verification (.ci/verify-app-lifecycle.sh):
- installs debug APK
- adds a trusted sender
- kills app process and verifies trusted sender is preserved
- upgrades app in place (
adb install -r) and verifies trusted sender is preserved - uninstalls/reinstalls app and verifies trusted sender list is reset
CI emulator job also runs upgrade E2E verification (.ci/verify-upgrade-e2e.sh):
- builds old debug APK with temporary lower version code
- installs old APK and seeds trusted sender state
- builds new debug APK with higher version code
- upgrades in place (
adb install -r) and verifies:- installed version code changed to new
- trusted sender state persisted across upgrade
GitHub Actions runs emulator tests on both pixel_6 and pixel_7 profiles.
All tests:
make testFull local CI pipeline:
make ciapp/src/main/java/com/androbot/app/- app logicapp/src/main/res/- UI resourcesapp/src/test/- unit testsapp/src/androidTest/- device tests.github/workflows/android.yml- GitHub Actions CIscripts/dev.sh- local command orchestrator (Dockerized tools)scripts/gradlew.sh- Gradle launcher incicontainerscripts/compose.sh- Compose wrapper with arch detectionMakefile- convenience targets
Start emulator container with browser-accessible UI:
make emu-upOpen:
http://localhost:6080
Useful commands:
make emu-logs
make emu-downNotes:
- This is useful for manual UI/SMS debugging against the same Docker emulator setup.
- Emulator install/deploy command for this containerized emulator remains:
make install