@@ -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+
758777log_instrumentation_state () {
759778 " $ADB_BIN " -s " $EMULATOR_SERIAL " shell pm path android | sed ' s/^/[build-android-app] pm path android: /' || true
760779
10141033
10151034if [ " $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
10191039fi
@@ -1076,33 +1096,56 @@ if [ -f "$APP_BUILD_GRADLE" ]; then
10761096 fi
10771097fi
10781098
1079- SRC_SETS=(main debug release)
10801099FQCN=" ${PACKAGE_NAME} .${MAIN_NAME} Stub"
1100+ SRC_SETS=(main debug release)
10811101for 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>
10891117EOF
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
11071150ba_log " Rebuilding :app after identifier and manifest patches"
11081151set +e
@@ -1114,14 +1157,15 @@ PATCH_EXIT=$?
11141157set -e
11151158if [ " $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
11191163fi
11201164
11211165MERGED_MANIFEST=" $APP_MODULE_DIR /build/intermediates/packaged_manifests/debug/AndroidManifest.xml"
11221166if [ -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