@@ -280,6 +280,7 @@ static const int EXPORT_FORMAT_AAB = 1;
280280
281281static const char *APK_ASSETS_DIRECTORY = " assets" ;
282282static const char *AAB_ASSETS_DIRECTORY = " assetPackInstallTime/src/main/assets" ;
283+ static const char *INSTANT_APP_ASSETS_DIRECTORY = " assets" ; // instant build doesn't support installTime assetspacks, so using the same directory as APK
283284
284285static const int DEFAULT_MIN_SDK_VERSION = 24 ; // Should match the value in 'platform/android/java/app/config.gradle#minSdk'
285286static const int DEFAULT_TARGET_SDK_VERSION = 35 ; // Should match the value in 'platform/android/java/app/config.gradle#targetSdk'
@@ -524,6 +525,12 @@ String EditorExportPlatformAndroid::get_valid_basename(const Ref<EditorExportPre
524525
525526String EditorExportPlatformAndroid::get_assets_directory (const Ref<EditorExportPreset> &p_preset, int p_export_format) const {
526527 String gradle_build_directory = ExportTemplateManager::get_android_build_directory (p_preset);
528+
529+ bool google_play_instant_build = p_preset->get (" gradle_build/google_play_instant" );
530+ if (google_play_instant_build) {
531+ return gradle_build_directory.path_join (INSTANT_APP_ASSETS_DIRECTORY); // Always use base APK asset format
532+ }
533+
527534 return gradle_build_directory.path_join (p_export_format == EXPORT_FORMAT_AAB ? AAB_ASSETS_DIRECTORY : APK_ASSETS_DIRECTORY);
528535}
529536
@@ -994,10 +1001,19 @@ void EditorExportPlatformAndroid::_get_manifest_info(const Ref<EditorExportPrese
9941001
9951002void EditorExportPlatformAndroid::_write_tmp_manifest (const Ref<EditorExportPreset> &p_preset, bool p_give_internet, bool p_debug) {
9961003 print_verbose (" Building temporary manifest..." );
1004+
1005+ bool google_play_instant_build = (bool )p_preset->get (" gradle_build/google_play_instant" );
1006+
9971007 String manifest_text =
9981008 " <?xml version=\" 1.0\" encoding=\" utf-8\" ?>\n "
9991009 " <manifest xmlns:android=\" http://schemas.android.com/apk/res/android\"\n "
1000- " xmlns:tools=\" http://schemas.android.com/tools\" >\n " ;
1010+ " xmlns:tools=\" http://schemas.android.com/tools\" " ;
1011+
1012+ if (google_play_instant_build) {
1013+ manifest_text += " android:targetSandboxVersion=\" 2\" \n xmlns:dist=\" http://schemas.android.com/apk/distribution\" " ;
1014+ }
1015+
1016+ manifest_text += " >\n " ;
10011017
10021018 manifest_text += _get_screen_sizes_tag (p_preset);
10031019 manifest_text += _get_gles_tag ();
@@ -1031,6 +1047,7 @@ void EditorExportPlatformAndroid::_write_tmp_manifest(const Ref<EditorExportPres
10311047 }
10321048
10331049 manifest_text += _get_application_tag (Ref<EditorExportPlatform>(this ), p_preset, _has_read_write_storage_permission (perms), p_debug, manifest_metadata);
1050+
10341051 manifest_text += " </manifest>\n " ;
10351052 String manifest_path = ExportTemplateManager::get_android_build_directory (p_preset).path_join (vformat (" src/%s/AndroidManifest.xml" , (p_debug ? " debug" : " release" )));
10361053
@@ -2008,6 +2025,12 @@ String EditorExportPlatformAndroid::get_export_option_warning(const EditorExport
20082025 if (int (p_preset->get (" gradle_build/export_format" )) == EXPORT_FORMAT_AAB && !gradle_build_enabled) {
20092026 return TTR (" \" Export AAB\" is only valid when \" Use Gradle Build\" is enabled." );
20102027 }
2028+ } else if (p_name == " gradle_build/google_play_instant" ) {
2029+ bool instant_enabled = p_preset->get (" gradle_build/google_play_instant" );
2030+ bool gradle_build_enabled = p_preset->get (" gradle_build/use_gradle_build" );
2031+ if (instant_enabled && !gradle_build_enabled) {
2032+ return TTR (" \" Instant Build\" is only valid when \" Use Gradle Build\" is enabled." );
2033+ }
20112034 } else if (p_name == " gradle_build/min_sdk" ) {
20122035 String min_sdk_str = p_preset->get (" gradle_build/min_sdk" );
20132036 bool gradle_build_enabled = p_preset->get (" gradle_build/use_gradle_build" );
@@ -2087,6 +2110,7 @@ void EditorExportPlatformAndroid::get_export_options(List<ExportOption> *r_optio
20872110 r_options->push_back (ExportOption (PropertyInfo (Variant::STRING, " gradle_build/gradle_build_directory" , PROPERTY_HINT_PLACEHOLDER_TEXT, " res://android" ), " " , false , false ));
20882111 r_options->push_back (ExportOption (PropertyInfo (Variant::STRING, " gradle_build/android_source_template" , PROPERTY_HINT_GLOBAL_FILE, " *.zip" ), " " ));
20892112 r_options->push_back (ExportOption (PropertyInfo (Variant::INT, " gradle_build/export_format" , PROPERTY_HINT_ENUM, " Export APK,Export AAB" ), EXPORT_FORMAT_APK, false , true ));
2113+ r_options->push_back (ExportOption (PropertyInfo (Variant::BOOL, " gradle_build/google_play_instant" ), false , true , true ));
20902114 // Using String instead of int to default to an empty string (no override) with placeholder for instructions (see GH-62465).
20912115 // This implies doing validation that the string is a proper int.
20922116 r_options->push_back (ExportOption (PropertyInfo (Variant::STRING, " gradle_build/min_sdk" , PROPERTY_HINT_PLACEHOLDER_TEXT, vformat (" %d (default)" , DEFAULT_MIN_SDK_VERSION)), " " , false , true ));
@@ -3564,6 +3588,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
35643588 String enabled_abi_string = join_abis (enabled_abis, " |" , false );
35653589 String sign_flag = should_sign ? " true" : " false" ;
35663590 String zipalign_flag = " true" ;
3591+ String play_instant_flag = bool_to_string (p_preset->get (" gradle_build/google_play_instant" ));
35673592
35683593 Vector<String> android_libraries;
35693594 Vector<String> android_dependencies;
@@ -3638,6 +3663,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
36383663 cmdline.push_back (" -Pplugins_maven_repos=" + combined_android_dependencies_maven_repos); // argument to specify the list of maven repos for android dependencies provided by plugins.
36393664 cmdline.push_back (" -Pperform_zipalign=" + zipalign_flag); // argument to specify whether the build should be zipaligned.
36403665 cmdline.push_back (" -Pperform_signing=" + sign_flag); // argument to specify whether the build should be signed.
3666+ cmdline.push_back (" -Pplay_instant_app=" + play_instant_flag); // argument to specify whether the build is for Google Play Instant.
36413667
36423668 // NOTE: The release keystore is not included in the verbose logging
36433669 // to avoid accidentally leaking sensitive information when sharing verbose logs for troubleshooting.
0 commit comments