调用connect方法不回调

在7.0以上的手机上,调用connect方法不回调。
发布时间: 2018-03-16 11:20

回答:

在7.0以上的手机上,调用connect方法不回调的问题:

从 Android 7.0 开始,系统将阻止应用动态链接非公开NDK 库,这种库可能会导致您的应用崩溃。

为帮助您识别加载私有库的问题,logcat 可能会生成一个警告或运行时错误。例如,如果您的应用面向 API 级别23 或更低级别,并在运行 Android 7.0 的设备上尝试访问私有库,您可能会看到一个类似于下面所示的警告:

03-21 17:07:51.502 31234 31234 W linker  : library "libsqlite.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120

这些 logcat 警告通知您哪个库正在尝试访问私有平台API,但不会导致您的应用崩溃。但是,如果应用面向 API级别24 或更高级别,logcat 会生成以下运行时错误,您的应用可能会崩溃:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libsqlite.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)

如果您的应用使用动态链接到私有平台 API 的第三方库,您可能也会看到上述 logcat 输出。

原因是7.0以后,Andorid不允许直接访问系统的私有so文件了。

两种解决方案:

(1)把targetSdkVersion改小于24。

(2)apk中带上需要的so文件,这儿是libsqlite.so

下载附件中的so文件,放到对应的文件夹下,如libs/armv7-abi/libsqlite.so,并注意你的gradle是否引用了这个目录,如 jniLibs.srcDirs = ['libs']

编译测试。

通过Android Studio的Analyze APK功能[Build -> Analyze APK...], 或直接解开apk包,查看是apk的lib目录下是否已包含libsqlite.so文件。

libsqlite.so的下载链接:

http://support.rongcloud.cn/kb/NTQw


我对此仍有疑问!继续追问