1010 AVD_NAME : ' Pixel_API_34'
1111
1212jobs :
13- # Job 1: Build APK
14- build :
15- name : Build APK
13+ android :
14+ name : Android Build & Test
1615 runs-on : ubuntu-latest
17- timeout-minutes : 30
16+ timeout-minutes : 60
1817
1918 steps :
2019 - name : Checkout
@@ -32,13 +31,31 @@ jobs:
3231 - name : Setup Android SDK
3332 uses : android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407
3433
34+ - name : Enable KVM
35+ run : |
36+ echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
37+ sudo udevadm control --reload-rules
38+ sudo udevadm trigger --name-match=kvm
39+ ls /dev/kvm
40+
41+ # Check caches first
3542 - name : Cache APK build output
3643 id : cache-apk
3744 uses : actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
3845 with :
3946 path : example/android/app/build/outputs/apk/debug/app-debug.apk
4047 key : ${{ runner.os }}-apk-${{ hashFiles('android/**/*.{java,kt,xml}', 'example/android/**/*.{java,kt,xml,gradle}', 'src/**/*.{js,jsx,ts,tsx}', 'package.json', 'yarn.lock') }}
4148
49+ - name : AVD cache
50+ uses : actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
51+ id : avd-cache
52+ with :
53+ path : |
54+ ~/.android/avd/*
55+ ~/.android/adb*
56+ key : avd-${{ env.DEVICE_API_LEVEL }}-${{ env.DEVICE_ARCH }}
57+
58+ # Build dependencies (only if APK not cached)
4259 - name : Cache NDK
4360 id : cache-ndk
4461 if : steps.cache-apk.outputs.cache-hit != 'true'
@@ -65,53 +82,13 @@ jobs:
6582 restore-keys : |
6683 ${{ runner.os }}-gradle-
6784
85+ # Build APK (only if not cached)
6886 - name : Build APK with Gradle
6987 if : steps.cache-apk.outputs.cache-hit != 'true'
7088 run : ./gradlew assembleDebug
7189 working-directory : example/android
7290
73- - name : Upload APK artifact
74- uses : actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874
75- with :
76- name : android-apk
77- path : example/android/app/build/outputs/apk/debug/app-debug.apk
78- retention-days : 1
79-
80- # Job 2: Setup AVD (runs in parallel with build)
81- prepare-device :
82- name : Prepare Emulator
83- runs-on : ubuntu-latest
84- timeout-minutes : 15
85-
86- steps :
87- - name : Checkout
88- uses : actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd
89-
90- - name : Setup Java
91- uses : actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e
92- with :
93- distribution : ' zulu'
94- java-version : ' 17'
95-
96- - name : Setup Android SDK
97- uses : android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407
98-
99- - name : Enable KVM
100- run : |
101- echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
102- sudo udevadm control --reload-rules
103- sudo udevadm trigger --name-match=kvm
104- ls /dev/kvm
105-
106- - name : AVD cache
107- uses : actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
108- id : avd-cache
109- with :
110- path : |
111- ~/.android/avd/*
112- ~/.android/adb*
113- key : avd-${{ env.DEVICE_API_LEVEL }}-${{ env.DEVICE_ARCH }}
114-
91+ # Create AVD (only if not cached, runs after build)
11592 - name : Create AVD and generate snapshot for caching
11693 if : steps.avd-cache.outputs.cache-hit != 'true'
11794 uses : reactivecircus/android-emulator-runner@b530d96654c385303d652368551fb075bc2f0b6b
@@ -127,53 +104,6 @@ jobs:
127104 emulator-options : -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -memory 4096
128105 script : echo "Generated AVD snapshot for caching."
129106
130- # Job 3: Run tests (waits for both build and device setup)
131- test :
132- name : Run Tests
133- runs-on : ubuntu-latest
134- needs : [build, prepare-device]
135- timeout-minutes : 30
136-
137- steps :
138- - name : Checkout
139- uses : actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd
140-
141- - name : Setup Project
142- uses : ./.github/actions/setup-node-yarn
143-
144- - name : Setup Java
145- uses : actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e
146- with :
147- distribution : ' zulu'
148- java-version : ' 17'
149-
150- - name : Setup Android SDK
151- uses : android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407
152-
153- - name : Enable KVM
154- run : |
155- echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
156- sudo udevadm control --reload-rules
157- sudo udevadm trigger --name-match=kvm
158- ls /dev/kvm
159-
160- # Download pre-built APK from build job
161- - name : Download APK artifact
162- uses : actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
163- with :
164- name : android-apk
165- path : example/android/app/build/outputs/apk/debug/
166-
167- # Restore AVD from cache (created in prepare-device job)
168- - name : AVD cache
169- uses : actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
170- id : avd-cache
171- with :
172- path : |
173- ~/.android/avd/*
174- ~/.android/adb*
175- key : avd-${{ env.DEVICE_API_LEVEL }}-${{ env.DEVICE_ARCH }}
176-
177107 # Run tests with emulator
178108 - name : Run Harness E2E tests
179109 uses : reactivecircus/android-emulator-runner@b530d96654c385303d652368551fb075bc2f0b6b
@@ -191,3 +121,9 @@ jobs:
191121 script : |
192122 adb install -r "./android/app/build/outputs/apk/debug/app-debug.apk"
193123 yarn harness:android
124+
125+ # Cleanup
126+ - name : Stop Gradle Daemon
127+ if : always()
128+ working-directory : example/android
129+ run : ./gradlew --stop
0 commit comments