From 183fd7fccf8e357e34fdb7838b70f09a7e522881 Mon Sep 17 00:00:00 2001 From: Aman Jain Date: Thu, 23 Jul 2020 12:17:02 -0400 Subject: [PATCH] Write an AndroidManifest.xml file to be merged with app module's manifest. --- platform/android/export/export.cpp | 93 ++++++++++++++++++-- platform/android/export/gradle_export_util.h | 24 +++++ platform/android/java/app/build.gradle | 2 + platform/android/java/app/config.gradle | 16 ++++ 4 files changed, 128 insertions(+), 7 deletions(-) diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 412e4a121884..758e60a9bd10 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -778,6 +778,81 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { } } + void _write_tmp_manifest(const Ref &p_preset, bool p_give_internet, bool p_debug) { + String manifest_text = + "\n" + "\n"; + + manifest_text += _get_screen_sizes_tag(p_preset); + manifest_text += _get_gles_tag(); + + Vector perms; + _get_permissions(p_preset, p_give_internet, perms); + for (int i = 0; i < perms.size(); i++) { + manifest_text += vformat(" \n", perms.get(i)); + } + + bool uses_xr = (int)(p_preset->get("xr_features/xr_mode")) == 1; + if (uses_xr) { + int dof_index = p_preset->get("xr_features/degrees_of_freedom"); // 0: none, 1: 3dof and 6dof, 2: 6dof + if (dof_index == 1) { + manifest_text += " \n"; + } else if (dof_index == 2) { + manifest_text += " \n"; + } + int hand_tracking_index = p_preset->get("xr_features/hand_tracking"); // 0: none, 1: optional, 2: required + if (hand_tracking_index == 1) { + manifest_text += " \n"; + } else if (hand_tracking_index == 2) { + manifest_text += " \n"; + } + } + + String package_name = p_preset->get("package/unique_name"); + manifest_text += vformat( + " \n", + package_name); + + manifest_text += + " )\n"; + + String plugins_names = get_plugins_names(get_enabled_plugins(p_preset)); + if (!plugins_names.empty()) { + manifest_text += vformat(" \n", plugins_names); + } + + if (uses_xr) { + manifest_text += " \n"; + } + + String orientation = (int)(p_preset->get("screen/orientation")) == 1 ? "portrait" : "landscape"; + manifest_text += vformat( + " \n", + orientation); + + if (uses_xr) { + String focus_awareness = bool_to_string(p_preset->get("xr_features/focus_awareness")); + manifest_text += vformat(" \n", focus_awareness); + } + + manifest_text += " \n"; + manifest_text += " \n"; + manifest_text += "\n"; + + String manifest_path = vformat("res://android/build/src/%s/AndroidManifest.xml", (p_debug ? "debug" : "release")); + store_string_at_path(manifest_path, manifest_text); + } + void _fix_manifest(const Ref &p_preset, Vector &p_manifest, bool p_give_internet) { // Leaving the unused types commented because looking these constants up // again later would be annoying @@ -2423,6 +2498,7 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { EditorProgress ep("export", "Exporting for Android", 105, true); bool use_custom_build = bool(p_preset->get("custom_template/use_custom_build")); + bool p_give_internet = p_flags & (DEBUG_FLAG_DUMB_CLIENT | DEBUG_FLAG_REMOTE_DEBUG); Ref main_image; Ref foreground; @@ -2452,9 +2528,10 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { if (err != OK) { EditorNode::add_io_error("Unable to overwrite res://android/build/res/*.xml files with project name"); } - // Copies the project icon files into the appropriate Gradle project directory + // Copies the project icon files into the appropriate Gradle project directory. _copy_icons_to_gradle_project(p_preset, main_image, foreground, background); - + // Write an AndroidManifest.xml file into the Gradle project directory. + _write_tmp_manifest(p_preset, p_give_internet, p_debug); //build project if custom build is enabled String sdk_path = EDITOR_GET("export/android/custom_build_sdk_path"); @@ -2476,6 +2553,8 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { build_command = build_path.plus_file(build_command); String package_name = get_package_name(p_preset->get("package/unique_name")); + String version_code = itos(p_preset->get("version/code")); + String version_name = p_preset->get("version/name"); Vector enabled_plugins = get_enabled_plugins(p_preset); String local_plugins_binaries = get_plugins_binaries(BINARY_TYPE_LOCAL, enabled_plugins); @@ -2489,6 +2568,8 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { } cmdline.push_back("build"); cmdline.push_back("-Pexport_package_name=" + package_name); // argument to specify the package name. + cmdline.push_back("-Pversion_code=" + version_code); // argument to specify the version code. + cmdline.push_back("-Pversion_name=" + version_name); // argument to specify the version name. cmdline.push_back("-Pplugins_local_binaries=" + local_plugins_binaries); // argument to specify the list of plugins local dependencies. cmdline.push_back("-Pplugins_remote_binaries=" + remote_plugins_binaries); // argument to specify the list of plugins remote dependencies. cmdline.push_back("-Pplugins_maven_repos=" + custom_maven_repos); // argument to specify the list of custom maven repos for the plugins dependencies. @@ -2610,12 +2691,10 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { unzCloseCurrentFile(pkg); //write - - if (file == "AndroidManifest.xml") { - _fix_manifest(p_preset, data, p_flags & (DEBUG_FLAG_DUMB_CLIENT | DEBUG_FLAG_REMOTE_DEBUG)); - } - if (!use_custom_build) { + if (file == "AndroidManifest.xml") { + _fix_manifest(p_preset, data, p_give_internet); + } if (file == "resources.arsc") { _fix_resources(p_preset, data); } diff --git a/platform/android/export/gradle_export_util.h b/platform/android/export/gradle_export_util.h index 622860c30713..cc4c15d7f4ac 100644 --- a/platform/android/export/gradle_export_util.h +++ b/platform/android/export/gradle_export_util.h @@ -142,4 +142,28 @@ Error _create_project_name_strings_files(const Ref &p_preset return OK; } +String bool_to_string(bool v) { + return v ? "true" : "false"; +} + +String _get_gles_tag() { + bool min_gles3 = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name") == "GLES3" && + !ProjectSettings::get_singleton()->get("rendering/quality/driver/fallback_to_gles2"); + return min_gles3 ? " \n" : ""; +} + +String _get_screen_sizes_tag(const Ref &p_preset) { + String manifest_screen_sizes = " get(feature_name)); + String xml_entry = vformat("\n android:%sScreens=\"%s\"", sizes[i], feature_support); + manifest_screen_sizes += xml_entry; + } + manifest_screen_sizes += " />\n"; + return manifest_screen_sizes; +} + #endif //GODOT_GRADLE_EXPORT_UTIL_H diff --git a/platform/android/java/app/build.gradle b/platform/android/java/app/build.gradle index f1fd716cb49f..68c18935d817 100644 --- a/platform/android/java/app/build.gradle +++ b/platform/android/java/app/build.gradle @@ -94,6 +94,8 @@ android { // Feel free to modify the application id to your own. applicationId getExportPackageName() + versionCode getExportVersionCode() + versionName getExportVersionName() minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk //CHUNK_ANDROID_DEFAULTCONFIG_BEGIN diff --git a/platform/android/java/app/config.gradle b/platform/android/java/app/config.gradle index acfdef531e95..cc9d8e2dbb43 100644 --- a/platform/android/java/app/config.gradle +++ b/platform/android/java/app/config.gradle @@ -28,6 +28,22 @@ ext.getExportPackageName = { -> return appId } +ext.getExportVersionCode = { -> + String versionCode = project.hasProperty("version_code") ? project.property("version_code") : "" + if (versionCode == null || versionCode.isEmpty()) { + versionCode = "1" + } + return Integer.parseInt(versionCode) +} + +ext.getExportVersionName = { -> + String versionName = project.hasProperty("version_name") ? project.property("version_name") : "" + if (versionName == null || versionName.isEmpty()) { + versionName = "1.0" + } + return versionName +} + final String PLUGIN_VALUE_SEPARATOR_REGEX = "\\|" /**