Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .claude/rules/android.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ Gradle マルチモジュール構成:

## ビルドフレーバー

- `embedded`: Go バックエンドを `libclawdroid.so` として jniLibs に含む
- `termux`: バックエンドなし(Termux 上で別途 Go バイナリを実行)
- `variant`: `embedded`(Go バックエンドを `libclawdroid.so` として jniLibs に含む) / `termux`(バックエンドなし。Termux 上で別途 Go バイナリを実行)
- `distribution`: `direct` / `googleplay`
- `termuxGoogleplay` は `androidComponents.beforeVariants` で除外する

## 技術スタック

Expand Down Expand Up @@ -70,6 +71,6 @@ Gradle マルチモジュール構成:
コード修正後は以下を実行して確認すること:
1. `cd android && ./gradlew lint` — Lint チェック
2. `cd android && ./gradlew test` — ユニットテスト実行
3. `cd android && ./gradlew assembleEmbeddedDebug` — ビルド確認
3. `cd android && ./gradlew assembleEmbeddedGoogleplayDebug` — Google Play 向け Embedded ビルド確認

コードを修正したら、関連するテストも合わせて修正・追加すること。
8 changes: 4 additions & 4 deletions .github/workflows/android-aab.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:

jobs:
build-aab:
name: Build Embedded AAB
name: Build Embedded Google Play AAB
runs-on: ubuntu-latest
steps:
- name: Checkout
Expand Down Expand Up @@ -46,10 +46,10 @@ jobs:

- name: Build release AAB
working-directory: android
run: ./gradlew bundleEmbeddedRelease
run: ./gradlew bundleEmbeddedGoogleplayRelease

- name: Upload AAB artifact
uses: actions/upload-artifact@v4
with:
name: clawdroid-embedded-release.aab
path: android/app/build/outputs/bundle/embeddedRelease/app-embedded-release.aab
name: clawdroid-embedded-googleplay-release.aab
path: android/app/build/outputs/bundle/embeddedGoogleplayRelease/*.aab
73 changes: 62 additions & 11 deletions .github/workflows/android-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
workflow_dispatch:

jobs:
termux:
termux-direct:
runs-on: ubuntu-latest
defaults:
run:
Expand Down Expand Up @@ -41,15 +41,15 @@ jobs:
"$STORE_PASSWORD" "$KEY_ALIAS" "$KEY_PASSWORD" > keystore.properties

- name: Build release APK
run: ./gradlew assembleTermuxRelease
run: ./gradlew assembleTermuxDirectRelease

- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: clawdroid-termux-release-apk
path: android/app/build/outputs/apk/termux/release/*.apk
name: clawdroid-termux-direct-release-apk
path: android/app/build/outputs/apk/termuxDirect/release/*.apk

embedded:
embedded-direct:
runs-on: ubuntu-latest
steps:
- name: Checkout
Expand Down Expand Up @@ -91,24 +91,75 @@ jobs:

- name: Build release APKs
working-directory: android
run: ./gradlew assembleEmbeddedRelease -PenableAbiSplit
run: ./gradlew assembleEmbeddedDirectRelease -PenableAbiSplit

- name: Upload APKs
uses: actions/upload-artifact@v4
with:
name: clawdroid-embedded-release-apks
path: android/app/build/outputs/apk/embedded/release/*.apk
name: clawdroid-embedded-direct-release-apks
path: android/app/build/outputs/apk/embeddedDirect/release/*.apk

embedded-googleplay:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod

- name: Build Go binaries for Android
run: make build-android

- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Decode keystore
env:
KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
working-directory: android
run: |
echo "$KEYSTORE_BASE64" | base64 -d > release.keystore

- name: Create keystore.properties
env:
STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
working-directory: android
run: |
printf 'storeFile=release.keystore\nstorePassword=%s\nkeyAlias=%s\nkeyPassword=%s\n' \
"$STORE_PASSWORD" "$KEY_ALIAS" "$KEY_PASSWORD" > keystore.properties

- name: Build release APKs
working-directory: android
run: ./gradlew assembleEmbeddedGoogleplayRelease -PenableAbiSplit

- name: Upload APKs
uses: actions/upload-artifact@v4
with:
name: clawdroid-embedded-googleplay-release-apks
path: android/app/build/outputs/apk/embeddedGoogleplay/release/*.apk

gate:
if: always()
needs: [termux, embedded]
needs: [termux-direct, embedded-direct, embedded-googleplay]
runs-on: ubuntu-latest
steps:
- name: Check results
run: |
for result in \
"${{ needs.termux.result }}" \
"${{ needs.embedded.result }}"; do
"${{ needs.termux-direct.result }}" \
"${{ needs.embedded-direct.result }}" \
"${{ needs.embedded-googleplay.result }}"; do
if [ "$result" = "failure" ] || [ "$result" = "cancelled" ]; then
exit 1
fi
Expand Down
78 changes: 61 additions & 17 deletions .github/workflows/android-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
- name: Run ktlint
run: ./gradlew ktlintCheck

lint-termux:
lint-termux-direct:
runs-on: ubuntu-latest
defaults:
run:
Expand All @@ -43,10 +43,10 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Run Android Lint (Termux)
run: ./gradlew :app:lintTermuxDebug
- name: Run Android Lint (Termux Direct)
run: ./gradlew :app:lintTermuxDirectDebug

lint-embedded:
lint-embedded-direct:
runs-on: ubuntu-latest
defaults:
run:
Expand All @@ -64,10 +64,10 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Run Android Lint (Embedded)
run: ./gradlew :app:lintEmbeddedDebug
- name: Run Android Lint (Embedded Direct)
run: ./gradlew :app:lintEmbeddedDirectDebug

test-termux:
lint-embedded-googleplay:
runs-on: ubuntu-latest
defaults:
run:
Expand All @@ -85,10 +85,10 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Run unit tests (Termux)
run: ./gradlew testTermuxDebugUnitTest
- name: Run Android Lint (Embedded Google Play)
run: ./gradlew :app:lintEmbeddedGoogleplayDebug

test-embedded:
test-termux-direct:
runs-on: ubuntu-latest
defaults:
run:
Expand All @@ -106,22 +106,66 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Run unit tests (Embedded)
run: ./gradlew testEmbeddedDebugUnitTest
- name: Run unit tests (Termux Direct)
run: ./gradlew testTermuxDirectDebugUnitTest

test-embedded-direct:
runs-on: ubuntu-latest
defaults:
run:
working-directory: android
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Run unit tests (Embedded Direct)
run: ./gradlew testEmbeddedDirectDebugUnitTest

test-embedded-googleplay:
runs-on: ubuntu-latest
defaults:
run:
working-directory: android
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Run unit tests (Embedded Google Play)
run: ./gradlew testEmbeddedGoogleplayDebugUnitTest

gate:
if: always()
needs: [ktlint, lint-termux, lint-embedded, test-termux, test-embedded]
needs: [ktlint, lint-termux-direct, lint-embedded-direct, lint-embedded-googleplay, test-termux-direct, test-embedded-direct, test-embedded-googleplay]
runs-on: ubuntu-latest
steps:
- name: Check results
run: |
for result in \
"${{ needs.ktlint.result }}" \
"${{ needs.lint-termux.result }}" \
"${{ needs.lint-embedded.result }}" \
"${{ needs.test-termux.result }}" \
"${{ needs.test-embedded.result }}"; do
"${{ needs.lint-termux-direct.result }}" \
"${{ needs.lint-embedded-direct.result }}" \
"${{ needs.lint-embedded-googleplay.result }}" \
"${{ needs.test-termux-direct.result }}" \
"${{ needs.test-embedded-direct.result }}" \
"${{ needs.test-embedded-googleplay.result }}"; do
if [ "$result" = "failure" ] || [ "$result" = "cancelled" ]; then
exit 1
fi
Expand Down
80 changes: 62 additions & 18 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,20 +73,20 @@ jobs:
"$STORE_PASSWORD" "$KEY_ALIAS" "$KEY_PASSWORD" > keystore.properties

- name: Build release APK
run: ./gradlew assembleTermuxRelease
run: ./gradlew assembleTermuxDirectRelease

- name: Upload APK to release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
run: |
mv app/build/outputs/apk/termux/release/app-termux-release.apk \
app/build/outputs/apk/termux/release/clawdroid-noembedded-"$RELEASE_TAG".apk
mv app/build/outputs/apk/termuxDirect/release/app-termux-direct-release.apk \
app/build/outputs/apk/termuxDirect/release/clawdroid-noembedded-"$RELEASE_TAG".apk
gh release upload "$RELEASE_TAG" \
app/build/outputs/apk/termux/release/clawdroid-noembedded-"$RELEASE_TAG".apk
app/build/outputs/apk/termuxDirect/release/clawdroid-noembedded-"$RELEASE_TAG".apk

build-android-embedded:
name: Android Embedded APKs
build-android-embedded-direct:
name: Android Embedded Direct APKs
runs-on: ubuntu-latest
permissions:
contents: write
Expand Down Expand Up @@ -131,33 +131,77 @@ jobs:

- name: Build release APKs
working-directory: android
run: ./gradlew assembleEmbeddedRelease -PenableAbiSplit

- name: Build release AAB
working-directory: android
run: ./gradlew bundleEmbeddedRelease
run: ./gradlew assembleEmbeddedDirectRelease -PenableAbiSplit

- name: Upload APKs to release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
working-directory: android/app/build/outputs/apk/embedded/release
working-directory: android/app/build/outputs/apk/embeddedDirect/release
run: |
mv app-embedded-arm64-v8a-release.apk clawdroid-"$RELEASE_TAG"-arm64-v8a.apk
mv app-embedded-armeabi-v7a-release.apk clawdroid-"$RELEASE_TAG"-armeabi-v7a.apk
mv app-embedded-x86_64-release.apk clawdroid-"$RELEASE_TAG"-x86_64.apk
mv app-embedded-universal-release.apk clawdroid-"$RELEASE_TAG"-universal.apk
mv app-embedded-direct-arm64-v8a-release.apk clawdroid-"$RELEASE_TAG"-arm64-v8a.apk
mv app-embedded-direct-armeabi-v7a-release.apk clawdroid-"$RELEASE_TAG"-armeabi-v7a.apk
mv app-embedded-direct-x86_64-release.apk clawdroid-"$RELEASE_TAG"-x86_64.apk
mv app-embedded-direct-universal-release.apk clawdroid-"$RELEASE_TAG"-universal.apk
gh release upload "$RELEASE_TAG" \
clawdroid-"$RELEASE_TAG"-arm64-v8a.apk \
clawdroid-"$RELEASE_TAG"-armeabi-v7a.apk \
clawdroid-"$RELEASE_TAG"-x86_64.apk \
clawdroid-"$RELEASE_TAG"-universal.apk

build-android-embedded-googleplay:
name: Android Embedded Google Play AAB
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout tag
uses: actions/checkout@v4
with:
ref: ${{ github.event.release.tag_name }}

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod

- name: Build Go binaries for Android
run: make build-android

- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Decode keystore
env:
KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
working-directory: android
run: echo "$KEYSTORE_BASE64" | base64 -d > release.keystore

- name: Create keystore.properties
env:
STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
working-directory: android
run: |
printf 'storeFile=release.keystore\nstorePassword=%s\nkeyAlias=%s\nkeyPassword=%s\n' \
"$STORE_PASSWORD" "$KEY_ALIAS" "$KEY_PASSWORD" > keystore.properties

- name: Build release AAB
working-directory: android
run: ./gradlew bundleEmbeddedGoogleplayRelease

- name: Upload AAB to release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
working-directory: android/app/build/outputs/bundle/embeddedRelease
working-directory: android/app/build/outputs/bundle/embeddedGoogleplayRelease
run: |
mv app-embedded-release.aab clawdroid-"$RELEASE_TAG".aab
mv app-embedded-googleplay-release.aab clawdroid-"$RELEASE_TAG".aab
gh release upload "$RELEASE_TAG" clawdroid-"$RELEASE_TAG".aab
Loading
Loading