Open3

Reposoup: Android NDKの無駄ヘッダを探す

okuokuokuoku

ヘッダ間の依存関係を収集するツールを用意したので、それを使ってAndroidの公開APIを使うのに必要のないヘッダを探してみる。

okuokuokuoku

ヘッダ集合の収集

https://github.com/okuoku/rs-checker-proto/blob/521ba93a0d0f1007017b92e0888022d5dc789b59/headercheck/CMakeLists.txt#L113-L118

こういう感じでヘッダを列挙し、それらの #include<> をするだけのファイルをビルドするのに必要なヘッダを集めていく。

https://gist.github.com/okuoku/1a27da324ce5b94032f4e269d20d6665

... .clang-format を出荷してるとか、けっこう、、アレだな。。とりあえず xen とかLinuxカーネルヘッダの多くは不要に見える。

Bionicの状況はドキュメントされている。

https://android.googlesource.com/platform/bionic/+/HEAD/docs/status.md

wait.h utmp.h

これは単なる <sys/wait.h> にリダイレクトするだけのヘッダになっている。こういうのは自然とundocumentedなヘッダになってしまうな。。他には termio.h がある。

https://android.googlesource.com/platform/bionic/+/e0848bbf/libc/include/wait.h

utmp.h はそもそもbionicでは機能する実装が用意されていないようだ。ただし、 int login_tty(int __fd) __INTRODUCED_IN(23); とある。...何で。。?

time64.h

これは32bit ABI専用。

https://android.googlesource.com/platform/bionic/+/e0848bbf/libc/include/time64.h

Bionic libcの stdatomic.h

Bionicも stdatomic.h を出荷しているが、実際にはClangに付属のものが使われる。つまり、Clang以外のコンパイラを使うケースを配慮している。。?

内容は両者で一致している。Cでは bits/stdatomic.h にリダイレクトされる。

https://android.googlesource.com/platform/bionic/+/e0848bbf/libc/include/stdatomic.h

stdio_ext.h

Solaris互換のstdio拡張。glibcにあるのでbionicにもある。

https://android.googlesource.com/platform/bionic/+/e0848bbf/libc/include/stdio_ext.h

okuokuokuoku

ライブラリシンボルの列挙

Android NDKで使用して良いシンボルはAPI毎に静的に決まっている。また、ELFのsymbol versioningを使って.so毎にシンボルの打ち分けもしている: https://android.googlesource.com/platform/bionic/+/main/libc/libc.map.txt など。

基本的には tflite_support_libz.a のような例外を除いて全てのAPIが .so 形式で提供されており、そこに存在するシンボルは呼出して良いというルールになっている。

https://developers-jp.googleblog.com/2016/07/ndk-android.html

パブリック ライブラリの完全なリストは、NDK 内で参照できます。 platforms/android-API/usr/lib 以下をご覧ください。

実際には、NDK内の toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/x86_64-linux-android/35/libneuralnetworks.so のようなパスに格納されている。

$ llvm-nm --no-demangle --quiet --defined-only --dynamic libnativewindow.so
0000000000001000 T AHardwareBuffer_acquire@@LIBNATIVEWINDOW
0000000000001008 T AHardwareBuffer_allocate@@LIBNATIVEWINDOW
0000000000001010 T AHardwareBuffer_describe@@LIBNATIVEWINDOW

シンボル名にはセパレーターである @ または @@ に続いてバージョン名も出る。いずれもセパレーター以降がバージョン名を表わし、 @@ の場合はそのシンボルがデフォルトで使用されることを表わす。