Skip to content

Commit 8f71ce1

Browse files
committed
Improve manifest diagnostics and stub activity handling
1 parent 4b33ab5 commit 8f71ce1

File tree

1 file changed

+63
-19
lines changed

1 file changed

+63
-19
lines changed

scripts/build-android-app.sh

Lines changed: 63 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,25 @@ dump_emulator_diagnostics() {
755755
| tail -n 200 | sed 's/^/[build-android-app] logcat: /' || true
756756
}
757757

758+
dump_manifest_merger_reports() {
759+
local blame_a blame_b merged
760+
blame_a="$APP_MODULE_DIR/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt"
761+
blame_b="$APP_MODULE_DIR/build/intermediates/incremental/processDebugMainManifest/manifest-merger-blame-report.txt"
762+
merged="$APP_MODULE_DIR/build/intermediates/packaged_manifests/debug/AndroidManifest.xml"
763+
764+
for report in "$blame_a" "$blame_b"; do
765+
if [ -f "$report" ]; then
766+
ba_log "manifest-merger blame report: $report"
767+
sed -n '1,200p' "$report" | sed 's/^/[build-android-app] manifest-blame: /'
768+
fi
769+
done
770+
771+
if [ -f "$merged" ]; then
772+
ba_log "merged manifest (first 120 lines): $merged"
773+
sed -n '1,120p' "$merged" | sed 's/^/[build-android-app] merged-manifest: /'
774+
fi
775+
}
776+
758777
log_instrumentation_state() {
759778
"$ADB_BIN" -s "$EMULATOR_SERIAL" shell pm path android | sed 's/^/[build-android-app] pm path android: /' || true
760779

@@ -1014,6 +1033,7 @@ fi
10141033

10151034
if [ "$ASSEMBLE_EXIT_CODE" -ne 0 ]; then
10161035
ba_log "Gradle assemble tasks exited with status $ASSEMBLE_EXIT_CODE"
1036+
dump_manifest_merger_reports
10171037
stop_emulator
10181038
exit 1
10191039
fi
@@ -1076,33 +1096,56 @@ if [ -f "$APP_BUILD_GRADLE" ]; then
10761096
fi
10771097
fi
10781098

1079-
SRC_SETS=(main debug release)
10801099
FQCN="${PACKAGE_NAME}.${MAIN_NAME}Stub"
1100+
SRC_SETS=(main debug release)
10811101
for SS in "${SRC_SETS[@]}"; do
10821102
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
1103+
[ -f "$MANIFEST_PATH" ] || continue
1104+
if grep -q "android:name=\"$FQCN\"" "$MANIFEST_PATH"; then
1105+
sed -i "/<activity[^>]*android:name=\"$FQCN\"/d" "$MANIFEST_PATH"
1106+
ba_log "Removed existing $FQCN declaration from $MANIFEST_PATH"
1107+
fi
1108+
done
1109+
1110+
MAIN_MANIFEST="$APP_MODULE_DIR/src/main/AndroidManifest.xml"
1111+
if [ ! -f "$MAIN_MANIFEST" ]; then
1112+
mkdir -p "$(dirname "$MAIN_MANIFEST")"
1113+
cat >"$MAIN_MANIFEST" <<EOF
10861114
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="$PACKAGE_NAME">
10871115
<application/>
10881116
</manifest>
10891117
EOF
1090-
ba_log "Created $MANIFEST_PATH"
1091-
fi
1118+
ba_log "Created $MAIN_MANIFEST"
1119+
fi
10921120

1093-
grep -q '<application' "$MANIFEST_PATH" || sed -i 's#</manifest># <application/>\n</manifest>#' "$MANIFEST_PATH"
1121+
if grep -q '<manifest[^>]*package=' "$MAIN_MANIFEST"; then
1122+
sed -i "0,/<manifest[^>]*package=/ s/package=\"[^\"]*\"/package=\"$PACKAGE_NAME\"/" "$MAIN_MANIFEST"
1123+
else
1124+
sed -i "0,/<manifest/ s#<manifest#<manifest package=\"$PACKAGE_NAME\"#" "$MAIN_MANIFEST"
1125+
fi
10941126

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
1127+
grep -q '<application' "$MAIN_MANIFEST" || sed -i 's#</manifest># <application/>\n</manifest>#' "$MAIN_MANIFEST"
11001128

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
1129+
if ! grep -q "android:name=\"$FQCN\"" "$MAIN_MANIFEST"; then
1130+
sed -i "/<\/application>/i \
1131+
<activity android:name=\"$FQCN\" android:exported=\"false\" />" "$MAIN_MANIFEST"
1132+
ba_log "Declared $FQCN in $MAIN_MANIFEST"
1133+
fi
1134+
1135+
ba_log "Validating manifest merge after stub declaration"
1136+
set +e
1137+
(
1138+
cd "$GRADLE_PROJECT_DIR"
1139+
./gradlew --no-daemon :app:processDebugMainManifest
1140+
)
1141+
PROCESS_EXIT=$?
1142+
set -e
1143+
if [ "$PROCESS_EXIT" -ne 0 ]; then
1144+
ba_log ":app:processDebugMainManifest failed after manifest updates"
1145+
dump_manifest_merger_reports
1146+
stop_emulator
1147+
exit 1
1148+
fi
11061149

11071150
ba_log "Rebuilding :app after identifier and manifest patches"
11081151
set +e
@@ -1114,14 +1157,15 @@ PATCH_EXIT=$?
11141157
set -e
11151158
if [ "$PATCH_EXIT" -ne 0 ]; then
11161159
ba_log "Gradle assemble failed after identifier patching"
1160+
dump_manifest_merger_reports
11171161
stop_emulator
11181162
exit 1
11191163
fi
11201164

11211165
MERGED_MANIFEST="$APP_MODULE_DIR/build/intermediates/packaged_manifests/debug/AndroidManifest.xml"
11221166
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: /'
1167+
if grep -Fq "android:name=\"$FQCN\"" "$MERGED_MANIFEST"; then
1168+
grep -Fn "android:name=\"$FQCN\"" "$MERGED_MANIFEST" | sed 's/^/[build-android-app] merged-manifest: /'
11251169
else
11261170
ba_log "ERROR: merged manifest missing $FQCN"
11271171
sed -n '1,160p' "$MERGED_MANIFEST" | sed 's/^/[build-android-app] merged: /'

0 commit comments

Comments
 (0)