1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

[Export] Use project settings overrides with the target preset features instead of current platform features.

This commit is contained in:
bruvzg
2023-01-17 09:52:17 +02:00
committed by Pāvels Nadtočajevs
parent 4248411baf
commit c6739f64df
22 changed files with 251 additions and 123 deletions

View File

@@ -33,7 +33,6 @@
#include "logo_svg.gen.h"
#include "run_icon_svg.gen.h"
#include "core/config/project_settings.h"
#include "core/io/dir_access.h"
#include "core/io/file_access.h"
#include "core/io/image_loader.h"
@@ -478,12 +477,12 @@ void EditorExportPlatformAndroid::_update_preset_status() {
}
#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;
if (!p_name.is_empty()) {
aname = p_name;
} else {
aname = GLOBAL_GET("application/config/name");
aname = get_project_setting(p_preset, "application/config/name");
}
if (aname.is_empty()) {
@@ -493,17 +492,17 @@ String EditorExportPlatformAndroid::get_project_name(const String &p_name) const
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 name = get_valid_basename();
String name = get_valid_basename(p_preset);
pname = pname.replace("$genname", name);
return pname;
}
// Returns the project name without invalid characters
// 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();
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);
}
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 (r_error) {
@@ -594,12 +593,12 @@ bool EditorExportPlatformAndroid::is_package_name_valid(const String &p_package,
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.
String basename = GLOBAL_GET("application/config/name");
String basename = get_project_setting(p_preset, "application/config/name");
basename = basename.to_lower();
// Check if there are invalid characters.
if (basename != get_valid_basename()) {
if (basename != get_valid_basename(p_preset)) {
return false;
}
return true;
@@ -858,9 +857,9 @@ bool EditorExportPlatformAndroid::_has_manage_external_storage_permission(const
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";
}
@@ -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
FeatureInfo vulkan_level = {
"android.hardware.vulkan.level", // name
@@ -984,7 +983,7 @@ void EditorExportPlatformAndroid::_get_manifest_info(const Ref<EditorExportPrese
MetadataInfo rendering_method_metadata = {
"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);
@@ -1121,7 +1120,7 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
String package_name = p_preset->get("package/unique_name");
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_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");
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 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<FeatureInfo> features;
@@ -1206,7 +1205,7 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
//replace project information
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") {
@@ -1254,7 +1253,7 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
}
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") {
@@ -1701,7 +1700,7 @@ void EditorExportPlatformAndroid::_fix_resources(const Ref<EditorExportPreset> &
Vector<String> string_table;
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++) {
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 == "godot-project-name") {
//project name
str = get_project_name(package_name);
str = get_project_name(p_preset, package_name);
} else {
String lang = str.substr(str.rfind_char('-') + 1).replace("-", "_");
if (appnames.has(lang)) {
str = appnames[lang];
} 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) {
String project_icon_path = GLOBAL_GET("application/config/icon");
String project_icon_path = get_project_setting(p_preset, "application/config/icon");
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_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;
}
} 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("0");
}
args.push_back(get_package_name(package_name));
args.push_back(get_package_name(p_preset, package_name));
output.clear();
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.
args.push_back("-c");
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();
err = OS::get_singleton()->execute(adb, args, &output, &rv, true);
print_verbose(output);
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.
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);
args.erase(get_package_name(package_name));
args.erase(get_package_name(p_preset, package_name));
args.push_back("-n");
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") {
// 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 += "\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`.
err += vformat(TTR("\"Min SDK\" should be greater or equal to %d for the \"%s\" renderer."), VULKAN_MIN_SDK_VERSION, current_renderer);
err += "\n";
}
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`.
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";
}
@@ -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) {
int version_code = p_preset->get("version/code");
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);
return fullpath;
}
@@ -3436,8 +3435,8 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
print_verbose("Android sdk path: " + sdk_path);
// 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) {
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);
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_name = p_preset->get_version("version/name");
String min_sdk_version = p_preset->get("gradle_build/min_sdk");

View File

@@ -104,16 +104,16 @@ class EditorExportPlatformAndroid : public EditorExportPlatform {
void _update_preset_status();
#endif
String get_project_name(const String &p_name) const;
String get_project_name(const Ref<EditorExportPreset> &p_preset, const String &p_name) const;
String get_package_name(const String &p_package) const;
String get_package_name(const Ref<EditorExportPreset> &p_preset, const String &p_package) const;
String get_valid_basename() const;
String get_valid_basename(const Ref<EditorExportPreset> &p_preset) const;
String get_assets_directory(const Ref<EditorExportPreset> &p_preset, int p_export_format) const;
bool is_package_name_valid(const String &p_package, String *r_error = nullptr) const;
bool is_project_name_valid() const;
bool is_package_name_valid(const Ref<EditorExportPreset> &p_preset, const String &p_package, String *r_error = nullptr) const;
bool is_project_name_valid(const Ref<EditorExportPreset> &p_preset) const;
static bool _should_compress_asset(const String &p_path, const Vector<uint8_t> &p_data);
@@ -189,7 +189,7 @@ class EditorExportPlatformAndroid : public EditorExportPlatform {
static Vector<ABI> get_enabled_abis(const Ref<EditorExportPreset> &p_preset);
static bool _uses_vulkan();
bool _uses_vulkan(const Ref<EditorExportPreset> &p_preset) const;
protected:
void _notification(int p_what);

View File

@@ -200,10 +200,10 @@ String _android_xml_escape(const String &p_string) {
}
// Creates strings.xml files inside the gradle project for different locales.
Error _create_project_name_strings_files(const Ref<EditorExportPreset> &p_preset, const String &project_name, const String &p_gradle_build_dir) {
print_verbose("Creating strings resources for supported locales for project " + project_name);
Error _create_project_name_strings_files(const Ref<EditorExportPreset> &p_preset, const String &p_project_name, const String &p_gradle_build_dir, const Dictionary &p_appnames) {
print_verbose("Creating strings resources for supported locales for project " + p_project_name);
// Stores the string into the default values directory.
String processed_default_xml_string = vformat(GODOT_PROJECT_NAME_XML_STRING, _android_xml_escape(project_name));
String processed_default_xml_string = vformat(GODOT_PROJECT_NAME_XML_STRING, _android_xml_escape(p_project_name));
store_string_at_path(p_gradle_build_dir.path_join("res/values/godot_project_name_string.xml"), processed_default_xml_string);
// Searches the Gradle project res/ directory to find all supported locales
@@ -215,7 +215,6 @@ Error _create_project_name_strings_files(const Ref<EditorExportPreset> &p_preset
return ERR_CANT_OPEN;
}
da->list_dir_begin();
Dictionary appnames = GLOBAL_GET("application/config/name_localized");
while (true) {
String file = da->get_next();
if (file.is_empty()) {
@@ -227,8 +226,8 @@ Error _create_project_name_strings_files(const Ref<EditorExportPreset> &p_preset
}
String locale = file.replace("values-", "").replace("-r", "_");
String locale_directory = p_gradle_build_dir.path_join("res/" + file + "/godot_project_name_string.xml");
if (appnames.has(locale)) {
String locale_project_name = appnames[locale];
if (p_appnames.has(locale)) {
String locale_project_name = p_appnames[locale];
String processed_xml_string = vformat(GODOT_PROJECT_NAME_XML_STRING, _android_xml_escape(locale_project_name));
print_verbose("Storing project name for locale " + locale + " under " + locale_directory);
store_string_at_path(locale_directory, processed_xml_string);
@@ -264,7 +263,7 @@ String _get_screen_sizes_tag(const Ref<EditorExportPreset> &p_preset) {
}
String _get_activity_tag(const Ref<EditorExportPlatform> &p_export_platform, const Ref<EditorExportPreset> &p_preset, bool p_debug) {
String orientation = _get_android_orientation_label(DisplayServer::ScreenOrientation(int(GLOBAL_GET("display/window/handheld/orientation"))));
String orientation = _get_android_orientation_label(DisplayServer::ScreenOrientation(int(p_export_platform->get_project_setting(p_preset, "display/window/handheld/orientation"))));
String manifest_activity_text = vformat(
" <activity android:name=\".GodotApp\" "
"tools:replace=\"android:screenOrientation,android:excludeFromRecents,android:resizeableActivity\" "
@@ -274,7 +273,7 @@ String _get_activity_tag(const Ref<EditorExportPlatform> &p_export_platform, con
"android:resizeableActivity=\"%s\">\n",
bool_to_string(p_preset->get("package/exclude_from_recents")),
orientation,
bool_to_string(bool(GLOBAL_GET("display/window/size/resizable"))));
bool_to_string(bool(p_export_platform->get_project_setting(p_preset, "display/window/size/resizable"))));
manifest_activity_text += " <intent-filter>\n"
" <action android:name=\"android.intent.action.MAIN\" />\n"

View File

@@ -100,7 +100,7 @@ Error store_string_at_path(const String &p_path, const String &p_data);
Error rename_and_store_file_in_gradle_project(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key, uint64_t p_seed);
// Creates strings.xml files inside the gradle project for different locales.
Error _create_project_name_strings_files(const Ref<EditorExportPreset> &p_preset, const String &project_name, const String &p_gradle_build_dir);
Error _create_project_name_strings_files(const Ref<EditorExportPreset> &p_preset, const String &p_project_name, const String &p_gradle_build_dir, const Dictionary &p_appnames);
String bool_to_string(bool v);