From f3f2fc6610ea7831a4aa6cd3b8d364c77de31fcc Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 10 Feb 2026 10:23:52 +0800 Subject: [PATCH] Support 16 KB page sizes https://developer.android.com/guide/practices/page-sizes Old: ``` === ELF alignment === /var/folders/temp/lib/armeabi-v7a/libbarhopper_v3.so: UNALIGNED (2**12) /var/folders/temp/lib/armeabi-v7a/libsurface_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/armeabi-v7a/libclash.so: UNALIGNED (2**12) /var/folders/temp/lib/armeabi-v7a/libbridge.so: UNALIGNED (2**12) /var/folders/temp/lib/armeabi-v7a/libimage_processing_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/x86/libbarhopper_v3.so: UNALIGNED (2**12) /var/folders/temp/lib/x86/libsurface_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/x86/libclash.so: UNALIGNED (2**12) /var/folders/temp/lib/x86/libbridge.so: UNALIGNED (2**12) /var/folders/temp/lib/x86/libimage_processing_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/arm64-v8a/libbarhopper_v3.so: ALIGNED (2**14) /var/folders/temp/lib/arm64-v8a/libsurface_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/arm64-v8a/libclash.so: UNALIGNED (2**12) /var/folders/temp/lib/arm64-v8a/libbridge.so: UNALIGNED (2**12) /var/folders/temp/lib/arm64-v8a/libimage_processing_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/x86_64/libbarhopper_v3.so: ALIGNED (2**14) /var/folders/temp/lib/x86_64/libsurface_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/x86_64/libclash.so: UNALIGNED (2**12) /var/folders/temp/lib/x86_64/libbridge.so: UNALIGNED (2**12) /var/folders/temp/lib/x86_64/libimage_processing_util_jni.so: ALIGNED (2**14) Found 10 unaligned libs (only arm64-v8a/x86_64 libs need to be aligned). ===================== ``` New: ``` === ELF alignment === /var/folders/temp/lib/armeabi-v7a/libbarhopper_v3.so: UNALIGNED (2**12) /var/folders/temp/lib/armeabi-v7a/libsurface_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/armeabi-v7a/libclash.so: ALIGNED (2**14) /var/folders/temp/lib/armeabi-v7a/libbridge.so: UNALIGNED (2**12) /var/folders/temp/lib/armeabi-v7a/libimage_processing_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/x86/libbarhopper_v3.so: UNALIGNED (2**12) /var/folders/temp/lib/x86/libsurface_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/x86/libclash.so: ALIGNED (2**14) /var/folders/temp/lib/x86/libbridge.so: UNALIGNED (2**12) /var/folders/temp/lib/x86/libimage_processing_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/arm64-v8a/libbarhopper_v3.so: ALIGNED (2**14) /var/folders/temp/lib/arm64-v8a/libsurface_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/arm64-v8a/libclash.so: ALIGNED (2**14) /var/folders/temp/lib/arm64-v8a/libbridge.so: ALIGNED (2**14) /var/folders/temp/lib/arm64-v8a/libimage_processing_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/x86_64/libbarhopper_v3.so: ALIGNED (2**14) /var/folders/temp/lib/x86_64/libsurface_util_jni.so: ALIGNED (2**14) /var/folders/temp/lib/x86_64/libclash.so: ALIGNED (2**14) /var/folders/temp/lib/x86_64/libbridge.so: ALIGNED (2**14) /var/folders/temp/lib/x86_64/libimage_processing_util_jni.so: ALIGNED (2**14) Found 4 unaligned libs (only arm64-v8a/x86_64 libs need to be aligned). ===================== ``` Diff: ```diff 4c4 < /var/folders/temp/lib/armeabi-v7a/libclash.so: UNALIGNED (2**12) --- > /var/folders/temp/lib/armeabi-v7a/libclash.so: ALIGNED (2**14) 9c9 < /var/folders/temp/lib/x86/libclash.so: UNALIGNED (2**12) --- > /var/folders/temp/lib/x86/libclash.so: ALIGNED (2**14) 14,15c14,15 < /var/folders/temp/lib/arm64-v8a/libclash.so: UNALIGNED (2**12) < /var/folders/temp/lib/arm64-v8a/libbridge.so: UNALIGNED (2**12) --- > /var/folders/temp/lib/arm64-v8a/libclash.so: ALIGNED (2**14) > /var/folders/temp/lib/arm64-v8a/libbridge.so: ALIGNED (2**14) 19,20c19,20 < /var/folders/temp/lib/x86_64/libclash.so: UNALIGNED (2**12) < /var/folders/temp/lib/x86_64/libbridge.so: UNALIGNED (2**12) --- > /var/folders/temp/lib/x86_64/libclash.so: ALIGNED (2**14) > /var/folders/temp/lib/x86_64/libbridge.so: ALIGNED (2**14) 22c22 < Found 10 unaligned libs (only arm64-v8a/x86_64 libs need to be aligned). --- > Found 4 unaligned libs (only arm64-v8a/x86_64 libs need to be aligned). ``` --- core/build.gradle.kts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index b0b655f00e..b74935ca83 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -29,6 +29,15 @@ golang { } android { + defaultConfig { + externalNativeBuild { + cmake { + // Support 16 KB page sizes. + arguments("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON") + } + } + } + productFlavors { all { externalNativeBuild { @@ -59,6 +68,7 @@ dependencies { afterEvaluate { tasks.withType(GolangBuildTask::class.java).forEach { it.inputs.dir(golangSource) + it.support16KbSizes() } } @@ -75,4 +85,25 @@ androidComponents.onVariants { variant -> } } } +} + +// TODO: upstream these fixes to https://github.com/Kr328/golang-gradle-plugin. +fun GolangBuildTask.support16KbSizes() { + val args = args?.toMutableList() ?: return + if (args.isEmpty()) return + val packageName = args.removeLast() + + // Support 16 KB page sizes. + val newLdFlags = "-linkmode=external -extldflags=-Wl,-z,max-page-size=16384" + + val ldFlagsIndex = args.indexOf("-ldflags") + if (ldFlagsIndex != -1 && ldFlagsIndex + 1 < args.size) { + val existingLdFlags = args[ldFlagsIndex + 1] + args[ldFlagsIndex + 1] = "$existingLdFlags $newLdFlags" + } else { + args.add("-ldflags=$newLdFlags") + } + + args.add(packageName) + this.args = args } \ No newline at end of file