Podczas testowania mojej gry Bricks Color Pick na nowym urządzeniu z Androidem 13, zauważyłem dziwny problem z dźwiękiem. Zwiększenie rozmiaru bufora danych nie pomogło. Rozwiązaniem okazało się przekompilowanie biblioteki OpenAL z użyciem biblioteki Oboe. OpenAL jest domyślnym backendem obsługi dźwięku w Castle Game Engine.
Pobranie źródeł
Do wykonania kompilacji potrzebujemy dwa repozytoria:
- openal-soft – https://github.com/kcat/openal-soft
- oboe – https://github.com/google/oboe
Na początek tworzymy folder na źródła:
mkdir openal
Następnie pobieramy openal-soft:
git clone https://github.com/kcat/openal-soft.git
Po pobraniu źródeł wybieramy ostatni stabilny tag np. 1.23.1
cd openal-soft git checkout 1.23.1 cd ..
Następnie pobieramy oboe – bez tego frameworka dźwięk na androidzie nie działa za dobrze.
git clone https://github.com/google/oboe.git
Po pobraniu ustawiamy stabilny tag np.: 1.7.0
.
cd oboe git checkout 1.7.0 cd ..
Źródła mamy przygotowane czas ustawić środowisko.
Zmienne środowiskowe
Musimy mieć zainstalowane NDK i ustawiamy sobie pomocniczą zmienną środowiskową NDK_ROOT
. Ja będę używał wersji 22.1.7171670. Ścieżka na twoim systemie będzie oczywiście inna:
export NDK_ROOT=/home/and3md/android/sdk/ndk/22.1.7171670
Przygotowanie do kompilacji
Będziemy musieli wykonać kompilacje dla wszystkich obsługiwanych architektur najważniejsze to:
- armeabi-v7a
- arm64-v8a
- x86
- x86_64
Każda z architektur oraz każda wersja NDK może wymagać/obsługiwać innego minimalnego poziomu API, np. NDK 22 w moim przypadku ma dla:
armeabi-v7a
–16
- arm64-v8a
-
22
Poziom API będziemy ustawiać za pomocą ANDROID_PLATFORM
, a samą architekturę za pomocą ANDROID_ABI
np.:
-DANDROID_ABI=armeabi-v7a -DANDROID_PLATFORM=16
Wybór STL
Jeżeli mamy tylko jedną bibliotekę w projekcie możemy użyć c++_static
. W przypadku gdy używamy więcej bibliotek zalecane jest c++_shared
. Więcej informacji: https://developer.android.com/ndk/guides/cpp-support#static_runtimes
Folder źródeł oboe
Przekazujemy w parametrze OBOE_SOURCE
:
-DOBOE_SOURCE=/home/and3md/fpc/openal/oboe
Konfiguracja cmake i kompilacja
Wchodzimy do folderu openal-soft/build
.
Dla architektury armeabi-v7a
Uruchamiamy polecenie cmake
aby wygenerować makefile:
cmake .. -DANDROID_STL=c++_shared -DCMAKE_TOOLCHAIN_FILE=${NDK_ROOT}/build/cmake/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI=armeabi-v7a -DOBOE_SOURCE=../oboe -DANDROID_PLATFORM=16
uruchamiamy kompilację:
make
Kopiujemy wynikowy plik libopenal.so, ponieważ źródła wykorzystamy do kompilacji dla następnej architektury.
Dla architektury arm64-v8a
Czyścimy źródła
make clean
Uruchamiamy polecenie cmake aby wygenerować makefile
cmake .. -DANDROID_STL=c++_shared -DCMAKE_TOOLCHAIN_FILE=${NDK_ROOT}/build/cmake/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI=arm64-v8a -DOBOE_SOURCE=../oboe -DANDROID_PLATFORM=22
uruchamiamy kompilację:
make
Kopiujemy wynikowy plik libopenal.so.
Dla architektury x86
Czyścimy źródła:
make clean
Uruchamiamy polecenie cmake aby wygenerować makefile
cmake .. -DANDROID_STL=c++_shared -DCMAKE_TOOLCHAIN_FILE=${NDK_ROOT}/build/cmake/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI=x86 -DOBOE_SOURCE=../oboe -DANDROID_PLATFORM=16
uruchamiamy kompilację:
make
Kopiujemy wynikowy plik libopenal.so.
Dla architektury x86_64:
Czyścimy źródła
make clean
Uruchamiamy polecenie cmake aby wygenerować makefile
cmake .. -DANDROID_STL=c++_shared -DCMAKE_TOOLCHAIN_FILE=${NDK_ROOT}/build/cmake/android.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI=x86_64 -DOBOE_SOURCE=../oboe -DANDROID_PLATFORM=16
uruchamiamy kompilację:
make
Kopiujemy wynikowy plik libopenal.so.
Zmniejszenie rozmiaru plików
Wygenerowane pliki mogą być bardzo duże (około 15 MB. Możemy zmniejszyć ich wielkość uruchamiając polecenie strip
z odpowiedniej architektury:
${NDK_ROOT}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/strip libopenal.so ${NDK_ROOT}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/aarch64-linux-android/bin/strip libopenal.so ${NDK_ROOT}/toolchains/x86-4.9/prebuilt/linux-x86_64/i686-linux-android/bin/strip libopenal.so ${NDK_ROOT}/toolchains/x86_64-4.9/prebuilt/linux-x86_64/x86_64-linux-android/bin/strip libopenal.so
I to wszystko 🙂