Split the Android platform java logic into an Android library module (lib) and an application module (app).

The application module `app` serves double duties of providing the prebuilt Godot binaries ('android_debug.apk', 'android_release.apk') and the Godot custom build template ('android_source.zip').
This commit is contained in:
fhuya
2019-09-02 17:31:51 -07:00
parent ba854bbc7b
commit 7fabfd402f
141 changed files with 386 additions and 282 deletions

View File

@@ -562,10 +562,8 @@ bool ExportTemplateManager::can_install_android_template() {
Error ExportTemplateManager::install_android_template() {
// To support custom Android builds, we install various things to the project's res://android folder.
// First is the Java source code and buildsystem from android_source.zip.
// Then we extract the Godot Android libraries from pre-build android_release.apk
// and android_debug.apk, to place them in the libs folder.
// To support custom Android builds, we install the Java source code and buildsystem
// from android_source.zip to the project's res://android folder.
DirAccessRef da = DirAccess::open("res://");
ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
@@ -661,89 +659,6 @@ Error ExportTemplateManager::install_android_template() {
ProgressDialog::get_singleton()->end_task("uncompress_src");
unzClose(pkg);
// Extract libs from pre-built APKs.
err = _extract_libs_from_apk("release");
ERR_FAIL_COND_V_MSG(err != OK, err, "Can't extract Android libs from android_release.apk.");
err = _extract_libs_from_apk("debug");
ERR_FAIL_COND_V_MSG(err != OK, err, "Can't extract Android libs from android_debug.apk.");
return OK;
}
Error ExportTemplateManager::_extract_libs_from_apk(const String &p_target_name) {
const String &templates_path = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG);
const String &apk_file = templates_path.plus_file("android_" + p_target_name + ".apk");
ERR_FAIL_COND_V(!FileAccess::exists(apk_file), ERR_CANT_OPEN);
FileAccess *src_f = NULL;
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
unzFile pkg = unzOpen2(apk_file.utf8().get_data(), &io);
ERR_FAIL_COND_V_MSG(!pkg, ERR_CANT_OPEN, "Android APK can't be extracted.");
DirAccessRef da = DirAccess::open("res://");
ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
// 8 steps because 4 arches, 2 libs per arch.
ProgressDialog::get_singleton()->add_task("extract_libs_from_apk", TTR("Extracting Android Libraries From APKs"), 8);
int ret = unzGoToFirstFile(pkg);
Set<String> dirs_tested;
int idx = 0;
while (ret == UNZ_OK) {
// Get file path.
unz_file_info info;
char fpath[16384];
ret = unzGetCurrentFileInfo(pkg, &info, fpath, 16384, NULL, 0, NULL, 0);
String path = fpath;
String base_dir = path.get_base_dir();
String file = path.get_file();
if (!base_dir.begins_with("lib") || path.ends_with("/")) {
ret = unzGoToNextFile(pkg);
continue;
}
Vector<uint8_t> data;
data.resize(info.uncompressed_size);
// Read.
unzOpenCurrentFile(pkg);
unzReadCurrentFile(pkg, data.ptrw(), data.size());
unzCloseCurrentFile(pkg);
// We have a "lib" folder in the APK, but it should be "libs/{release,debug}" in the source dir.
String target_base_dir = base_dir.replace_first("lib", String("libs").plus_file(p_target_name));
if (!dirs_tested.has(base_dir)) {
da->make_dir_recursive(String("android/build").plus_file(target_base_dir));
dirs_tested.insert(base_dir);
}
String to_write = String("res://android/build").plus_file(target_base_dir.plus_file(path.get_file()));
FileAccess *f = FileAccess::open(to_write, FileAccess::WRITE);
if (f) {
f->store_buffer(data.ptr(), data.size());
memdelete(f);
#ifndef WINDOWS_ENABLED
// We can't retrieve Unix permissions from the APK it seems, so simply set 0755 as should be.
FileAccess::set_unix_permissions(to_write, 0755);
#endif
} else {
ERR_PRINTS("Can't uncompress file: " + to_write);
}
ProgressDialog::get_singleton()->task_step("extract_libs_from_apk", path, idx);
idx++;
ret = unzGoToNextFile(pkg);
}
ProgressDialog::get_singleton()->end_task("extract_libs_from_apk");
unzClose(pkg);
return OK;
}