|
@@ -33,7 +33,6 @@
|
|
#include "logo_svg.gen.h"
|
|
#include "logo_svg.gen.h"
|
|
#include "run_icon_svg.gen.h"
|
|
#include "run_icon_svg.gen.h"
|
|
|
|
|
|
-#include "core/config/project_settings.h"
|
|
|
|
#include "core/io/dir_access.h"
|
|
#include "core/io/dir_access.h"
|
|
#include "core/io/file_access.h"
|
|
#include "core/io/file_access.h"
|
|
#include "core/io/image_loader.h"
|
|
#include "core/io/image_loader.h"
|
|
@@ -478,12 +477,12 @@ void EditorExportPlatformAndroid::_update_preset_status() {
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-String EditorExportPlatformAndroid::get_project_name(const String &p_name) const {
|
|
|
|
|
|
+String EditorExportPlatformAndroid::get_project_name(const Ref<EditorExportPreset> &p_preset, const String &p_name) const {
|
|
String aname;
|
|
String aname;
|
|
if (!p_name.is_empty()) {
|
|
if (!p_name.is_empty()) {
|
|
aname = p_name;
|
|
aname = p_name;
|
|
} else {
|
|
} else {
|
|
- aname = GLOBAL_GET("application/config/name");
|
|
|
|
|
|
+ aname = get_project_setting(p_preset, "application/config/name");
|
|
}
|
|
}
|
|
|
|
|
|
if (aname.is_empty()) {
|
|
if (aname.is_empty()) {
|
|
@@ -493,17 +492,17 @@ String EditorExportPlatformAndroid::get_project_name(const String &p_name) const
|
|
return aname;
|
|
return aname;
|
|
}
|
|
}
|
|
|
|
|
|
-String EditorExportPlatformAndroid::get_package_name(const String &p_package) const {
|
|
|
|
|
|
+String EditorExportPlatformAndroid::get_package_name(const Ref<EditorExportPreset> &p_preset, const String &p_package) const {
|
|
String pname = p_package;
|
|
String pname = p_package;
|
|
- String name = get_valid_basename();
|
|
|
|
|
|
+ String name = get_valid_basename(p_preset);
|
|
pname = pname.replace("$genname", name);
|
|
pname = pname.replace("$genname", name);
|
|
return pname;
|
|
return pname;
|
|
}
|
|
}
|
|
|
|
|
|
// Returns the project name without invalid characters
|
|
// Returns the project name without invalid characters
|
|
// or the "noname" string if all characters are invalid.
|
|
// or the "noname" string if all characters are invalid.
|
|
-String EditorExportPlatformAndroid::get_valid_basename() const {
|
|
|
|
- String basename = GLOBAL_GET("application/config/name");
|
|
|
|
|
|
+String EditorExportPlatformAndroid::get_valid_basename(const Ref<EditorExportPreset> &p_preset) const {
|
|
|
|
+ String basename = get_project_setting(p_preset, "application/config/name");
|
|
basename = basename.to_lower();
|
|
basename = basename.to_lower();
|
|
|
|
|
|
String name;
|
|
String name;
|
|
@@ -531,8 +530,8 @@ String EditorExportPlatformAndroid::get_assets_directory(const Ref<EditorExportP
|
|
return gradle_build_directory.path_join(p_export_format == EXPORT_FORMAT_AAB ? AAB_ASSETS_DIRECTORY : APK_ASSETS_DIRECTORY);
|
|
return gradle_build_directory.path_join(p_export_format == EXPORT_FORMAT_AAB ? AAB_ASSETS_DIRECTORY : APK_ASSETS_DIRECTORY);
|
|
}
|
|
}
|
|
|
|
|
|
-bool EditorExportPlatformAndroid::is_package_name_valid(const String &p_package, String *r_error) const {
|
|
|
|
- String pname = get_package_name(p_package);
|
|
|
|
|
|
+bool EditorExportPlatformAndroid::is_package_name_valid(const Ref<EditorExportPreset> &p_preset, const String &p_package, String *r_error) const {
|
|
|
|
+ String pname = get_package_name(p_preset, p_package);
|
|
|
|
|
|
if (pname.length() == 0) {
|
|
if (pname.length() == 0) {
|
|
if (r_error) {
|
|
if (r_error) {
|
|
@@ -594,12 +593,12 @@ bool EditorExportPlatformAndroid::is_package_name_valid(const String &p_package,
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
-bool EditorExportPlatformAndroid::is_project_name_valid() const {
|
|
|
|
|
|
+bool EditorExportPlatformAndroid::is_project_name_valid(const Ref<EditorExportPreset> &p_preset) const {
|
|
// Get the original project name and convert to lowercase.
|
|
// Get the original project name and convert to lowercase.
|
|
- String basename = GLOBAL_GET("application/config/name");
|
|
|
|
|
|
+ String basename = get_project_setting(p_preset, "application/config/name");
|
|
basename = basename.to_lower();
|
|
basename = basename.to_lower();
|
|
// Check if there are invalid characters.
|
|
// Check if there are invalid characters.
|
|
- if (basename != get_valid_basename()) {
|
|
|
|
|
|
+ if (basename != get_valid_basename(p_preset)) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
return true;
|
|
@@ -858,9 +857,9 @@ bool EditorExportPlatformAndroid::_has_manage_external_storage_permission(const
|
|
return p_permissions.has("android.permission.MANAGE_EXTERNAL_STORAGE");
|
|
return p_permissions.has("android.permission.MANAGE_EXTERNAL_STORAGE");
|
|
}
|
|
}
|
|
|
|
|
|
-bool EditorExportPlatformAndroid::_uses_vulkan() {
|
|
|
|
- String rendering_method = GLOBAL_GET("rendering/renderer/rendering_method.mobile");
|
|
|
|
- String rendering_driver = GLOBAL_GET("rendering/rendering_device/driver.android");
|
|
|
|
|
|
+bool EditorExportPlatformAndroid::_uses_vulkan(const Ref<EditorExportPreset> &p_preset) const {
|
|
|
|
+ String rendering_method = get_project_setting(p_preset, "rendering/renderer/rendering_method.mobile");
|
|
|
|
+ String rendering_driver = get_project_setting(p_preset, "rendering/rendering_device/driver.android");
|
|
return (rendering_method == "forward_plus" || rendering_method == "mobile") && rendering_driver == "vulkan";
|
|
return (rendering_method == "forward_plus" || rendering_method == "mobile") && rendering_driver == "vulkan";
|
|
}
|
|
}
|
|
|
|
|
|
@@ -964,7 +963,7 @@ void EditorExportPlatformAndroid::_get_manifest_info(const Ref<EditorExportPrese
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (_uses_vulkan()) {
|
|
|
|
|
|
+ if (_uses_vulkan(p_preset)) {
|
|
// Require vulkan hardware level 1 support
|
|
// Require vulkan hardware level 1 support
|
|
FeatureInfo vulkan_level = {
|
|
FeatureInfo vulkan_level = {
|
|
"android.hardware.vulkan.level", // name
|
|
"android.hardware.vulkan.level", // name
|
|
@@ -984,7 +983,7 @@ void EditorExportPlatformAndroid::_get_manifest_info(const Ref<EditorExportPrese
|
|
|
|
|
|
MetadataInfo rendering_method_metadata = {
|
|
MetadataInfo rendering_method_metadata = {
|
|
"org.godotengine.rendering.method",
|
|
"org.godotengine.rendering.method",
|
|
- GLOBAL_GET("rendering/renderer/rendering_method.mobile")
|
|
|
|
|
|
+ p_preset->get_project_setting("rendering/renderer/rendering_method.mobile")
|
|
};
|
|
};
|
|
r_metadata.append(rendering_method_metadata);
|
|
r_metadata.append(rendering_method_metadata);
|
|
|
|
|
|
@@ -1121,7 +1120,7 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
|
|
String package_name = p_preset->get("package/unique_name");
|
|
String package_name = p_preset->get("package/unique_name");
|
|
|
|
|
|
const int screen_orientation =
|
|
const int screen_orientation =
|
|
- _get_android_orientation_value(DisplayServer::ScreenOrientation(int(GLOBAL_GET("display/window/handheld/orientation"))));
|
|
|
|
|
|
+ _get_android_orientation_value(DisplayServer::ScreenOrientation(int(get_project_setting(p_preset, "display/window/handheld/orientation"))));
|
|
|
|
|
|
bool screen_support_small = p_preset->get("screen/support_small");
|
|
bool screen_support_small = p_preset->get("screen/support_small");
|
|
bool screen_support_normal = p_preset->get("screen/support_normal");
|
|
bool screen_support_normal = p_preset->get("screen/support_normal");
|
|
@@ -1132,7 +1131,7 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
|
|
int app_category = p_preset->get("package/app_category");
|
|
int app_category = p_preset->get("package/app_category");
|
|
bool retain_data_on_uninstall = p_preset->get("package/retain_data_on_uninstall");
|
|
bool retain_data_on_uninstall = p_preset->get("package/retain_data_on_uninstall");
|
|
bool exclude_from_recents = p_preset->get("package/exclude_from_recents");
|
|
bool exclude_from_recents = p_preset->get("package/exclude_from_recents");
|
|
- bool is_resizeable = bool(GLOBAL_GET("display/window/size/resizable"));
|
|
|
|
|
|
+ bool is_resizeable = bool(get_project_setting(p_preset, "display/window/size/resizable"));
|
|
|
|
|
|
Vector<String> perms;
|
|
Vector<String> perms;
|
|
Vector<FeatureInfo> features;
|
|
Vector<FeatureInfo> features;
|
|
@@ -1206,7 +1205,7 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
|
|
|
|
|
|
//replace project information
|
|
//replace project information
|
|
if (tname == "manifest" && attrname == "package") {
|
|
if (tname == "manifest" && attrname == "package") {
|
|
- string_table.write[attr_value] = get_package_name(package_name);
|
|
|
|
|
|
+ string_table.write[attr_value] = get_package_name(p_preset, package_name);
|
|
}
|
|
}
|
|
|
|
|
|
if (tname == "manifest" && attrname == "versionCode") {
|
|
if (tname == "manifest" && attrname == "versionCode") {
|
|
@@ -1254,7 +1253,7 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
|
|
}
|
|
}
|
|
|
|
|
|
if (tname == "provider" && attrname == "authorities") {
|
|
if (tname == "provider" && attrname == "authorities") {
|
|
- string_table.write[attr_value] = get_package_name(package_name) + String(".fileprovider");
|
|
|
|
|
|
+ string_table.write[attr_value] = get_package_name(p_preset, package_name) + String(".fileprovider");
|
|
}
|
|
}
|
|
|
|
|
|
if (tname == "supports-screens") {
|
|
if (tname == "supports-screens") {
|
|
@@ -1701,7 +1700,7 @@ void EditorExportPlatformAndroid::_fix_resources(const Ref<EditorExportPreset> &
|
|
Vector<String> string_table;
|
|
Vector<String> string_table;
|
|
|
|
|
|
String package_name = p_preset->get("package/name");
|
|
String package_name = p_preset->get("package/name");
|
|
- Dictionary appnames = GLOBAL_GET("application/config/name_localized");
|
|
|
|
|
|
+ Dictionary appnames = get_project_setting(p_preset, "application/config/name_localized");
|
|
|
|
|
|
for (uint32_t i = 0; i < string_count; i++) {
|
|
for (uint32_t i = 0; i < string_count; i++) {
|
|
uint32_t offset = decode_uint32(&r_manifest[string_table_begins + i * 4]);
|
|
uint32_t offset = decode_uint32(&r_manifest[string_table_begins + i * 4]);
|
|
@@ -1712,14 +1711,14 @@ void EditorExportPlatformAndroid::_fix_resources(const Ref<EditorExportPreset> &
|
|
if (str.begins_with("godot-project-name")) {
|
|
if (str.begins_with("godot-project-name")) {
|
|
if (str == "godot-project-name") {
|
|
if (str == "godot-project-name") {
|
|
//project name
|
|
//project name
|
|
- str = get_project_name(package_name);
|
|
|
|
|
|
+ str = get_project_name(p_preset, package_name);
|
|
|
|
|
|
} else {
|
|
} else {
|
|
String lang = str.substr(str.rfind_char('-') + 1).replace("-", "_");
|
|
String lang = str.substr(str.rfind_char('-') + 1).replace("-", "_");
|
|
if (appnames.has(lang)) {
|
|
if (appnames.has(lang)) {
|
|
str = appnames[lang];
|
|
str = appnames[lang];
|
|
} else {
|
|
} else {
|
|
- str = get_project_name(package_name);
|
|
|
|
|
|
+ str = get_project_name(p_preset, package_name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1811,7 +1810,7 @@ void EditorExportPlatformAndroid::_process_launcher_icons(const String &p_file_n
|
|
}
|
|
}
|
|
|
|
|
|
void EditorExportPlatformAndroid::load_icon_refs(const Ref<EditorExportPreset> &p_preset, Ref<Image> &icon, Ref<Image> &foreground, Ref<Image> &background, Ref<Image> &monochrome) {
|
|
void EditorExportPlatformAndroid::load_icon_refs(const Ref<EditorExportPreset> &p_preset, Ref<Image> &icon, Ref<Image> &foreground, Ref<Image> &background, Ref<Image> &monochrome) {
|
|
- String project_icon_path = GLOBAL_GET("application/config/icon");
|
|
|
|
|
|
+ String project_icon_path = get_project_setting(p_preset, "application/config/icon");
|
|
|
|
|
|
Error err = OK;
|
|
Error err = OK;
|
|
|
|
|
|
@@ -1940,7 +1939,7 @@ String EditorExportPlatformAndroid::get_export_option_warning(const EditorExport
|
|
String pn = p_preset->get("package/unique_name");
|
|
String pn = p_preset->get("package/unique_name");
|
|
String pn_err;
|
|
String pn_err;
|
|
|
|
|
|
- if (!is_package_name_valid(pn, &pn_err)) {
|
|
|
|
|
|
+ if (!is_package_name_valid(Ref<EditorExportPreset>(p_preset), pn, &pn_err)) {
|
|
return TTR("Invalid package name:") + " " + pn_err;
|
|
return TTR("Invalid package name:") + " " + pn_err;
|
|
}
|
|
}
|
|
} else if (p_name == "gesture/swipe_to_dismiss") {
|
|
} else if (p_name == "gesture/swipe_to_dismiss") {
|
|
@@ -2289,7 +2288,7 @@ Error EditorExportPlatformAndroid::run(const Ref<EditorExportPreset> &p_preset,
|
|
args.push_back("--user");
|
|
args.push_back("--user");
|
|
args.push_back("0");
|
|
args.push_back("0");
|
|
}
|
|
}
|
|
- args.push_back(get_package_name(package_name));
|
|
|
|
|
|
+ args.push_back(get_package_name(p_preset, package_name));
|
|
|
|
|
|
output.clear();
|
|
output.clear();
|
|
err = OS::get_singleton()->execute(adb, args, &output, &rv, true);
|
|
err = OS::get_singleton()->execute(adb, args, &output, &rv, true);
|
|
@@ -2394,16 +2393,16 @@ Error EditorExportPlatformAndroid::run(const Ref<EditorExportPreset> &p_preset,
|
|
// Going with implicit launch first based on the LAUNCHER category and the app's package.
|
|
// Going with implicit launch first based on the LAUNCHER category and the app's package.
|
|
args.push_back("-c");
|
|
args.push_back("-c");
|
|
args.push_back("android.intent.category.LAUNCHER");
|
|
args.push_back("android.intent.category.LAUNCHER");
|
|
- args.push_back(get_package_name(package_name));
|
|
|
|
|
|
+ args.push_back(get_package_name(p_preset, package_name));
|
|
|
|
|
|
output.clear();
|
|
output.clear();
|
|
err = OS::get_singleton()->execute(adb, args, &output, &rv, true);
|
|
err = OS::get_singleton()->execute(adb, args, &output, &rv, true);
|
|
print_verbose(output);
|
|
print_verbose(output);
|
|
if (err || rv != 0 || output.contains("Error: Activity not started")) {
|
|
if (err || rv != 0 || output.contains("Error: Activity not started")) {
|
|
// The implicit launch failed, let's try an explicit launch by specifying the component name before giving up.
|
|
// The implicit launch failed, let's try an explicit launch by specifying the component name before giving up.
|
|
- const String component_name = get_package_name(package_name) + "/com.godot.game.GodotApp";
|
|
|
|
|
|
+ const String component_name = get_package_name(p_preset, package_name) + "/com.godot.game.GodotApp";
|
|
print_line("Implicit launch failed.. Trying explicit launch using", component_name);
|
|
print_line("Implicit launch failed.. Trying explicit launch using", component_name);
|
|
- args.erase(get_package_name(package_name));
|
|
|
|
|
|
+ args.erase(get_package_name(p_preset, package_name));
|
|
args.push_back("-n");
|
|
args.push_back("-n");
|
|
args.push_back(component_name);
|
|
args.push_back(component_name);
|
|
|
|
|
|
@@ -2920,23 +2919,23 @@ bool EditorExportPlatformAndroid::has_valid_project_configuration(const Ref<Edit
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- String current_renderer = GLOBAL_GET("rendering/renderer/rendering_method.mobile");
|
|
|
|
|
|
+ String current_renderer = get_project_setting(p_preset, "rendering/renderer/rendering_method.mobile");
|
|
if (current_renderer == "forward_plus") {
|
|
if (current_renderer == "forward_plus") {
|
|
// Warning only, so don't override `valid`.
|
|
// Warning only, so don't override `valid`.
|
|
err += vformat(TTR("The \"%s\" renderer is designed for Desktop devices, and is not suitable for Android devices."), current_renderer);
|
|
err += vformat(TTR("The \"%s\" renderer is designed for Desktop devices, and is not suitable for Android devices."), current_renderer);
|
|
err += "\n";
|
|
err += "\n";
|
|
}
|
|
}
|
|
|
|
|
|
- if (_uses_vulkan() && min_sdk_int < VULKAN_MIN_SDK_VERSION) {
|
|
|
|
|
|
+ if (_uses_vulkan(p_preset) && min_sdk_int < VULKAN_MIN_SDK_VERSION) {
|
|
// Warning only, so don't override `valid`.
|
|
// Warning only, so don't override `valid`.
|
|
err += vformat(TTR("\"Min SDK\" should be greater or equal to %d for the \"%s\" renderer."), VULKAN_MIN_SDK_VERSION, current_renderer);
|
|
err += vformat(TTR("\"Min SDK\" should be greater or equal to %d for the \"%s\" renderer."), VULKAN_MIN_SDK_VERSION, current_renderer);
|
|
err += "\n";
|
|
err += "\n";
|
|
}
|
|
}
|
|
|
|
|
|
String package_name = p_preset->get("package/unique_name");
|
|
String package_name = p_preset->get("package/unique_name");
|
|
- if (package_name.contains("$genname") && !is_project_name_valid()) {
|
|
|
|
|
|
+ if (package_name.contains("$genname") && !is_project_name_valid(p_preset)) {
|
|
// Warning only, so don't override `valid`.
|
|
// Warning only, so don't override `valid`.
|
|
- err += vformat(TTR("The project name does not meet the requirement for the package name format and will be updated to \"%s\". Please explicitly specify the package name if needed."), get_valid_basename());
|
|
|
|
|
|
+ err += vformat(TTR("The project name does not meet the requirement for the package name format and will be updated to \"%s\". Please explicitly specify the package name if needed."), get_valid_basename(p_preset));
|
|
err += "\n";
|
|
err += "\n";
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2954,7 +2953,7 @@ List<String> EditorExportPlatformAndroid::get_binary_extensions(const Ref<Editor
|
|
String EditorExportPlatformAndroid::get_apk_expansion_fullpath(const Ref<EditorExportPreset> &p_preset, const String &p_path) {
|
|
String EditorExportPlatformAndroid::get_apk_expansion_fullpath(const Ref<EditorExportPreset> &p_preset, const String &p_path) {
|
|
int version_code = p_preset->get("version/code");
|
|
int version_code = p_preset->get("version/code");
|
|
String package_name = p_preset->get("package/unique_name");
|
|
String package_name = p_preset->get("package/unique_name");
|
|
- String apk_file_name = "main." + itos(version_code) + "." + get_package_name(package_name) + ".obb";
|
|
|
|
|
|
+ String apk_file_name = "main." + itos(version_code) + "." + get_package_name(p_preset, package_name) + ".obb";
|
|
String fullpath = p_path.get_base_dir().path_join(apk_file_name);
|
|
String fullpath = p_path.get_base_dir().path_join(apk_file_name);
|
|
return fullpath;
|
|
return fullpath;
|
|
}
|
|
}
|
|
@@ -3436,8 +3435,8 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
|
|
print_verbose("Android sdk path: " + sdk_path);
|
|
print_verbose("Android sdk path: " + sdk_path);
|
|
|
|
|
|
// TODO: should we use "package/name" or "application/config/name"?
|
|
// TODO: should we use "package/name" or "application/config/name"?
|
|
- String project_name = get_project_name(p_preset->get("package/name"));
|
|
|
|
- err = _create_project_name_strings_files(p_preset, project_name, gradle_build_directory); //project name localization.
|
|
|
|
|
|
+ String project_name = get_project_name(p_preset, p_preset->get("package/name"));
|
|
|
|
+ err = _create_project_name_strings_files(p_preset, project_name, gradle_build_directory, get_project_setting(p_preset, "application/config/name_localized")); //project name localization.
|
|
if (err != OK) {
|
|
if (err != OK) {
|
|
add_message(EXPORT_MESSAGE_ERROR, TTR("Export"), TTR("Unable to overwrite res/*.xml files with project name."));
|
|
add_message(EXPORT_MESSAGE_ERROR, TTR("Export"), TTR("Unable to overwrite res/*.xml files with project name."));
|
|
}
|
|
}
|
|
@@ -3498,7 +3497,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
|
|
String build_path = ProjectSettings::get_singleton()->globalize_path(gradle_build_directory);
|
|
String build_path = ProjectSettings::get_singleton()->globalize_path(gradle_build_directory);
|
|
build_command = build_path.path_join(build_command);
|
|
build_command = build_path.path_join(build_command);
|
|
|
|
|
|
- String package_name = get_package_name(p_preset->get("package/unique_name"));
|
|
|
|
|
|
+ String package_name = get_package_name(p_preset, p_preset->get("package/unique_name"));
|
|
String version_code = itos(p_preset->get("version/code"));
|
|
String version_code = itos(p_preset->get("version/code"));
|
|
String version_name = p_preset->get_version("version/name");
|
|
String version_name = p_preset->get_version("version/name");
|
|
String min_sdk_version = p_preset->get("gradle_build/min_sdk");
|
|
String min_sdk_version = p_preset->get("gradle_build/min_sdk");
|