You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-12-04 17:04:49 +00:00
Android: Allow using alternative Gradle build directory
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
#include "editor/editor_paths.h"
|
||||
#include "editor/editor_settings.h"
|
||||
#include "editor/editor_string_names.h"
|
||||
#include "editor/export/editor_export.h"
|
||||
#include "editor/progress_dialog.h"
|
||||
#include "editor/themes/editor_scale.h"
|
||||
#include "scene/gui/file_dialog.h"
|
||||
@@ -655,39 +656,78 @@ void ExportTemplateManager::_hide_dialog() {
|
||||
hide();
|
||||
}
|
||||
|
||||
bool ExportTemplateManager::can_install_android_template() {
|
||||
const String templates_dir = EditorPaths::get_singleton()->get_export_templates_dir().path_join(VERSION_FULL_CONFIG);
|
||||
return FileAccess::exists(templates_dir.path_join("android_source.zip"));
|
||||
String ExportTemplateManager::get_android_build_directory(const Ref<EditorExportPreset> &p_preset) {
|
||||
if (p_preset.is_valid()) {
|
||||
String gradle_build_dir = p_preset->get("gradle_build/gradle_build_directory");
|
||||
if (!gradle_build_dir.is_empty()) {
|
||||
return gradle_build_dir.path_join("build");
|
||||
}
|
||||
}
|
||||
return "res://android/build";
|
||||
}
|
||||
|
||||
Error ExportTemplateManager::install_android_template() {
|
||||
const String &templates_path = EditorPaths::get_singleton()->get_export_templates_dir().path_join(VERSION_FULL_CONFIG);
|
||||
const String &source_zip = templates_path.path_join("android_source.zip");
|
||||
ERR_FAIL_COND_V(!FileAccess::exists(source_zip), ERR_CANT_OPEN);
|
||||
return install_android_template_from_file(source_zip);
|
||||
String ExportTemplateManager::get_android_source_zip(const Ref<EditorExportPreset> &p_preset) {
|
||||
if (p_preset.is_valid()) {
|
||||
String android_source_zip = p_preset->get("gradle_build/android_source_template");
|
||||
if (!android_source_zip.is_empty()) {
|
||||
return android_source_zip;
|
||||
}
|
||||
}
|
||||
|
||||
const String templates_dir = EditorPaths::get_singleton()->get_export_templates_dir().path_join(VERSION_FULL_CONFIG);
|
||||
return templates_dir.path_join("android_source.zip");
|
||||
}
|
||||
Error ExportTemplateManager::install_android_template_from_file(const String &p_file) {
|
||||
|
||||
String ExportTemplateManager::get_android_template_identifier(const Ref<EditorExportPreset> &p_preset) {
|
||||
// The template identifier is the Godot version for the default template, and the full path plus md5 hash for custom templates.
|
||||
if (p_preset.is_valid()) {
|
||||
String android_source_zip = p_preset->get("gradle_build/android_source_template");
|
||||
if (!android_source_zip.is_empty()) {
|
||||
return android_source_zip + String(" [") + FileAccess::get_md5(android_source_zip) + String("]");
|
||||
}
|
||||
}
|
||||
return VERSION_FULL_CONFIG;
|
||||
}
|
||||
|
||||
bool ExportTemplateManager::is_android_template_installed(const Ref<EditorExportPreset> &p_preset) {
|
||||
return DirAccess::exists(get_android_build_directory(p_preset));
|
||||
}
|
||||
|
||||
bool ExportTemplateManager::can_install_android_template(const Ref<EditorExportPreset> &p_preset) {
|
||||
return FileAccess::exists(get_android_source_zip(p_preset));
|
||||
}
|
||||
|
||||
Error ExportTemplateManager::install_android_template(const Ref<EditorExportPreset> &p_preset) {
|
||||
const String source_zip = get_android_source_zip(p_preset);
|
||||
ERR_FAIL_COND_V(!FileAccess::exists(source_zip), ERR_CANT_OPEN);
|
||||
return install_android_template_from_file(source_zip, p_preset);
|
||||
}
|
||||
|
||||
Error ExportTemplateManager::install_android_template_from_file(const String &p_file, const Ref<EditorExportPreset> &p_preset) {
|
||||
// To support custom Android builds, we install the Java source code and buildsystem
|
||||
// from android_source.zip to the project's res://android folder.
|
||||
|
||||
Ref<DirAccess> da = DirAccess::create(DirAccess::ACCESS_RESOURCES);
|
||||
ERR_FAIL_COND_V(da.is_null(), ERR_CANT_CREATE);
|
||||
|
||||
// Make res://android dir (if it does not exist).
|
||||
da->make_dir("android");
|
||||
String build_dir = get_android_build_directory(p_preset);
|
||||
String parent_dir = build_dir.get_base_dir();
|
||||
|
||||
// Make parent of the build dir (if it does not exist).
|
||||
da->make_dir_recursive(parent_dir);
|
||||
{
|
||||
// Add version, to ensure building won't work if template and Godot version don't match.
|
||||
Ref<FileAccess> f = FileAccess::open("res://android/.build_version", FileAccess::WRITE);
|
||||
// Add identifier, to ensure building won't work if the current template doesn't match.
|
||||
Ref<FileAccess> f = FileAccess::open(parent_dir.path_join(".build_version"), FileAccess::WRITE);
|
||||
ERR_FAIL_COND_V(f.is_null(), ERR_CANT_CREATE);
|
||||
f->store_line(VERSION_FULL_CONFIG);
|
||||
f->store_line(get_android_template_identifier(p_preset));
|
||||
}
|
||||
|
||||
// Create the android build directory.
|
||||
Error err = da->make_dir_recursive("android/build");
|
||||
Error err = da->make_dir_recursive(build_dir);
|
||||
ERR_FAIL_COND_V(err != OK, err);
|
||||
{
|
||||
// Add an empty .gdignore file to avoid scan.
|
||||
Ref<FileAccess> f = FileAccess::open("res://android/build/.gdignore", FileAccess::WRITE);
|
||||
Ref<FileAccess> f = FileAccess::open(build_dir.path_join(".gdignore"), FileAccess::WRITE);
|
||||
ERR_FAIL_COND_V(f.is_null(), ERR_CANT_CREATE);
|
||||
f->store_line("");
|
||||
}
|
||||
@@ -735,11 +775,11 @@ Error ExportTemplateManager::install_android_template_from_file(const String &p_
|
||||
unzCloseCurrentFile(pkg);
|
||||
|
||||
if (!dirs_tested.has(base_dir)) {
|
||||
da->make_dir_recursive(String("android/build").path_join(base_dir));
|
||||
da->make_dir_recursive(build_dir.path_join(base_dir));
|
||||
dirs_tested.insert(base_dir);
|
||||
}
|
||||
|
||||
String to_write = String("res://android/build").path_join(path);
|
||||
String to_write = build_dir.path_join(path);
|
||||
Ref<FileAccess> f = FileAccess::open(to_write, FileAccess::WRITE);
|
||||
if (f.is_valid()) {
|
||||
f->store_buffer(uncomp_data.ptr(), uncomp_data.size());
|
||||
|
||||
Reference in New Issue
Block a user