I have built a Rust library for Android that uses SQLite internally, via Rusqlite:
[dependencies]
rusqlite = { version = "0.24.2", features = ["bundled"] }
I verified that it only depends on libc and libdl:
llvm-readelf -d target\aarch64-linux-android\debug\libmap_render.so
Dynamic section at offset 0x52768 contains 23 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libdl.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so]
...
And its symbol table doesn't contain any SQLite symbols. However the mere act of loading it (I'm using Flutter) like this (this is basically dlopen()).
DynamicLibrary.open("libmap_render.so")
Causes me to get loads of hidden API warnings like this:
Accessing hidden method Landroid/database/sqlite/SQLiteDatabase;-><clinit>()V (blacklist, linking, denied)
Accessing hidden field Landroid/database/sqlite/SQLiteDatabase;->DEBUG_CLOSE_IDLE_CONNECTIONS:Z (greylist-max-o, linking, denied)
Accessing hidden field Landroid/database/sqlite/SQLiteDatabase;->sActiveDatabases:Ljava/util/WeakHashMap; (greylist-max-o, linking, denied)
Accessing hidden field Landroid/database/sqlite/SQLiteDatabase;->CONFLICT_VALUES:[Ljava/lang/String; (greylist, linking, allowed)
Accessing hidden method Landroid/database/sqlite/SQLiteDatabase;-><init>(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;IIJLjava/lang/String;Ljava/lang/String;)V (greylist-max-o, linking, denied)
Accessing hidden method Landroid/database/sqlite/-$$Lambda$RBWjWVyGrOTsQrLCYzJ_G8Uk25Q;-><init>(Landroid/database/sqlite/SQLiteDatabase;)V (blacklist, linking, denied)
Accessing hidden method Landroid/database/sqlite/SQLiteDatabase;->beginTransaction(Landroid/database/sqlite/SQLiteTransactionListener;Z)V (greylist, linking, allowed)
Accessing hidden method Landroid/database/sqlite/SQLiteDatabase;->getThreadSession()Landroid/database/sqlite/SQLiteSession; (greylist, linking, allowed)
I have verified that not loading the library eliminates these errors. The errors really look like it is accessing Java code. But there's no JNI code in my library. It's a plain C library. It has no idea about WeakHashMap or CursorFactory.
What on earth is going on here? How does Android detect hidden API accesses from dynamically loaded libraries? And why is it saying I'm using a load of Java SQLite APIs when I'm 99% sure I'm not.
This is the relevant page from the documentation but all it has to say on linking is:
You can inspect your app's log messages to find the following details: The means of access: either linking, via reflection, or via JNI.