From 2640ebd58ff2c35dc2ad384c9db6fbe68ab05587 Mon Sep 17 00:00:00 2001 From: rohks Date: Thu, 10 Oct 2024 10:15:38 -0700 Subject: [PATCH] Add 16 KB page support for decoder extensions on Android 15 We need to rebuild any native components of the app to prevent crashes on devices with 16 KB page support. Tested on a device that supports 16 KB pages and runs Android 15, as well as on older Android devices. Issue: androidx/media#1685 PiperOrigin-RevId: 684488244 --- RELEASENOTES.md | 2 ++ libraries/decoder_av1/build.gradle | 8 ++++++++ libraries/decoder_av1/src/main/jni/CMakeLists.txt | 4 ++++ libraries/decoder_ffmpeg/build.gradle | 12 +++++++++++- libraries/decoder_ffmpeg/src/main/jni/CMakeLists.txt | 4 ++++ libraries/decoder_flac/build.gradle | 8 ++++++++ libraries/decoder_flac/src/main/jni/Android.mk | 2 ++ libraries/decoder_iamf/build.gradle | 8 ++++++++ libraries/decoder_iamf/src/main/jni/CMakeLists.txt | 4 ++++ libraries/decoder_opus/build.gradle | 8 ++++++++ libraries/decoder_opus/src/main/jni/Android.mk | 2 ++ libraries/decoder_vp9/build.gradle | 8 ++++++++ libraries/decoder_vp9/src/main/jni/Android.mk | 2 ++ 13 files changed, 71 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 73422d3f67..51cc4e5500 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -145,6 +145,8 @@ * Fix user info removal for URLs that contain encoded @ characters ([#1138](https://github.com/androidx/media/pull/1138)). * Decoder Extensions (FFmpeg, VP9, AV1, etc.): + * Add 16 KB page support for decoder extensions on Android 15 + ([#1685](https://github.com/androidx/media/issues/1685)). * MIDI extension: * Leanback extension: * Cast Extension: diff --git a/libraries/decoder_av1/build.gradle b/libraries/decoder_av1/build.gradle index 6f66ad5880..b793cb2d8e 100644 --- a/libraries/decoder_av1/build.gradle +++ b/libraries/decoder_av1/build.gradle @@ -27,6 +27,14 @@ android { } } } + + // TODO(Internal: b/372449691): Remove packagingOptions once AGP is updated + // to version 8.5.1 or higher. + packagingOptions { + jniLibs { + useLegacyPackaging true + } + } } // Configure the native build only if libgav1 is present to avoid gradle sync diff --git a/libraries/decoder_av1/src/main/jni/CMakeLists.txt b/libraries/decoder_av1/src/main/jni/CMakeLists.txt index 0202f0af57..4a39b6cd38 100644 --- a/libraries/decoder_av1/src/main/jni/CMakeLists.txt +++ b/libraries/decoder_av1/src/main/jni/CMakeLists.txt @@ -61,3 +61,7 @@ target_link_libraries(gav1JNI PRIVATE libgav1_static PRIVATE ${android_log_lib}) +# Enable 16 KB ELF alignment. +target_link_options(gav1JNI + PRIVATE "-Wl,-z,max-page-size=16384") + diff --git a/libraries/decoder_ffmpeg/build.gradle b/libraries/decoder_ffmpeg/build.gradle index 3c111c9e14..05b7c4f8ba 100644 --- a/libraries/decoder_ffmpeg/build.gradle +++ b/libraries/decoder_ffmpeg/build.gradle @@ -13,7 +13,17 @@ // limitations under the License. apply from: "$gradle.ext.androidxMediaSettingsDir/common_library_config.gradle" -android.namespace = 'androidx.media3.decoder.ffmpeg' +android { + namespace 'androidx.media3.decoder.ffmpeg' + + // TODO(Internal: b/372449691): Remove packagingOptions once AGP is updated + // to version 8.5.1 or higher. + packagingOptions { + jniLibs { + useLegacyPackaging true + } + } +} // Configure the native build only if ffmpeg is present to avoid gradle sync // failures if ffmpeg hasn't been built according to the README instructions. diff --git a/libraries/decoder_ffmpeg/src/main/jni/CMakeLists.txt b/libraries/decoder_ffmpeg/src/main/jni/CMakeLists.txt index fe74c78048..819cb5baa4 100644 --- a/libraries/decoder_ffmpeg/src/main/jni/CMakeLists.txt +++ b/libraries/decoder_ffmpeg/src/main/jni/CMakeLists.txt @@ -56,3 +56,7 @@ target_link_libraries(ffmpegJNI if(ANDROID_ABI STREQUAL "arm64-v8a") target_link_options(ffmpegJNI PRIVATE "-Wl,-Bsymbolic") endif() + +# Enable 16 KB ELF alignment. +target_link_options(ffmpegJNI + PRIVATE "-Wl,-z,max-page-size=16384") diff --git a/libraries/decoder_flac/build.gradle b/libraries/decoder_flac/build.gradle index 0da6fa2e52..a7fa55ee40 100644 --- a/libraries/decoder_flac/build.gradle +++ b/libraries/decoder_flac/build.gradle @@ -23,6 +23,14 @@ android { } androidTest.assets.srcDir '../test_data/src/test/assets' } + + // TODO(Internal: b/372449691): Remove packagingOptions once AGP is updated + // to version 8.5.1 or higher. + packagingOptions { + jniLibs { + useLegacyPackaging true + } + } } dependencies { diff --git a/libraries/decoder_flac/src/main/jni/Android.mk b/libraries/decoder_flac/src/main/jni/Android.mk index 69520a16e5..b19d169111 100644 --- a/libraries/decoder_flac/src/main/jni/Android.mk +++ b/libraries/decoder_flac/src/main/jni/Android.mk @@ -35,4 +35,6 @@ LOCAL_CFLAGS += -D_REENTRANT -DPIC -DU_COMMON_IMPLEMENTATION -fPIC -DHAVE_SYS_PA LOCAL_CFLAGS += -O3 -funroll-loops -finline-functions -DFLAC__NO_ASM '-DFLAC__HAS_OGG=0' LOCAL_LDLIBS := -llog -lz -lm +# Enable 16 KB ELF alignment. +LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384" include $(BUILD_SHARED_LIBRARY) diff --git a/libraries/decoder_iamf/build.gradle b/libraries/decoder_iamf/build.gradle index f366047d33..17970629bc 100644 --- a/libraries/decoder_iamf/build.gradle +++ b/libraries/decoder_iamf/build.gradle @@ -27,6 +27,14 @@ android { } } } + + // TODO(Internal: b/372449691): Remove packagingOptions once AGP is updated + // to version 8.5.1 or higher. + packagingOptions { + jniLibs { + useLegacyPackaging true + } + } } // Configure the native build only if libiamf is present to avoid gradle sync diff --git a/libraries/decoder_iamf/src/main/jni/CMakeLists.txt b/libraries/decoder_iamf/src/main/jni/CMakeLists.txt index e94494576b..32a65ed1ac 100644 --- a/libraries/decoder_iamf/src/main/jni/CMakeLists.txt +++ b/libraries/decoder_iamf/src/main/jni/CMakeLists.txt @@ -44,3 +44,7 @@ target_link_libraries(iamfJNI PRIVATE android PRIVATE iamf PRIVATE ${android_log_lib}) + +# Enable 16 KB ELF alignment. +target_link_options(iamfJNI + PRIVATE "-Wl,-z,max-page-size=16384") diff --git a/libraries/decoder_opus/build.gradle b/libraries/decoder_opus/build.gradle index af01cad013..763eba00b1 100644 --- a/libraries/decoder_opus/build.gradle +++ b/libraries/decoder_opus/build.gradle @@ -23,6 +23,14 @@ android { } androidTest.assets.srcDir '../test_data/src/test/assets' } + + // TODO(Internal: b/372449691): Remove packagingOptions once AGP is updated + // to version 8.5.1 or higher. + packagingOptions { + jniLibs { + useLegacyPackaging true + } + } } dependencies { diff --git a/libraries/decoder_opus/src/main/jni/Android.mk b/libraries/decoder_opus/src/main/jni/Android.mk index 0b06d9ecd8..676774ed49 100644 --- a/libraries/decoder_opus/src/main/jni/Android.mk +++ b/libraries/decoder_opus/src/main/jni/Android.mk @@ -30,4 +30,6 @@ LOCAL_CPP_EXTENSION := .cc LOCAL_SRC_FILES := opus_jni.cc LOCAL_LDLIBS := -llog -lz -lm LOCAL_STATIC_LIBRARIES := libopus +# Enable 16 KB ELF alignment. +LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384" include $(BUILD_SHARED_LIBRARY) diff --git a/libraries/decoder_vp9/build.gradle b/libraries/decoder_vp9/build.gradle index d7a29e5427..81dd71500b 100644 --- a/libraries/decoder_vp9/build.gradle +++ b/libraries/decoder_vp9/build.gradle @@ -23,6 +23,14 @@ android { } androidTest.assets.srcDir '../test_data/src/test/assets' } + + // TODO(Internal: b/372449691): Remove packagingOptions once AGP is updated + // to version 8.5.1 or higher. + packagingOptions { + jniLibs { + useLegacyPackaging true + } + } } dependencies { diff --git a/libraries/decoder_vp9/src/main/jni/Android.mk b/libraries/decoder_vp9/src/main/jni/Android.mk index cb7571a1b0..0794feb730 100644 --- a/libraries/decoder_vp9/src/main/jni/Android.mk +++ b/libraries/decoder_vp9/src/main/jni/Android.mk @@ -32,6 +32,8 @@ LOCAL_SRC_FILES := vpx_jni.cc LOCAL_LDLIBS := -llog -lz -lm -landroid LOCAL_SHARED_LIBRARIES := libvpx LOCAL_STATIC_LIBRARIES := cpufeatures +# Enable 16 KB ELF alignment. +LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384" include $(BUILD_SHARED_LIBRARY) $(call import-module,android/cpufeatures)