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

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

ヘッダ集合の収集
こういう感じでヘッダを列挙し、それらの #include<>
をするだけのファイルをビルドするのに必要なヘッダを集めていく。
... .clang-format
を出荷してるとか、けっこう、、アレだな。。とりあえず xen
とかLinuxカーネルヘッダの多くは不要に見える。
Bionicの状況はドキュメントされている。
wait.h
utmp.h
これは単なる <sys/wait.h>
にリダイレクトするだけのヘッダになっている。こういうのは自然とundocumentedなヘッダになってしまうな。。他には termio.h
がある。
utmp.h
はそもそもbionicでは機能する実装が用意されていないようだ。ただし、 int login_tty(int __fd) __INTRODUCED_IN(23);
とある。...何で。。?
time64.h
これは32bit ABI専用。
stdatomic.h
Bionic libcの Bionicも stdatomic.h
を出荷しているが、実際にはClangに付属のものが使われる。つまり、Clang以外のコンパイラを使うケースを配慮している。。?
内容は両者で一致している。Cでは bits/stdatomic.h
にリダイレクトされる。
stdio_ext.h
Solaris互換のstdio拡張。glibcにあるのでbionicにもある。

ライブラリシンボルの列挙
Android NDKで使用して良いシンボルはAPI毎に静的に決まっている。また、ELFのsymbol versioningを使って.so毎にシンボルの打ち分けもしている: https://android.googlesource.com/platform/bionic/+/main/libc/libc.map.txt など。
基本的には tflite_support_libz.a
のような例外を除いて全てのAPIが .so 形式で提供されており、そこに存在するシンボルは呼出して良いというルールになっている。
パブリック ライブラリの完全なリストは、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
シンボル名にはセパレーターである @
または @@
に続いてバージョン名も出る。いずれもセパレーター以降がバージョン名を表わし、 @@
の場合はそのシンボルがデフォルトで使用されることを表わす。