@@ -514,34 +514,34 @@ def ensure_application_id(source: str) -> str:
514514def 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)
593593text = ensure_default_config(text)
594594text = ensure_application_id(text)
595595text = 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)
598600text = ensure_test_instrumentation_runner(text)
599601
600602if 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
11971204fi
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
13231330APP_ID=" $( printf ' %s\n' " $APP_PROPERTIES_RAW " | awk -F' : ' ' /^applicationId:/{print $2; found=1} END{if(!found) print ""}' || true) "
13241331NS_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
13521342fi
13531343
13541344MERGED_MANIFEST=" $APP_MODULE_DIR /build/intermediates/packaged_manifests/debug/AndroidManifest.xml"
@@ -1413,7 +1403,7 @@ TEST_RUNTIME_PACKAGE="${RUNTIME_PACKAGE}.test"
14131403RUNTIME_STUB_FQCN=" ${RUNTIME_PACKAGE} .${MAIN_NAME} Stub"
14141404
14151405ba_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
14491439fi
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