Skip to content
Open
Show file tree
Hide file tree
Changes from 41 commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
a748188
Bind XCM evidence to Android release commit
takemiyamakoto Jul 2, 2026
b54b109
Stabilize runtime reconstruction test
takemiyamakoto Jul 2, 2026
f072baf
fix: default fearless utils composites to library only
takemiyamakoto Jul 26, 2026
38fb2f3
fix: subscribe to runtime sync before initialization
takemiyamakoto Jul 26, 2026
3d777a2
fix: preserve wallets across Android migrations
takemiyamakoto Jul 30, 2026
d3636b6
fix: harden wallet migration recovery
takemiyamakoto Jul 30, 2026
eb55de9
ci: isolate Internal App Sharing handoff
takemiyamakoto Jul 30, 2026
9666edd
docs: bind migration and IAS release gates
takemiyamakoto Jul 30, 2026
1b38215
ci: harden Gradle coverage cleanup
takemiyamakoto Jul 30, 2026
a34c79b
fix: clean generated coverage before IAS source checks
takemiyamakoto Jul 30, 2026
921da5f
ci: normalize IAS signer certificate export
takemiyamakoto Jul 30, 2026
b3e924b
fix(android): harden WalletConnect startup and IAS qualification
takemiyamakoto Jul 30, 2026
c2bd3b5
fix(android): harden IAS isolation and deferred registration
takemiyamakoto Jul 30, 2026
5d0b3c7
test(android): harden IAS read-only race fixtures
takemiyamakoto Jul 30, 2026
a00e9e1
fix(ci): replace blocked Android emulator action
takemiyamakoto Jul 30, 2026
f8c13d8
fix(ci): harden first-party emulator setup
takemiyamakoto Jul 30, 2026
4a1e69d
fix(build): verify cold dependency metadata
takemiyamakoto Jul 30, 2026
ca85460
fix(ci): install emulator runtime libraries
takemiyamakoto Jul 30, 2026
b032eae
fix(ci): inspect emulator backend with SDK libraries
takemiyamakoto Jul 30, 2026
dbca43c
test(runtime): make cache-miss verification deterministic
takemiyamakoto Jul 30, 2026
7f6cbc0
build: trust JUnit BOM module metadata
takemiyamakoto Jul 30, 2026
cbb9f34
ci: stage portable Android migration evidence
takemiyamakoto Jul 30, 2026
bcce813
docs: document portable migration evidence
takemiyamakoto Jul 30, 2026
6d19fac
ci: distinguish minified AAB metadata policy
takemiyamakoto Jul 30, 2026
f897c23
test: cover AAB synthesis boundaries
takemiyamakoto Jul 30, 2026
94b7a36
fix(android): consolidate migration-safe production release
takemiyamakoto Jul 31, 2026
7f3745c
fix(android): restore migration instrumentation source
takemiyamakoto Jul 31, 2026
9f5fd7e
fix(android): accept released migration cohorts safely
takemiyamakoto Jul 31, 2026
f523247
ci(android): reconcile frozen release evidence controls
takemiyamakoto Aug 1, 2026
0673f02
feat(android): integrate production readiness candidate
takemiyamakoto Sep 23, 2026
7398b61
docs(android): align release handoff with pinned Utils source
takemiyamakoto Sep 23, 2026
401d678
fix(ci): reconcile guarded release checkout inventory
takemiyamakoto Sep 23, 2026
20c0ac2
fix(ci): scope dependency audits and require mutation module tests
takemiyamakoto Sep 23, 2026
2bf8236
Restore Android static analysis and preflight IAS Git inputs
takemiyamakoto Sep 23, 2026
27d0379
Sanitize native passkey PRF results and serialize Iroha bridge audit
takemiyamakoto Sep 23, 2026
1a02c87
Guard local passkey PRF result from reflection serialization
takemiyamakoto Sep 23, 2026
0986721
fix(android): scope balanced line break lint compatibility
takemiyamakoto Sep 23, 2026
2a23224
Bind Android Drive backup operations to selected account and complete…
takemiyamakoto Sep 23, 2026
e119f19
Add disabled cross-platform passkey backup key wrapper primitive
takemiyamakoto Sep 23, 2026
0052fbe
Serialize passkey key wrappers and fix Android analysis
takemiyamakoto Sep 23, 2026
8ca7af2
Pin passkey HKDF exception in MoonPay secret audit
takemiyamakoto Sep 23, 2026
53d03b8
Add bounded WebAuthn PRF request options for portable backup
takemiyamakoto Sep 23, 2026
b322702
Bind local passkey PRF result to canonical credential identity
takemiyamakoto Sep 23, 2026
a8f2164
fix(backup): bind Drive requests to verified Google subject
takemiyamakoto Sep 23, 2026
8289942
feat(backup): add immutable Drive generation primitives
takemiyamakoto Sep 23, 2026
28562e0
feat(backup): require durable generation journal before upload
takemiyamakoto Sep 23, 2026
4c0d21c
Verify Drive account before Android upload admission
takemiyamakoto Sep 23, 2026
b93ce04
Verify journaled Drive generations before local recovery evidence
takemiyamakoto Sep 23, 2026
97bf278
Wait for emulator process-group isolation in CI
takemiyamakoto Sep 23, 2026
774ea1e
Accept consolidated worktrees in Android private overlay audit
takemiyamakoto Sep 23, 2026
62a6e57
Isolate private overlay Git inspection from ambient overrides
takemiyamakoto Sep 23, 2026
84c1d31
Correct Android migration gate count in release notes
takemiyamakoto Sep 23, 2026
8f9e2bd
Bind Android PRF assertions to credential-directed challenges
takemiyamakoto Sep 23, 2026
36a8c25
fix(android): satisfy passkey recovery static analysis
takemiyamakoto Sep 23, 2026
ea271c8
fix(android): bind unverified passkey rollback confirmation
takemiyamakoto Sep 23, 2026
94d994b
Block legacy Drive backup replacement
takemiyamakoto Sep 23, 2026
a102e48
fix: verify Android passkey backup after Drive upload
takemiyamakoto Sep 23, 2026
b323863
Bind Android backup restore reads to authenticated owner head
takemiyamakoto Sep 23, 2026
64ce2dd
Verify passkey generation with local PRF and wallet evidence
takemiyamakoto Sep 23, 2026
2ae7fe4
Preserve independent EVM key in legacy Google backup restore
takemiyamakoto Sep 23, 2026
49f58b4
Add fail-closed Android wallet material preflight
takemiyamakoto Sep 23, 2026
b15644d
Reject inexact XCM amounts at final transfer boundary
takemiyamakoto Sep 23, 2026
d086e85
Validate XCM confirmation with exact transfer units
takemiyamakoto Sep 23, 2026
7fbee1d
Make XCM amount property exact at every call site
takemiyamakoto Sep 23, 2026
93b58fc
Remove resolved XCM TODO from debt baseline
takemiyamakoto Sep 23, 2026
c705fe7
feat: capture versioned Android wallet material draft
takemiyamakoto Sep 23, 2026
86b4989
Capture guarded Android V1 wallet material in portable draft
takemiyamakoto Sep 23, 2026
a790e91
Define bounded local wallet material envelope
takemiyamakoto Sep 23, 2026
4895a51
Hide XCM send action when submission is unauthorized
takemiyamakoto Sep 23, 2026
3c43d9b
Validate XCM origin fees against the exact utility asset
takemiyamakoto Sep 23, 2026
08ed3f0
Add candidate portable semantic wallet material codec
takemiyamakoto Sep 23, 2026
7f0a04a
Restrict portable TON material to released V4R2 contract
takemiyamakoto Sep 23, 2026
ca12af9
Project guarded Android drafts into portable wallet material
takemiyamakoto Sep 23, 2026
33aa779
Record forward-only Android wallet custody provenance for portable dr…
takemiyamakoto Sep 24, 2026
23dab91
Prove Android portable wallet root signing identities
takemiyamakoto Sep 24, 2026
b1ff709
Verify iOS Substrate root formats in Android portable proof
takemiyamakoto Sep 24, 2026
1bb014a
feat: retain blocked portable receive intents
takemiyamakoto Sep 24, 2026
29bbd53
Add guarded Android cohort after-image schema
takemiyamakoto Sep 24, 2026
38b3e0a
Align Android migration evidence gate with schema 78
takemiyamakoto Sep 24, 2026
a1e7546
Add fail-closed Android portable cohort journal staging
takemiyamakoto Sep 24, 2026
e035326
Prove Android V2 chain original keys before receive
takemiyamakoto Sep 24, 2026
4e812d5
test(android): align migration assertions with schema 78
takemiyamakoto Sep 24, 2026
df22529
Add read-only Asset Hub USDt XCM gap inventory
takemiyamakoto Sep 24, 2026
1f52285
fix: use portable grep in XCM discovery CI test
takemiyamakoto Sep 24, 2026
4455185
Migrate Android Etherscan history to V2 with safe retries
takemiyamakoto Sep 24, 2026
72a4991
Preserve independent Android history providers on known chains
takemiyamakoto Sep 24, 2026
bbd9f34
Normalize Android history hosts before chain binding
takemiyamakoto Sep 24, 2026
9180bc5
fix: preserve Android history errors and X Layer explorer routes
takemiyamakoto Sep 24, 2026
0cc6614
fix: migrate Kaia history to chain-bound KaiaScan OAPI
takemiyamakoto Sep 24, 2026
83cf8a5
feat: project portable wallet cohort storage intents
takemiyamakoto Sep 24, 2026
32a2cf5
feat: project fresh restore wallet positions
takemiyamakoto Sep 24, 2026
448017a
feat: stage Android portable cohorts with reserved IDs
takemiyamakoto Sep 24, 2026
5b326c6
feat: reserve portable receive wallet IDs in Room
takemiyamakoto Sep 24, 2026
215d5a6
Fence abandoned portable wallet reservations with Room tombstones
takemiyamakoto Sep 24, 2026
29c49af
Keep migration safety tests bound to current schema version
takemiyamakoto Sep 24, 2026
ab6fb58
feat: add guarded passkey generation readback
takemiyamakoto Sep 24, 2026
a1338aa
Add disabled Android Play Integrity bootstrap request binding
takemiyamakoto Sep 24, 2026
137046b
Consume Android recovery PRF only after verified assertion
takemiyamakoto Sep 24, 2026
d30e027
Bind Android restore reservations to portable wallet origins
takemiyamakoto Sep 24, 2026
4aeec85
feat: stage encrypted portable original-source sidecar
takemiyamakoto Sep 24, 2026
f38a572
feat: add disabled Android owner passkey authentication client
takemiyamakoto Sep 24, 2026
8dd0378
feat: add disabled authenticated backup head reader
takemiyamakoto Sep 24, 2026
41b4c91
Add disabled owner backup generation metadata client
takemiyamakoto Sep 24, 2026
726884c
Add disabled verified Android backup generation promotion
takemiyamakoto Sep 24, 2026
9cddc56
Update wallet migration instrumentation for schema 80
takemiyamakoto Sep 24, 2026
374da84
Add disabled Android first-owner bootstrap candidate
takemiyamakoto Sep 24, 2026
68a4c3f
Gate first Android backup PRF on verified owner assertion
takemiyamakoto Sep 24, 2026
3817366
Prepare verified first passkey backup generation
takemiyamakoto Sep 24, 2026
fb2600d
feat: verify exact Android V3 portable root sources
takemiyamakoto Sep 24, 2026
4aa2ab9
Add fail-closed historical Android source proof
takemiyamakoto Sep 24, 2026
d6efdde
Clarify Android historical proof coverage
takemiyamakoto Sep 24, 2026
92dae82
feat: prove mixed Android wallet source cohorts
takemiyamakoto Sep 24, 2026
d540071
feat: capture verified Android wallet source cohorts
takemiyamakoto Sep 24, 2026
a74da1e
fix: reject globally orphaned wallet secret namespaces
takemiyamakoto Sep 24, 2026
2587da9
Preserve Android wallet display metadata in portable capture
takemiyamakoto Sep 25, 2026
54bb334
feat: preserve Android asset presentation in portable export
takemiyamakoto Sep 25, 2026
6f502d5
fix: verify Android watch identities before portable export
takemiyamakoto Sep 25, 2026
1093b13
fix: validate incoming watch identities before cohort staging
takemiyamakoto Sep 25, 2026
da0331f
fix: verify iOS TON watch JSON with shared V4R2 proof
takemiyamakoto Sep 25, 2026
56ca84b
fix: require approved Substrate genesis for received watch chains
takemiyamakoto Sep 25, 2026
b970980
fix: bind staged recovery cohorts to receiving chain policy
takemiyamakoto Sep 25, 2026
5e8b36a
fix: simplify coroutine checks and erase undelivered plaintext
takemiyamakoto Sep 28, 2026
8b38ca5
fix: restore missing universal wallet accounts on Android
takemiyamakoto Oct 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .github/release/android-tag-signer-fingerprints.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Fail-closed production contract.
#
# Replace the line below, in a reviewed pull request, with the exact
# `ssh-keygen -l -E sha256` fingerprint authorized to sign Android release
# tags. Exactly one canonical SHA256 fingerprint is allowed. The matching
# one-line OpenSSH Ed25519 public key must be stored as one-line base64 in the
# ANDROID_RELEASE_TAG_SIGNER_PUBLIC_KEY_B64 GitHub Actions repository variable.
UNCONFIGURED_ANDROID_RELEASE_TAG_SIGNER_FINGERPRINT
225 changes: 203 additions & 22 deletions .github/workflows/android-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,26 @@ concurrency:

jobs:
build-and-test:
runs-on: ubuntu-latest
timeout-minutes: 45
runs-on: ubuntu-24.04
timeout-minutes: 90
env:
CI: true
FEARLESS_UTILS_COMMIT: 7500809f33243ee47ecb2ec8563fc284ac4de0d6
FEARLESS_UTILS_COMMIT: 1c80a2bf3fa1f996cf1328873e09f282ee29b69e
FEARLESS_UTILS_PATH: ${{ github.workspace }}/fearless-utils-Android
FORCE_LOCAL_UTILS: "true"
FEARLESS_UTILS_LIBRARY_ONLY: "true"
FEARLESS_NV_WEBSOCKET_COMMIT: 9714b30b6a16d40a2122765077bb71cf44314798
FEARLESS_NV_WEBSOCKET_PATH: ${{ github.workspace }}/fearless-nv-websocket-client
USE_REMOTE_UTILS: "false"
SHARED_FEATURES_VERSION_OVERRIDE: ""
BUNDLETOOL_VERSION: "1.18.3"
BUNDLETOOL_SHA256: a099cfa1543f55593bc2ed16a70a7c67fe54b1747bb7301f37fdfd6d91028e29
# Provide safe stubs to avoid repository/config failures during resolution
PAY_WINGS_REPOSITORY_URL: https://maven.google.com
PAY_WINGS_USERNAME: ""
PAY_WINGS_PASSWORD: ""
MOONPAY_TEST_SECRET: stub
MOONPAY_PRODUCTION_SECRET: stub
MOONPAY_TEST_PUBLIC_KEY: pk_test_ci_stub
MOONPAY_PRODUCTION_PUBLIC_KEY: pk_live_ci_stub
FL_BLAST_API_ETHEREUM_KEY: stub
FL_BLAST_API_BSC_KEY: stub
FL_BLAST_API_SEPOLIA_KEY: stub
Expand All @@ -41,20 +45,35 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 0
persist-credentials: false

- name: Checkout fearless-utils-Android
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
repository: soramitsu/fearless-utils-Android
ref: ${{ env.FEARLESS_UTILS_COMMIT }}
path: fearless-utils-Android
fetch-depth: 0
persist-credentials: false

- name: Checkout guarded WebSocket source
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
repository: soramitsu/fearless-nv-websocket-client
ref: 9714b30b6a16d40a2122765077bb71cf44314798
path: fearless-nv-websocket-client
fetch-depth: 0
persist-credentials: false

- name: Verify fearless-utils source
run: ./scripts/ensure-fearless-utils.sh
run: |
bash ./scripts/test-fearless-utils-derived-tree.sh
./scripts/ensure-fearless-utils.sh
python3 ./scripts/test-android-runtime-source-pins.py
./scripts/verify-android-runtime-sources.sh

- name: Public dependency upstream handoff
run: |
Expand All @@ -67,7 +86,35 @@ jobs:
bash ./scripts/test-branch-flow-audit.sh

- name: Public artifact audit
run: ./scripts/audit-public-artifacts.sh
run: |
bash ./scripts/test-public-artifact-provenance-audit.sh
./scripts/audit-public-artifacts.sh --strict-provenance

- name: Google Play Internal App Sharing publication evidence
run: |
node ./scripts/test-google-play-internal-app-sharing-handoff-writer.js
bash ./scripts/test-google-play-internal-app-sharing-publication-audit.sh
bash ./scripts/audit-google-play-internal-app-sharing-publication.sh --manifest-only

- name: Android Play release guard contracts
run: |
bash ./scripts/test-android-release-signed-tag-policy.sh
bash ./scripts/test-android-release-governance.sh
bash ./scripts/test-android-play-release-guards.sh
bash ./scripts/test-android-release-build-log.sh
bash ./scripts/test-android-release-sdk.sh
bash ./scripts/test-android-migration-ci-gate.sh
bash ./scripts/test-android-migration-instrumentation-results.sh
python3 ./scripts/test-android-migration-evidence-packaging.py
bash ./scripts/test-android-aab-native-page-alignment.sh
IAS_GRADLE_CONTRACT_ONLY=true \
bash ./scripts/test-android-internal-app-sharing.sh
bash ./scripts/test-release-overlay-interruption.sh
bash ./scripts/test-android-release-media-permissions.sh
bash ./scripts/test-android-moonpay-client-secret-policy.sh
bash ./scripts/verify-android-moonpay-client-secret-policy.sh
bash ./scripts/verify-android-release-media-permissions.sh \
app/src/main/AndroidManifest.xml

- name: TODO debt audit
run: |
Expand All @@ -81,22 +128,34 @@ jobs:
--write-gap-report build/reports/xcm-registry-gap-report.json \
--require-route-file scripts/xcm-required-routes.tsv \
--require-gap-file scripts/xcm-discovery-only-routes.tsv
bash ./scripts/test-xcm-effective-registry-audit.sh
bash ./scripts/audit-xcm-effective-registry.sh \
--write-report build/reports/xcm-effective-registry-report.json
bash ./scripts/test-xcm-production-evidence-template.sh
bash ./scripts/test-xcm-production-evidence-audit.sh
bash ./scripts/audit-xcm-production-evidence.sh

- name: Upload XCM registry gap report
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: xcm-registry-gap-report
path: build/reports/xcm-registry-gap-report.json
if-no-files-found: ignore
retention-days: 14

- name: Upload XCM effective registry report
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: xcm-effective-registry-report
path: build/reports/xcm-effective-registry-report.json
if-no-files-found: ignore
retention-days: 14

- name: Upload public dependency handoff
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: public-dependency-upstream-delta
path: build/reports/public-dependency-upstream-delta
Expand All @@ -109,6 +168,8 @@ jobs:
IROHA_MOBILE_SDK_RELEASE_TAG: ${{ vars.IROHA_MOBILE_SDK_RELEASE_TAG }}
IROHA_MOBILE_SDK_RELEASE_REPO: ${{ vars.IROHA_MOBILE_SDK_RELEASE_REPO }}
run: |
bash ./scripts/test-iroha-production-send-readiness-audit.sh
bash ./scripts/audit-iroha-production-send-readiness.sh
bash ./scripts/check-iroha-mobile-sdk-release-assets.sh --self-test
if [[ -n "${IROHA_MOBILE_SDK_RELEASE_TAG:-}" ]]; then
bash ./scripts/check-iroha-mobile-sdk-release-assets.sh --download --tag "$IROHA_MOBILE_SDK_RELEASE_TAG"
Expand All @@ -119,12 +180,42 @@ jobs:
- name: Private overlay audit self-test
run: bash ./scripts/test-private-overlay-boundary.sh

- name: Unit test task membership audit
run: |
bash ./scripts/test-unit-test-task-membership-audit.sh
bash ./scripts/audit-unit-test-task-membership.sh

- name: Setup Java 21 (Temurin)
uses: actions/setup-java@v4
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4
with:
distribution: temurin
java-version: '21'

- name: Install Android emulator runtime libraries
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install --yes --no-install-recommends libpulse0
runtime_libraries="$(ldconfig -p)"
[[ "$(grep -Fc 'libpulse.so.0' <<<"$runtime_libraries")" -ge 1 ]]
unset runtime_libraries

- name: Install checksum-pinned bundletool
run: |
set -euo pipefail
bundletool_jar="$RUNNER_TEMP/bundletool-all-$BUNDLETOOL_VERSION.jar"
curl --fail --location --silent --show-error \
--retry 3 \
--output "$bundletool_jar" \
"https://github.com/google/bundletool/releases/download/$BUNDLETOOL_VERSION/bundletool-all-$BUNDLETOOL_VERSION.jar"
actual_sha256="$(sha256sum "$bundletool_jar" | awk '{print $1}')"
[[ "$actual_sha256" == "$BUNDLETOOL_SHA256" ]] || {
echo "bundletool checksum mismatch" >&2
exit 1
}
chmod 0444 "$bundletool_jar"
echo "BUNDLETOOL_JAR=$bundletool_jar" >> "$GITHUB_ENV"

- name: Setup Android SDK
run: |
set -euo pipefail
Expand All @@ -133,7 +224,10 @@ jobs:
echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> "$GITHUB_ENV"
echo "ANDROID_HOME=$ANDROID_HOME" >> "$GITHUB_ENV"

sdkmanager_bin="$(command -v sdkmanager || true)"
sdkmanager_bin=""
if command -v sdkmanager >/dev/null 2>&1; then
sdkmanager_bin="$(command -v sdkmanager)"
fi
if [[ -z "$sdkmanager_bin" ]]; then
for candidate in \
"$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" \
Expand All @@ -149,20 +243,45 @@ jobs:
echo "sdkmanager not found under ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >&2
exit 1
fi
sdkmanager_bin="$(realpath "$sdkmanager_bin")"
avdmanager_bin="$(realpath "$(dirname "$sdkmanager_bin")/avdmanager")"
case "$sdkmanager_bin:$avdmanager_bin" in
"$ANDROID_SDK_ROOT"/*:"$ANDROID_SDK_ROOT"/*) ;;
*)
echo "Android command-line tools escaped ANDROID_SDK_ROOT" >&2
exit 1
;;
esac
[[ -x "$sdkmanager_bin" && -x "$avdmanager_bin" ]] || {
echo "sdkmanager/avdmanager are not executable" >&2
exit 1
}
{
echo "SDKMANAGER_BIN=$sdkmanager_bin"
echo "AVDMANAGER_BIN=$avdmanager_bin"
} >> "$GITHUB_ENV"

yes | "$sdkmanager_bin" --licenses >/dev/null || true
license_answers="$(printf 'y\n%.0s' {1..256})"
[[ "$(grep -c '^y$' <<<"$license_answers")" == "256" ]]
"$sdkmanager_bin" --sdk_root="$ANDROID_SDK_ROOT" \
--licenses >/dev/null <<<"$license_answers"
unset license_answers
"$sdkmanager_bin" --install \
--sdk_root="$ANDROID_SDK_ROOT" \
"platforms;android-36" \
"build-tools;36.0.0" \
"platform-tools" \
"emulator" \
"ndk;28.0.12674087" \
"ndk;25.2.9519653"

- name: Export NDK environment
run: |
echo "ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/28.0.12674087" >> $GITHUB_ENV
echo "ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/28.0.12674087" >> $GITHUB_ENV
echo "NDK_HOME=$ANDROID_SDK_ROOT/ndk/28.0.12674087" >> $GITHUB_ENV
{
echo "ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/28.0.12674087"
echo "ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/28.0.12674087"
echo "NDK_HOME=$ANDROID_SDK_ROOT/ndk/28.0.12674087"
} >> "$GITHUB_ENV"

- name: NDK revision
run: |
Expand All @@ -184,6 +303,9 @@ jobs:
- name: Gradle version
run: ./gradlew --version --no-daemon --console=plain --stacktrace

- name: Fearless-utils composite defaults
run: ./scripts/test-fearless-utils-composite-default.sh

- name: Polkadot SDK alignment
run: ./gradlew printPolkadotSdkAlignment --no-daemon --console=plain --stacktrace

Expand All @@ -193,18 +315,77 @@ jobs:
- name: Unit tests + coverage
run: ./gradlew runTest --no-daemon --console=plain --stacktrace

- name: Staged Iroha core bridge
run: bash ./scripts/verify-staged-iroha-core-bridge.sh --download

- name: Android Lint (app)
run: ./gradlew :app:lint --no-daemon --console=plain --stacktrace

- name: Android 11 migration and restart compatibility
run: bash ./scripts/run-android-emulator-ci.sh 30 compatibility

- name: Android 12 migration and restart compatibility
run: bash ./scripts/run-android-emulator-ci.sh 31 compatibility

- name: Android 16 migration and restart compatibility
run: bash ./scripts/run-android-emulator-ci.sh 36 compatibility

- name: Wallet migration and startup instrumentation
run: bash ./scripts/run-android-emulator-ci.sh 34 full

- name: Verify migration instrumentation results
if: always()
run: bash ./scripts/verify-android-migration-instrumentation-results.sh

- name: Prepare portable migration instrumentation evidence
id: prepare_migration_evidence
if: always()
run: python3 ./scripts/prepare-android-migration-evidence.py

- name: Upload migration instrumentation evidence
if: ${{ always() && steps.prepare_migration_evidence.outcome == 'success' }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: android-migration-instrumentation-${{ github.sha }}
path: build/reports/android-migration-upload/**
if-no-files-found: error
retention-days: 14

- name: Gradle/AGP versions
run: |
echo "== Gradle =="
./gradlew --version --no-daemon --console=plain || true
echo "\n== Android Gradle Plugin (declared) =="
printf '\n== Android Gradle Plugin (declared) ==\n'
grep -E '^android_plugin\s*=\s*"[0-9]+' gradle/libs.versions.toml || true

- name: Assemble debug to produce native libs
run: ./gradlew :app:assembleDebug --no-daemon --console=plain --stacktrace
- name: Assemble APK and AAB debug artifacts
run: |
./gradlew \
:app:assembleDebug \
:app:bundleDebug \
--no-daemon \
--console=plain \
--stacktrace

- name: Verify source-bound complete AAB native payload
env:
AAB_IDENTITY_FIXTURE: ${{ github.workspace }}/app/build/outputs/bundle/debug/app-debug.aab
EXPECTED_AAB_SOURCE_COMMIT: development
AAB_IDENTITY_R8_POLICY: absent
run: |
set -euo pipefail
EXPECTED_AAB_PACKAGE=jp.co.soramitsu.fearless.debug \
EXPECTED_AAB_VERSION_NAME="$(
awk -F= '$1 == "versionName" { print $2 "-debug" }' \
versioning/version.properties
)" \
EXPECTED_AAB_VERSION_CODE="$(
awk -F= '$1 == "versionCode" { print $2 }' \
versioning/version.properties
)" \
bash ./scripts/test-android-aab-identity.sh
python3 ./scripts/verify-android-aab-native-page-alignment.py \
"$AAB_IDENTITY_FIXTURE"

- name: readelf sanity (native libs)
run: |
Expand All @@ -214,8 +395,8 @@ jobs:
set +e
echo "== Scanning native libraries (.so) =="
mapfile -t sos < <(find app/build -type f -name "*.so" | head -n 10)
if [ ${#sos[@]} -eq 0 ]; then echo "No native libs found under app/build"; exit 0; fi
if [ "${#sos[@]}" -eq 0 ]; then echo "No native libs found under app/build"; exit 0; fi
for so in "${sos[@]}"; do
echo "\n-- $so --"
printf '\n-- %s --\n' "$so"
readelf -l "$so" | sed -n '1,120p' || true
done
Loading
Loading