Skip to content

Commit 4b33ab5

Browse files
committed
Align Gradle IDs and stub manifests before Android install
1 parent 22adfca commit 4b33ab5

File tree

1 file changed

+133
-85
lines changed

1 file changed

+133
-85
lines changed

scripts/build-android-app.sh

Lines changed: 133 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -483,63 +483,6 @@ fi
483483

484484
chmod +x "$GRADLE_PROJECT_DIR/gradlew"
485485

486-
ba_log "Inspecting Gradle application identifiers"
487-
if APP_PROPERTIES_RAW=$(cd "$GRADLE_PROJECT_DIR" && ./gradlew -q :app:properties 2>/dev/null); then
488-
printf '%s\n' "$APP_PROPERTIES_RAW" | grep -E '^(applicationId|testApplicationId|namespace):' | \
489-
sed 's/^/[build-android-app] props: /'
490-
APP_ID=$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^applicationId:/{print $2; exit}')
491-
NS_VALUE=$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^namespace:/{print $2; exit}')
492-
PROPS_MODIFIED=0
493-
if [ -n "$APP_ID" ] && [ "$APP_ID" != "$PACKAGE_NAME" ]; then
494-
ba_log "Patching applicationId -> $PACKAGE_NAME"
495-
awk -v appid="$PACKAGE_NAME" '
496-
BEGIN{inDc=0;done=0}
497-
/^\s*defaultConfig\s*\{/ {inDc=1}
498-
inDc && /^\s*applicationId\s+/ {print " applicationId \""appid"\""; done=1; next}
499-
inDc && /^\s*}/ {
500-
if(!done){print " applicationId \""appid"\""; done=1}
501-
inDc=0
502-
}
503-
{print}
504-
' "$APP_BUILD_GRADLE" > "$APP_BUILD_GRADLE.tmp" && mv "$APP_BUILD_GRADLE.tmp" "$APP_BUILD_GRADLE"
505-
PROPS_MODIFIED=1
506-
fi
507-
if [ -z "$NS_VALUE" ] || [ "$NS_VALUE" != "$PACKAGE_NAME" ]; then
508-
ba_log "Patching namespace -> $PACKAGE_NAME"
509-
awk -v ns="$PACKAGE_NAME" '
510-
BEGIN{inAndroid=0;done=0}
511-
/^android\s*\{/ {inAndroid=1}
512-
inAndroid && /^\s*namespace\s+/ {print " namespace \""ns"\""; done=1; next}
513-
inAndroid && /^\s*}/ {
514-
if(inAndroid && !done){print " namespace \""ns"\""; done=1}
515-
inAndroid=0
516-
}
517-
{print}
518-
' "$APP_BUILD_GRADLE" > "$APP_BUILD_GRADLE.tmp" && mv "$APP_BUILD_GRADLE.tmp" "$APP_BUILD_GRADLE"
519-
PROPS_MODIFIED=1
520-
fi
521-
if [ "$PROPS_MODIFIED" -eq 1 ]; then
522-
if APP_PROPERTIES_RAW=$(cd "$GRADLE_PROJECT_DIR" && ./gradlew -q :app:properties 2>/dev/null); then
523-
printf '%s\n' "$APP_PROPERTIES_RAW" | grep -E '^(applicationId|testApplicationId|namespace):' | \
524-
sed 's/^/[build-android-app] props (post-patch): /'
525-
else
526-
ba_log "Warning: unable to re-query :app:properties after patch" >&2
527-
fi
528-
fi
529-
APP_ID=$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^applicationId:/{print $2; exit}')
530-
NS_VALUE=$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^namespace:/{print $2; exit}')
531-
if [ -n "$APP_ID" ] && [ "$APP_ID" != "$PACKAGE_NAME" ]; then
532-
ba_log "ERROR: applicationId=$APP_ID does not match Codename One package $PACKAGE_NAME" >&2
533-
exit 1
534-
fi
535-
if [ -n "$NS_VALUE" ] && [ "$NS_VALUE" != "$PACKAGE_NAME" ]; then
536-
ba_log "ERROR: namespace=$NS_VALUE does not match Codename One package $PACKAGE_NAME" >&2
537-
exit 1
538-
fi
539-
else
540-
ba_log "Warning: unable to query :app:properties via Gradle" >&2
541-
fi
542-
543486
GRADLE_UPDATE_OUTPUT="$("$SCRIPT_DIR/update_android_ui_test_gradle.py" "$APP_BUILD_GRADLE")"
544487
if [ -n "$GRADLE_UPDATE_OUTPUT" ]; then
545488
while IFS= read -r line; do
@@ -1075,34 +1018,6 @@ if [ "$ASSEMBLE_EXIT_CODE" -ne 0 ]; then
10751018
exit 1
10761019
fi
10771020

1078-
APP_APK="$(find "$GRADLE_PROJECT_DIR/app/build/outputs/apk/debug" -maxdepth 1 -name '*-debug.apk' | head -n1 || true)"
1079-
TEST_APK="$(find "$GRADLE_PROJECT_DIR/app/build/outputs/apk/androidTest/debug" -maxdepth 1 -name '*-debug-androidTest.apk' | head -n1 || true)"
1080-
1081-
if [ -z "$APP_APK" ] || [ ! -f "$APP_APK" ]; then
1082-
ba_log "App APK not found after assemble tasks" >&2
1083-
stop_emulator
1084-
exit 1
1085-
fi
1086-
if [ -z "$TEST_APK" ] || [ ! -f "$TEST_APK" ]; then
1087-
ba_log "androidTest APK not found after assemble tasks" >&2
1088-
stop_emulator
1089-
exit 1
1090-
fi
1091-
1092-
MERGED_MANIFEST="$APP_MODULE_DIR/build/intermediates/packaged_manifests/debug/AndroidManifest.xml"
1093-
if [ -f "$MERGED_MANIFEST" ]; then
1094-
if grep -q "android:name=\"${PACKAGE_NAME//./\\.}.${MAIN_NAME}Stub\"" "$MERGED_MANIFEST"; then
1095-
grep -n "${PACKAGE_NAME//./\\.}.${MAIN_NAME}Stub" "$MERGED_MANIFEST" | sed 's/^/[build-android-app] merged-manifest: /' || true
1096-
else
1097-
ba_log "ERROR: merged manifest missing ${MAIN_NAME}Stub declaration"
1098-
sed -n '1,200p' "$MERGED_MANIFEST" | sed 's/^/[build-android-app] merged-manifest: /'
1099-
stop_emulator
1100-
exit 1
1101-
fi
1102-
else
1103-
ba_log "Merged manifest not found at $MERGED_MANIFEST"
1104-
fi
1105-
11061021
adb_install_retry() {
11071022
local serial="$1" apk="$2" tries=5
11081023
local attempt
@@ -1121,6 +1036,135 @@ adb_install_retry() {
11211036
return 1
11221037
}
11231038

1039+
ba_log "Inspecting Gradle application identifiers"
1040+
1041+
APP_PROPERTIES_RAW=$(cd "$GRADLE_PROJECT_DIR" && ./gradlew -q :app:properties 2>/dev/null || true)
1042+
if [ -n "$APP_PROPERTIES_RAW" ]; then
1043+
printf '%s\n' "$APP_PROPERTIES_RAW" | grep -E '^(applicationId|testApplicationId|namespace):' | sed 's/^/[build-android-app] props: /'
1044+
fi
1045+
1046+
APP_ID="$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^applicationId:/{print $2; exit}')"
1047+
NS_VALUE="$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^namespace:/{print $2; exit}')"
1048+
1049+
if [ -f "$APP_BUILD_GRADLE" ]; then
1050+
if [ -n "$APP_ID" ] && [ "$APP_ID" != "$PACKAGE_NAME" ]; then
1051+
ba_log "Patching applicationId -> $PACKAGE_NAME"
1052+
awk -v appid="$PACKAGE_NAME" '
1053+
BEGIN{inDc=0;had=0}
1054+
/^\s*defaultConfig\s*\{/ {inDc=1}
1055+
inDc && /^\s*applicationId\s+/ {printf " applicationId \"%s\"\n", appid; had=1; next}
1056+
inDc && /^\s*}/ {
1057+
if(!had){printf " applicationId \"%s\"\n", appid; had=1}
1058+
inDc=0
1059+
}
1060+
{print}
1061+
' "$APP_BUILD_GRADLE" >"$APP_BUILD_GRADLE.tmp" && mv "$APP_BUILD_GRADLE.tmp" "$APP_BUILD_GRADLE"
1062+
fi
1063+
1064+
if [ -z "$NS_VALUE" ] || [ "$NS_VALUE" != "$PACKAGE_NAME" ]; then
1065+
ba_log "Patching namespace -> $PACKAGE_NAME"
1066+
awk -v ns="$PACKAGE_NAME" '
1067+
BEGIN{inAndroid=0;had=0}
1068+
/^android\s*\{/ {inAndroid=1}
1069+
inAndroid && /^\s*namespace\s+/ {printf " namespace \"%s\"\n", ns; had=1; next}
1070+
inAndroid && /^\s*}/ {
1071+
if(inAndroid && !had){printf " namespace \"%s\"\n", ns; had=1}
1072+
inAndroid=0
1073+
}
1074+
{print}
1075+
' "$APP_BUILD_GRADLE" >"$APP_BUILD_GRADLE.tmp" && mv "$APP_BUILD_GRADLE.tmp" "$APP_BUILD_GRADLE"
1076+
fi
1077+
fi
1078+
1079+
SRC_SETS=(main debug release)
1080+
FQCN="${PACKAGE_NAME}.${MAIN_NAME}Stub"
1081+
for SS in "${SRC_SETS[@]}"; do
1082+
MANIFEST_PATH="$APP_MODULE_DIR/src/$SS/AndroidManifest.xml"
1083+
if [ ! -f "$MANIFEST_PATH" ]; then
1084+
mkdir -p "$(dirname "$MANIFEST_PATH")"
1085+
cat >"$MANIFEST_PATH" <<EOF
1086+
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="$PACKAGE_NAME">
1087+
<application/>
1088+
</manifest>
1089+
EOF
1090+
ba_log "Created $MANIFEST_PATH"
1091+
fi
1092+
1093+
grep -q '<application' "$MANIFEST_PATH" || sed -i 's#</manifest># <application/>\n</manifest>#' "$MANIFEST_PATH"
1094+
1095+
if grep -q '<manifest[^>]*package=' "$MANIFEST_PATH"; then
1096+
sed -i '0,/<manifest[^>]*package=/ s/package="[^"]*"/package="$PACKAGE_NAME"/' "$MANIFEST_PATH"
1097+
else
1098+
sed -i '0,/<manifest/ s#<manifest#<manifest package="$PACKAGE_NAME"#' "$MANIFEST_PATH"
1099+
fi
1100+
1101+
if ! grep -q "android:name=\"$FQCN\"" "$MANIFEST_PATH"; then
1102+
sed -i "/<\/application>/i \n <activity android:name="$FQCN" android:exported="false" />" "$MANIFEST_PATH"
1103+
ba_log "Declared $FQCN in $MANIFEST_PATH"
1104+
fi
1105+
done
1106+
1107+
ba_log "Rebuilding :app after identifier and manifest patches"
1108+
set +e
1109+
(
1110+
cd "$GRADLE_PROJECT_DIR"
1111+
./gradlew --no-daemon :app:assembleDebug :app:assembleDebugAndroidTest -x lint -x test
1112+
)
1113+
PATCH_EXIT=$?
1114+
set -e
1115+
if [ "$PATCH_EXIT" -ne 0 ]; then
1116+
ba_log "Gradle assemble failed after identifier patching"
1117+
stop_emulator
1118+
exit 1
1119+
fi
1120+
1121+
MERGED_MANIFEST="$APP_MODULE_DIR/build/intermediates/packaged_manifests/debug/AndroidManifest.xml"
1122+
if [ -f "$MERGED_MANIFEST" ]; then
1123+
if grep -q "android:name=\"${FQCN//./\.}\"" "$MERGED_MANIFEST"; then
1124+
grep -n "${FQCN//./\.}" "$MERGED_MANIFEST" | sed 's/^/[build-android-app] merged-manifest: /'
1125+
else
1126+
ba_log "ERROR: merged manifest missing $FQCN"
1127+
sed -n '1,160p' "$MERGED_MANIFEST" | sed 's/^/[build-android-app] merged: /'
1128+
stop_emulator
1129+
exit 1
1130+
fi
1131+
else
1132+
ba_log "WARN: merged manifest not found at $MERGED_MANIFEST"
1133+
fi
1134+
1135+
APP_PROPERTIES_RAW=$(cd "$GRADLE_PROJECT_DIR" && ./gradlew -q :app:properties 2>/dev/null || true)
1136+
if [ -n "$APP_PROPERTIES_RAW" ]; then
1137+
printf '%s\n' "$APP_PROPERTIES_RAW" | grep -E '^(applicationId|testApplicationId|namespace):' | sed 's/^/[build-android-app] props (post-patch): /'
1138+
APP_ID="$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^applicationId:/{print $2; exit}')"
1139+
NS_VALUE="$(printf '%s\n' "$APP_PROPERTIES_RAW" | awk -F': ' '/^namespace:/{print $2; exit}')"
1140+
if [ -n "$APP_ID" ] && [ "$APP_ID" != "$PACKAGE_NAME" ]; then
1141+
ba_log "ERROR: applicationId=$APP_ID does not match Codename One package $PACKAGE_NAME" >&2
1142+
stop_emulator
1143+
exit 1
1144+
fi
1145+
if [ -n "$NS_VALUE" ] && [ "$NS_VALUE" != "$PACKAGE_NAME" ]; then
1146+
ba_log "ERROR: namespace=$NS_VALUE does not match Codename One package $PACKAGE_NAME" >&2
1147+
stop_emulator
1148+
exit 1
1149+
fi
1150+
else
1151+
ba_log "Warning: unable to query :app:properties after patching" >&2
1152+
fi
1153+
1154+
APP_APK="$(find "$GRADLE_PROJECT_DIR/app/build/outputs/apk/debug" -maxdepth 1 -name '*-debug.apk' | head -n1 || true)"
1155+
TEST_APK="$(find "$GRADLE_PROJECT_DIR/app/build/outputs/apk/androidTest/debug" -maxdepth 1 -name '*-debug-androidTest.apk' | head -n1 || true)"
1156+
1157+
if [ -z "$APP_APK" ] || [ ! -f "$APP_APK" ]; then
1158+
ba_log "App APK not found after identifier patch assemble" >&2
1159+
stop_emulator
1160+
exit 1
1161+
fi
1162+
if [ -z "$TEST_APK" ] || [ ! -f "$TEST_APK" ]; then
1163+
ba_log "androidTest APK not found after identifier patch assemble" >&2
1164+
stop_emulator
1165+
exit 1
1166+
fi
1167+
11241168
ba_log "Installing app APK: $APP_APK"
11251169
if ! adb_install_retry "$EMULATOR_SERIAL" "$APP_APK"; then
11261170
dump_emulator_diagnostics
@@ -1135,6 +1179,10 @@ if ! adb_install_retry "$EMULATOR_SERIAL" "$TEST_APK"; then
11351179
exit 1
11361180
fi
11371181

1182+
"$ADB_BIN" -s "$EMULATOR_SERIAL" shell pm list instrumentation | sed "s/^/[build-android-app] instrumentation: /" || true
1183+
"$ADB_BIN" -s "$EMULATOR_SERIAL" shell pm list packages | grep -E "${PACKAGE_NAME//./\.}|${PACKAGE_NAME//./\.}\.test" | sed "s/^/[build-android-app] package: /" || true
1184+
"$ADB_BIN" -s "$EMULATOR_SERIAL" shell cmd package resolve-activity --brief "$PACKAGE_NAME/$FQCN" | sed "s/^/[build-android-app] resolve-stub (pre-test): /" || true
1185+
11381186
APP_PACKAGE_PATH="$("$ADB_BIN" -s "$EMULATOR_SERIAL" shell pm path "$PACKAGE_NAME" 2>/dev/null | tr -d '\r' || true)"
11391187
if [ -n "$APP_PACKAGE_PATH" ]; then
11401188
printf '%s\n' "$APP_PACKAGE_PATH" | sed 's/^/[build-android-app] app-apk: /'

0 commit comments

Comments
 (0)