Skip to content

Commit 37c0edd

Browse files
committed
Harden framework readiness and Gradle ID alignment
1 parent f2356e4 commit 37c0edd

File tree

1 file changed

+54
-64
lines changed

1 file changed

+54
-64
lines changed

scripts/build-android-app.sh

Lines changed: 54 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -514,34 +514,34 @@ def ensure_application_id(source: str) -> str:
514514
def ensure_compile_sdk(source: str) -> str:
515515
pattern = re.compile(r"\bcompileSdk(?:Version)?\s+(\d+)")
516516
match = pattern.search(source)
517-
desired = "compileSdkVersion 35"
517+
desired = "compileSdk 35"
518518
if match:
519519
start, end = match.span()
520-
current = match.group(0)
521-
if current != desired:
520+
if match.group(0) != desired:
522521
source = source[:start] + desired + source[end:]
523-
messages.append("Updated compileSdkVersion to 35")
522+
messages.append("Updated compileSdk to 35")
524523
return source
525524
android_match = re.search(r"android\s*\{", source)
526525
if not android_match:
527-
raise SystemExit("Unable to locate android block when inserting compileSdkVersion")
526+
raise SystemExit("Unable to locate android block when inserting compileSdk")
528527
insert = android_match.end()
529528
source = source[:insert] + f"\n {desired}" + source[insert:]
530-
messages.append("Inserted compileSdkVersion 35")
529+
messages.append("Inserted compileSdk 35")
531530
return source
532531
533-
def ensure_default_config_value(source: str, key: str, value: str) -> str:
534-
pattern = re.compile(rf"{key}\s+[\"']?([^\"'\s]+)[\"']?")
532+
def ensure_default_config_value(source: str, key: str, value: str, *, quoted: bool = False) -> str:
533+
pattern = re.compile(rf"{key}(?:Version)?\s+[\"']?([^\"'\s]+)[\"']?")
535534
default_match = re.search(r"defaultConfig\s*\{", source)
536535
if not default_match:
537536
raise SystemExit(f"Unable to locate defaultConfig when inserting {key}")
538537
block_start = default_match.end()
539538
block_end = _find_matching_brace(source, default_match.start())
540539
block = source[block_start:block_end]
541540
match = pattern.search(block)
542-
replacement = f" {key} {value}"
541+
replacement_value = f'"{value}"' if quoted else value
542+
replacement = f" {key} {replacement_value}"
543543
if match:
544-
if match.group(1) != value:
544+
if match.group(1) != value or "Version" in match.group(0):
545545
start = block_start + match.start()
546546
end = block_start + match.end()
547547
source = source[:start] + replacement + source[end:]
@@ -593,8 +593,10 @@ text = ensure_namespace(text)
593593
text = ensure_default_config(text)
594594
text = ensure_application_id(text)
595595
text = ensure_compile_sdk(text)
596-
text = ensure_default_config_value(text, "minSdkVersion", "19")
597-
text = ensure_default_config_value(text, "targetSdkVersion", "35")
596+
text = ensure_default_config_value(text, "minSdk", "19")
597+
text = ensure_default_config_value(text, "targetSdk", "35")
598+
text = ensure_default_config_value(text, "versionCode", "100")
599+
text = ensure_default_config_value(text, "versionName", "1.0", quoted=True)
598600
text = ensure_test_instrumentation_runner(text)
599601
600602
if text != original:
@@ -918,37 +920,45 @@ wait_for_api_level() {
918920
return 1
919921
}
920922

921-
framework_try_ready() {
923+
adb_framework_ready_once() {
922924
local serial="$1"
923925
local per_try="$2"
924-
local phase_timeout="${FRAMEWORK_READY_PHASE_TIMEOUT_SECONDS:-180}"
926+
local phase_timeout="$3"
925927
local log_interval="${FRAMEWORK_READY_STATUS_LOG_INTERVAL_SECONDS:-10}"
926928

927929
if ! [[ "$phase_timeout" =~ ^[0-9]+$ ]] || [ "$phase_timeout" -le 0 ]; then
928930
phase_timeout=180
929931
fi
932+
if ! [[ "$per_try" =~ ^[0-9]+$ ]] || [ "$per_try" -le 0 ]; then
933+
per_try=5
934+
fi
930935
if ! [[ "$log_interval" =~ ^[0-9]+$ ]] || [ "$log_interval" -le 0 ]; then
931936
log_interval=10
932937
fi
933938

934939
local deadline=$((SECONDS + phase_timeout))
935940
local last_log=$SECONDS
936-
local boot_ok="" ce_ok=""
937941

938942
while [ $SECONDS -lt $deadline ]; do
939-
boot_ok=""
940-
ce_ok=""
941-
if run_with_timeout "$per_try" "$ADB_BIN" -s "$serial" shell pidof system_server >/dev/null 2>&1; then
942-
boot_ok="$($ADB_BIN -s "$serial" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')"
943-
ce_ok="$($ADB_BIN -s "$serial" shell getprop sys.user.0.ce_available 2>/dev/null | tr -d '\r')"
944-
if run_with_timeout "$per_try" "$ADB_BIN" -s "$serial" shell pm path android >/dev/null 2>&1 \
945-
&& run_with_timeout "$per_try" "$ADB_BIN" -s "$serial" shell cmd activity get-standby-bucket >/dev/null 2>&1; then
946-
return 0
947-
fi
943+
local boot_ok system_pid pm_ok activity_ok
944+
boot_ok="$($ADB_BIN -s "$serial" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')"
945+
system_pid="$(run_with_timeout "$per_try" "$ADB_BIN" -s "$serial" shell pidof system_server 2>/dev/null | tr -d '\r' || true)"
946+
pm_ok=0
947+
activity_ok=0
948+
if run_with_timeout "$per_try" "$ADB_BIN" -s "$serial" shell pm path android >/dev/null 2>&1; then
949+
pm_ok=1
950+
fi
951+
if run_with_timeout "$per_try" "$ADB_BIN" -s "$serial" shell cmd activity get-standby-bucket >/dev/null 2>&1; then
952+
activity_ok=1
953+
fi
954+
955+
if [ "$boot_ok" = "1" ] && [ -n "$system_pid" ] && [ $pm_ok -eq 1 ] && [ $activity_ok -eq 1 ]; then
956+
ba_log "Android framework ready on $serial (system_server=$system_pid)"
957+
return 0
948958
fi
949959

950960
if [ $((SECONDS - last_log)) -ge $log_interval ]; then
951-
ba_log "Waiting for Android framework on $serial (system_server=$([ -n "$boot_ok" ] && echo up || echo down) boot_ok=${boot_ok:-?} ce_ok=${ce_ok:-?})"
961+
ba_log "Waiting for Android framework on $serial (system_server=${system_pid:-down} boot_ok=${boot_ok:-?} pm_ready=$pm_ok activity_ready=$activity_ok)"
952962
last_log=$SECONDS
953963
fi
954964
sleep 2
@@ -957,33 +967,30 @@ framework_try_ready() {
957967
return 1
958968
}
959969

960-
ensure_framework_ready() {
970+
adb_wait_framework_ready() {
961971
local serial="$1"
962972
"$ADB_BIN" -s "$serial" wait-for-device >/dev/null 2>&1 || return 1
963973

964974
local per_try="${FRAMEWORK_READY_PER_TRY_TIMEOUT_SECONDS:-5}"
965-
if ! [[ "$per_try" =~ ^[0-9]+$ ]] || [ "$per_try" -le 0 ]; then
966-
per_try=5
967-
fi
968975

969-
if framework_try_ready "$serial" "$per_try"; then
976+
if adb_framework_ready_once "$serial" "$per_try" "${FRAMEWORK_READY_PRIMARY_TIMEOUT_SECONDS:-180}"; then
970977
return 0
971978
fi
972979

973-
ba_log "Framework not ready on $serial. Attempting framework restart (stop/start)…"
980+
ba_log "Framework not ready on $serial; restarting system services"
974981
"$ADB_BIN" -s "$serial" shell stop >/dev/null 2>&1 || true
975982
sleep 2
976983
"$ADB_BIN" -s "$serial" shell start >/dev/null 2>&1 || true
977984

978-
if framework_try_ready "$serial" "$per_try"; then
985+
if adb_framework_ready_once "$serial" "$per_try" "${FRAMEWORK_READY_RESTART_TIMEOUT_SECONDS:-120}"; then
979986
return 0
980987
fi
981988

982-
ba_log "Framework still unavailable on $serial. Rebooting device"
989+
ba_log "Framework still unavailable on $serial; rebooting device"
983990
"$ADB_BIN" -s "$serial" reboot >/dev/null 2>&1 || return 1
984991
"$ADB_BIN" -s "$serial" wait-for-device >/dev/null 2>&1 || return 1
985992

986-
if framework_try_ready "$serial" "$per_try"; then
993+
if adb_framework_ready_once "$serial" "$per_try" "${FRAMEWORK_READY_REBOOT_TIMEOUT_SECONDS:-180}"; then
987994
return 0
988995
fi
989996

@@ -1196,7 +1203,7 @@ if ! "$ADB_BIN" -s "$EMULATOR_SERIAL" shell pidof system_server >/dev/null 2>&1;
11961203
"$ADB_BIN" -s "$EMULATOR_SERIAL" shell start >/dev/null 2>&1 || true
11971204
fi
11981205

1199-
if ! ensure_framework_ready "$EMULATOR_SERIAL"; then
1206+
if ! adb_wait_framework_ready "$EMULATOR_SERIAL"; then
12001207
dump_emulator_diagnostics
12011208
stop_emulator
12021209
exit 1
@@ -1283,7 +1290,7 @@ adb_install_file_path() {
12831290
local serial="$1" apk="$2"
12841291
local remote_tmp="/data/local/tmp/$(basename "$apk")"
12851292

1286-
if ! ensure_framework_ready "$serial"; then
1293+
if ! adb_wait_framework_ready "$serial"; then
12871294
return 1
12881295
fi
12891296

@@ -1323,32 +1330,15 @@ fi
13231330
APP_ID="$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^applicationId:/{print $2; found=1} END{if(!found) print ""}' || true)"
13241331
NS_VALUE="$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^namespace:/{print $2; found=1} END{if(!found) print ""}' || true)"
13251332

1326-
if [ -z "$APP_ID" ] || [ "$APP_ID" != "$PACKAGE_NAME" ] || [ -z "$NS_VALUE" ] || [ "$NS_VALUE" != "$PACKAGE_NAME" ]; then
1327-
ba_log "applicationId/namespace mismatch (applicationId='${APP_ID:-<unset>}' namespace='${NS_VALUE:-<unset>}'), patching"
1328-
if ! GRADLE_PACKAGE_LOG=$(ensure_gradle_package_config); then
1329-
ba_log "Failed to align namespace/applicationId with Codename One package" >&2
1330-
stop_emulator
1331-
exit 1
1332-
fi
1333-
if [ -n "$GRADLE_PACKAGE_LOG" ]; then
1334-
while IFS= read -r line; do
1335-
[ -n "$line" ] && ba_log "$line"
1336-
done <<<"$GRADLE_PACKAGE_LOG"
1337-
fi
1338-
APP_PROPERTIES_RAW=$(cd "$GRADLE_PROJECT_DIR" && ./gradlew -q :app:properties 2>/dev/null || true)
1339-
if [ -n "$APP_PROPERTIES_RAW" ]; then
1340-
set +o pipefail
1341-
MATCHED_PROPS=$(printf '%s\n' "$APP_PROPERTIES_RAW" | grep -E '^(applicationId|testApplicationId|namespace):' || true)
1342-
set -o pipefail
1343-
if [ -n "$MATCHED_PROPS" ]; then
1344-
printf '%s\n' "$MATCHED_PROPS" | sed 's/^/[build-android-app] props: /'
1345-
fi
1346-
fi
1347-
APP_ID="$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^applicationId:/{print $2; found=1} END{if(!found) print ""}' || true)"
1348-
NS_VALUE="$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^namespace:/{print $2; found=1} END{if(!found) print ""}' || true)"
1349-
if [ -z "$APP_ID" ] || [ "$APP_ID" != "$PACKAGE_NAME" ] || [ -z "$NS_VALUE" ] || [ "$NS_VALUE" != "$PACKAGE_NAME" ]; then
1350-
ba_log "WARNING: applicationId/namespace remain misaligned (applicationId='${APP_ID:-<unset>}' namespace='${NS_VALUE:-<unset>}'); continuing with APK inspection" >&2
1351-
fi
1333+
if [ -z "$APP_ID" ]; then
1334+
ba_log "Gradle did not report applicationId; relying on APK metadata"
1335+
elif [ "$APP_ID" != "$PACKAGE_NAME" ]; then
1336+
ba_log "WARNING: Gradle applicationId '$APP_ID' differs from Codename One package '$PACKAGE_NAME'" >&2
1337+
fi
1338+
if [ -z "$NS_VALUE" ]; then
1339+
ba_log "Gradle did not report namespace; relying on APK metadata"
1340+
elif [ "$NS_VALUE" != "$PACKAGE_NAME" ]; then
1341+
ba_log "WARNING: Gradle namespace '$NS_VALUE' differs from Codename One package '$PACKAGE_NAME'" >&2
13521342
fi
13531343

13541344
MERGED_MANIFEST="$APP_MODULE_DIR/build/intermediates/packaged_manifests/debug/AndroidManifest.xml"
@@ -1413,7 +1403,7 @@ TEST_RUNTIME_PACKAGE="${RUNTIME_PACKAGE}.test"
14131403
RUNTIME_STUB_FQCN="${RUNTIME_PACKAGE}.${MAIN_NAME}Stub"
14141404

14151405
ba_log "Preparing device for APK installation"
1416-
if ! ensure_framework_ready "$EMULATOR_SERIAL"; then
1406+
if ! adb_wait_framework_ready "$EMULATOR_SERIAL"; then
14171407
dump_emulator_diagnostics
14181408
stop_emulator
14191409
exit 1
@@ -1448,7 +1438,7 @@ if ! adb_install_file_path "$EMULATOR_SERIAL" "$TEST_APK"; then
14481438
exit 1
14491439
fi
14501440

1451-
if ! ensure_framework_ready "$EMULATOR_SERIAL"; then
1441+
if ! adb_wait_framework_ready "$EMULATOR_SERIAL"; then
14521442
dump_emulator_diagnostics
14531443
stop_emulator
14541444
exit 1

0 commit comments

Comments
 (0)