@@ -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
@@ -993,10 +1000,19 @@ void EditorExportPlatformAndroid::_get_manifest_info(const Ref<EditorExportPrese
9931000
9941001void EditorExportPlatformAndroid::_write_tmp_manifest (const Ref<EditorExportPreset> &p_preset, bool p_give_internet, bool p_debug) {
9951002 print_verbose (" Building temporary manifest..." );
1003+
1004+ bool google_play_instant_build = (bool )p_preset->get (" gradle_build/google_play_instant" );
1005+
9961006 String manifest_text =
9971007 " <?xml version=\" 1.0\" encoding=\" utf-8\" ?>\n "
9981008 " <manifest xmlns:android=\" http://schemas.android.com/apk/res/android\"\n "
999- " xmlns:tools=\" http://schemas.android.com/tools\" >\n " ;
1009+ " xmlns:tools=\" http://schemas.android.com/tools\" " ;
1010+
1011+ if (google_play_instant_build) {
1012+ manifest_text += " android:targetSandboxVersion=\" 2\" \n xmlns:dist=\" http://schemas.android.com/apk/distribution\" " ;
1013+ }
1014+
1015+ manifest_text += " >\n " ;
10001016
10011017 manifest_text += _get_screen_sizes_tag (p_preset);
10021018 manifest_text += _get_gles_tag ();
@@ -1030,6 +1046,7 @@ void EditorExportPlatformAndroid::_write_tmp_manifest(const Ref<EditorExportPres
10301046 }
10311047
10321048 manifest_text += _get_application_tag (Ref<EditorExportPlatform>(this ), p_preset, _has_read_write_storage_permission (perms), p_debug, manifest_metadata);
1049+
10331050 manifest_text += " </manifest>\n " ;
10341051 String manifest_path = ExportTemplateManager::get_android_build_directory (p_preset).path_join (vformat (" src/%s/AndroidManifest.xml" , (p_debug ? " debug" : " release" )));
10351052
@@ -1955,6 +1972,12 @@ String EditorExportPlatformAndroid::get_export_option_warning(const EditorExport
19551972 if (int (p_preset->get (" gradle_build/export_format" )) == EXPORT_FORMAT_AAB && !gradle_build_enabled) {
19561973 return TTR (" \" Export AAB\" is only valid when \" Use Gradle Build\" is enabled." );
19571974 }
1975+ } else if (p_name == " gradle_build/google_play_instant" ) {
1976+ bool instant_enabled = p_preset->get (" gradle_build/google_play_instant" );
1977+ bool gradle_build_enabled = p_preset->get (" gradle_build/use_gradle_build" );
1978+ if (instant_enabled && !gradle_build_enabled) {
1979+ return TTR (" \" Instant Build\" is only valid when \" Use Gradle Build\" is enabled." );
1980+ }
19581981 } else if (p_name == " gradle_build/min_sdk" ) {
19591982 String min_sdk_str = p_preset->get (" gradle_build/min_sdk" );
19601983 bool gradle_build_enabled = p_preset->get (" gradle_build/use_gradle_build" );
@@ -2022,6 +2045,7 @@ void EditorExportPlatformAndroid::get_export_options(List<ExportOption> *r_optio
20222045 r_options->push_back (ExportOption (PropertyInfo (Variant::STRING, " gradle_build/gradle_build_directory" , PROPERTY_HINT_PLACEHOLDER_TEXT, " res://android" ), " " , false , false ));
20232046 r_options->push_back (ExportOption (PropertyInfo (Variant::STRING, " gradle_build/android_source_template" , PROPERTY_HINT_GLOBAL_FILE, " *.zip" ), " " ));
20242047 r_options->push_back (ExportOption (PropertyInfo (Variant::INT, " gradle_build/export_format" , PROPERTY_HINT_ENUM, " Export APK,Export AAB" ), EXPORT_FORMAT_APK, false , true ));
2048+ r_options->push_back (ExportOption (PropertyInfo (Variant::BOOL, " gradle_build/google_play_instant" ), false , true , true ));
20252049 // Using String instead of int to default to an empty string (no override) with placeholder for instructions (see GH-62465).
20262050 // This implies doing validation that the string is a proper int.
20272051 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 ));
@@ -3494,6 +3518,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
34943518 String enabled_abi_string = join_abis (enabled_abis, " |" , false );
34953519 String sign_flag = should_sign ? " true" : " false" ;
34963520 String zipalign_flag = " true" ;
3521+ String play_instant_flag = bool_to_string (p_preset->get (" gradle_build/google_play_instant" ));
34973522
34983523 Vector<String> android_libraries;
34993524 Vector<String> android_dependencies;
@@ -3568,6 +3593,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
35683593 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.
35693594 cmdline.push_back (" -Pperform_zipalign=" + zipalign_flag); // argument to specify whether the build should be zipaligned.
35703595 cmdline.push_back (" -Pperform_signing=" + sign_flag); // argument to specify whether the build should be signed.
3596+ cmdline.push_back (" -Pplay_instant_app=" + play_instant_flag); // argument to specify whether the build is for Google Play Instant.
35713597
35723598 // NOTE: The release keystore is not included in the verbose logging
35733599 // to avoid accidentally leaking sensitive information when sharing verbose logs for troubleshooting.
0 commit comments