与天地兮比寿,与日月兮齐光。这篇文章主要讲述Android7.0后JNI库禁止访问私有API相关的知识,希望能为你提供帮助。
Google官网对于此修改的说明如下:
Private API (Enforced since API 24)
Native libraries must use only
public API, and must not link against non-NDK platform libraries. Starting with API 24 this rule is enforced and applications are no longer able to load non-NDK platform libraries. The rule is enforced by the dynamic linker, so non-public libraries are not accessible regardless of the way code tries to load them: System.loadLibrary(...), DT_NEEDED entries, and direct calls to dlopen(...) will fail in exactly the same way.
Users should have a consistent app experience across updates, and developers shouldn’t have to make emergency app updates to handle platform changes. For that reason, we recommend against using private C/C++ symbols. Private symbols aren’t tested as part of the Compatibility Test Suite (CTS) that all android devices must pass. They may not exist, or they may behave differently. This makes apps that use them more likely to fail on specific devices, or on future releases --- as many developers found when Android 6.0 Marshmallow switched from OpenSSL to BoringSSL.
In order to reduce the user impact of this transition, we’ve identified a set of libraries that see significant use from Google Play’s most-installed apps, and that are feasible for us to support in the short term (including libandroid_runtime.so, libcutils.so, libcrypto.so, and libssl.so). In order to give you more time to transition, we will temporarily support these libraries;
so if you see a warning that means your code will not work in a future release -- please fix it now!
$ readelf --dynamic libBroken.so | grep NEEDED 0x00000001 (NEEDED)Shared library: [libnativehelper.so] 0x00000001 (NEEDED)Shared library: [libutils.so] 0x00000001 (NEEDED)Shared library: [libstagefright_foundation.so] 0x00000001 (NEEDED)Shared library: [libmedia_jni.so] 0x00000001 (NEEDED)Shared library: [liblog.so] 0x00000001 (NEEDED)Shared library: [libdl.so] 0x00000001 (NEEDED)Shared library: [libz.so] 0x00000001 (NEEDED)Shared library: [libstdc++.so] 0x00000001 (NEEDED)Shared library: [libm.so] 0x00000001 (NEEDED)Shared library: [libc.so]
Potential problems: starting from API 24 the dynamic linker will not load private libraries, preventing the application from loading.
Resolution: rewrite your native code to rely only on public API. As a short term workaround, platform libraries without complex dependencies (libcutils.so) can be copied to the project. As a long term solution the relevant code must be copied to the project tree. SSL/Media/JNI internal/binder APIs should not be accessed from the native code. When necessary, native code should call appropriate public java API methods.
A complete list of public libraries is available within the NDK, under
platforms/android-API/usr/lib
.Note: SSL/crypto is a special case, applications must NOT use platform libcrypto and libssl libraries directly, even on older platforms. All applications should use GMS Security Provider to ensure they are protected from known vulnerabilities.
【Android7.0后JNI库禁止访问私有API】
推荐阅读
- 解决Android模拟器卡慢的问题
- PCIE_DMA(xapp1052学习笔记)
- Android搜索结果显示高亮(有数据滑动底部自动刷新)
- Android - 框架之Fresco的使用
- androidstdio 使用git上传csdn老失败,
- Android敏感词过滤主要类
- Android常用的图片加载库
- AndroidStdio小米手机安装APK失败
- .Net语言 APP开发平台——Smobiler学习日志(如何在手机中调用邮件发送接口)