A year after the NDK default changed, the shared libraries in most reports are correctly aligned. The remaining failures are asset files: an uncompressed texture atlas or a custom pack file mapped with mmap must start at a 16 KB boundary, or the mapping silently falls back to a copy.
The fix is in the packer, not the loader: pad the start of each mapped file to 16 KB and record the padded offset in the index. The cost is at most 16 KB per file and a slightly larger download.
We also see one Android-specific trap: AssetManager returns a file descriptor, and the offset of the asset inside the APK is not necessarily aligned even when the asset itself is. If you map assets directly, copy the header, or use the uncompressed-asset path deliberately.