summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFredia Huya-Kouadio <fhuyakou@gmail.com>2024-02-15 17:43:32 -0800
committerFredia Huya-Kouadio <fhuyakou@gmail.com>2024-02-15 18:04:55 -0800
commita69a585c91f70e4e3443073483d256e868f57156 (patch)
tree191e5a56d2890a84ea8814ee7da3cf855b4edf67
parenta9bb8509f2faac81bdb995c6c89a5347372f3498 (diff)
downloadredot-engine-a69a585c91f70e4e3443073483d256e868f57156.tar.gz
Add export setting to specify whether the native libraries should be compressed for the gradle build
-rw-r--r--platform/android/doc_classes/EditorExportPlatformAndroid.xml4
-rw-r--r--platform/android/export/export_plugin.cpp8
-rw-r--r--platform/android/java/app/build.gradle8
-rw-r--r--platform/android/java/app/config.gradle23
4 files changed, 43 insertions, 0 deletions
diff --git a/platform/android/doc_classes/EditorExportPlatformAndroid.xml b/platform/android/doc_classes/EditorExportPlatformAndroid.xml
index a6f92158f9..dd4c2974a4 100644
--- a/platform/android/doc_classes/EditorExportPlatformAndroid.xml
+++ b/platform/android/doc_classes/EditorExportPlatformAndroid.xml
@@ -42,6 +42,10 @@
<member name="custom_template/release" type="String" setter="" getter="">
Path to the custom export template. If left empty, default template is used.
</member>
+ <member name="gradle_build/compress_native_libraries" type="bool" setter="" getter="">
+ If [code]true[/code], native libraries are compressed when performing a Gradle build.
+ [b]Note:[/b] Although your binary may be smaller, your application may load slower because the native libraries are not loaded directly from the binary at runtime.
+ </member>
<member name="gradle_build/export_format" type="int" setter="" getter="">
Export format for Gradle build.
</member>
diff --git a/platform/android/export/export_plugin.cpp b/platform/android/export/export_plugin.cpp
index 459f5a5983..fa24893b52 100644
--- a/platform/android/export/export_plugin.cpp
+++ b/platform/android/export/export_plugin.cpp
@@ -1744,6 +1744,11 @@ String EditorExportPlatformAndroid::get_export_option_warning(const EditorExport
if (xr_mode_index == XR_MODE_OPENXR && !gradle_build_enabled) {
return TTR("OpenXR requires \"Use Gradle Build\" to be enabled");
}
+ } else if (p_name == "gradle_build/compress_native_libraries") {
+ bool gradle_build_enabled = p_preset->get("gradle_build/use_gradle_build");
+ if (bool(p_preset->get("gradle_build/compress_native_libraries")) && !gradle_build_enabled) {
+ return TTR("\"Compress Native Libraries\" is only valid when \"Use Gradle Build\" is enabled.");
+ }
} else if (p_name == "gradle_build/export_format") {
bool gradle_build_enabled = p_preset->get("gradle_build/use_gradle_build");
if (int(p_preset->get("gradle_build/export_format")) == EXPORT_FORMAT_AAB && !gradle_build_enabled) {
@@ -1799,6 +1804,7 @@ void EditorExportPlatformAndroid::get_export_options(List<ExportOption> *r_optio
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_template/release", PROPERTY_HINT_GLOBAL_FILE, "*.apk"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "gradle_build/use_gradle_build"), false, false, true));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "gradle_build/compress_native_libraries"), false, false, true));
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "gradle_build/export_format", PROPERTY_HINT_ENUM, "Export APK,Export AAB"), EXPORT_FORMAT_APK, false, true));
// Using String instead of int to default to an empty string (no override) with placeholder for instructions (see GH-62465).
// This implies doing validation that the string is a proper int.
@@ -3040,6 +3046,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
String enabled_abi_string = join_abis(enabled_abis, "|", false);
String sign_flag = should_sign ? "true" : "false";
String zipalign_flag = "true";
+ String compress_native_libraries_flag = bool(p_preset->get("gradle_build/compress_native_libraries")) ? "true" : "false";
Vector<String> android_libraries;
Vector<String> android_dependencies;
@@ -3104,6 +3111,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
cmdline.push_back("-Pplugins_maven_repos=" + combined_android_dependencies_maven_repos); // argument to specify the list of maven repos for android dependencies provided by plugins.
cmdline.push_back("-Pperform_zipalign=" + zipalign_flag); // argument to specify whether the build should be zipaligned.
cmdline.push_back("-Pperform_signing=" + sign_flag); // argument to specify whether the build should be signed.
+ cmdline.push_back("-Pcompress_native_libraries=" + compress_native_libraries_flag); // argument to specify whether the build should compress native libraries.
cmdline.push_back("-Pgodot_editor_version=" + String(VERSION_FULL_CONFIG));
// NOTE: The release keystore is not included in the verbose logging
diff --git a/platform/android/java/app/build.gradle b/platform/android/java/app/build.gradle
index f084c60209..7797f4bc9d 100644
--- a/platform/android/java/app/build.gradle
+++ b/platform/android/java/app/build.gradle
@@ -116,6 +116,14 @@ android {
if (shouldNotStrip()) {
doNotStrip '**/*.so'
}
+
+ jniLibs {
+ // Setting this to true causes AGP to package compressed native libraries when building the app
+ // For more background, see:
+ // - https://developer.android.com/build/releases/past-releases/agp-3-6-0-release-notes#extractNativeLibs
+ // - https://stackoverflow.com/a/44704840
+ useLegacyPackaging shouldUseLegacyPackaging()
+ }
}
signingConfigs {
diff --git a/platform/android/java/app/config.gradle b/platform/android/java/app/config.gradle
index 7224765f28..f2c4a5d1b6 100644
--- a/platform/android/java/app/config.gradle
+++ b/platform/android/java/app/config.gradle
@@ -361,3 +361,26 @@ ext.shouldSign = { ->
ext.shouldNotStrip = { ->
return isAndroidStudio() || project.hasProperty("doNotStrip")
}
+
+/**
+ * Whether to use the legacy convention of compressing all .so files in the APK.
+ *
+ * For more background, see:
+ * - https://developer.android.com/build/releases/past-releases/agp-3-6-0-release-notes#extractNativeLibs
+ * - https://stackoverflow.com/a/44704840
+ */
+ext.shouldUseLegacyPackaging = { ->
+ int minSdk = getExportMinSdkVersion()
+ if (minSdk < 23) {
+ // Enforce the default behavior for compatibility with device running api < 23
+ return true
+ }
+
+ String legacyPackagingFlag = project.hasProperty("compress_native_libraries") ? project.property("compress_native_libraries") : ""
+ if (legacyPackagingFlag != null && !legacyPackagingFlag.isEmpty()) {
+ return Boolean.parseBoolean(legacyPackagingFlag)
+ }
+
+ // Default behavior for minSdk >= 23
+ return false
+}