系统预置三方应用so库加载失败:System.err: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol...
最新推荐文章于 2023-04-06 12:43:12 发布
AmazingMQ
最新推荐文章于 2023-04-06 12:43:12 发布
1.问题:预置三方应用到system/app目录,且保持应用的签名即LOCAL_CERTIFICATE := PRESIGNED;预置成功后,使用应用过程中,应用闪退。但是直接安装(adb install或是把apk放在文件管理器中然后进行安装)不存在此问题。
2.关键Log:
12-22 19:33:30.664 10290 10290 W System.err: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "EVP_aead_null_sha1_ssl3" referenced by "/system/app/xxxAppName/xxxAppName.apk!/lib/arm64-v8a/libssl.so"...
12-22 19:33:30.664 10290 10290 W System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:1071)
12-22 19:33:30.664 10290 10290 W System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
12-22 19:33:30.664 10290 10290 W System.err: at java.lang.System.loadLibrary(System.java:1667)
12-22 19:33:30.664 10290 10290 W System.err: at com.baidu.mapsdkplatform.comapi.NativeLoader.a(NativeLoader.java:103)
12-22 19:33:30.667 10290 10290 E NativeLoader: loadException
12-22 19:33:30.667 10290 10290 E NativeLoader: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "EVP_aead_null_sha1_ssl3" referenced by "/data/data/xxx.xxx.xxx/files/libs/arm64-v8a/libssl.so"...
12-22 19:33:30.667 10290 10290 E NativeLoader: at java.lang.Runtime.load0(Runtime.java:938)
12-22 19:33:30.667 10290 10290 E NativeLoader: at java.lang.System.load(System.java:1631)
12-22 19:33:30.667 10290 10290 E NativeLoader: at com.baidu.mapsdkplatform.comapi.NativeLoader.f(NativeLoader.java:214)
12-22 19:33:30.676 10290 10290 E NativeLoader: BaiduMapSDK_map_v7_1_0 Failed to load.
12-22 19:33:30.676 10290 10290 E NativeLoader: ssl Failed to load.
在/system/vendor/lib/以及/system/vendor/lib64/下都有libssl.so
3.Android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := xxxAppName
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := find_xxx-release.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
4.分析过程:
(1).最开始错以为是找不到so库,所以在mk文件中增加了如下修改:
LOCAL_PREBUILT_JNI_LIBS_arm64 += \
lib/arm64-v8a/libBaiduMapSDK_base_v7_1_0.so \
lib/arm64-v8a/libBaiduMapSDK_map_v7_1_0.so \
lib/arm64-v8a/libcrypto.so \
lib/arm64-v8a/libgnustl_shared.so \
lib/arm64-v8a/libhardware_jni.so \
lib/arm64-v8a/libindoor.so \
lib/arm64-v8a/liblocSDK8a.so \
lib/arm64-v8a/libssl.so
验证依然不行,仔细看才发现不是so找不到,而是Fail to load:
12-22 19:33:30.676 10290 10290 E NativeLoader: BaiduMapSDK_map_v7_1_0 Failed to load.
12-22 19:33:30.676 10290 10290 E NativeLoader: ssl Failed to load.
所以此问题不是so库找不到的问题。
(2).排除权限问题
adb shell setenforce 0,设置成Permissive mode,无效,问题依然存在。(因为根本没有报avc问题,所以这步只是为了排除)
(3).开始查找Failed to load的解决办法
尝试了一系列百度上的办法,如:
在mk中添加:LOCAL_LDFLAGS += -fuse-ld=bfd //无效
怀疑是混淆问题,在mk中添加: LOCAL_PROGUARD_ENABLED := disabled //无效
怀疑是odex问题,在mk中添加: LOCAL_DEX_PREOPT := false //无效
修改system/core/libnativeloader/native_loader.cpp中的:
修改前:static constexpr const char* kWhitelistedDirectories = "/data:/mnt/expand";
修改后:static constexpr const char* kWhitelistedDirectories = "/data:/mnt/expand:/system/app";
也无效。
5.问题原因:Android N 之后, third party app 会被限定不能使用非AOSP library (ex: libaal)
在N版本中为了增强安全性,三方应用不能随意加载系统没有暴露出来的库,从而会导致三方应用无法运行。
系统的应用,可以调用系统库,而三方应用,只能调用或者加载NDK 暴露出来的一些 库,如libc.so等之类的和他自身的一些库。
详细内容参考google 官方说明 https://source.android.com/devices/tech/config/namespaces_libraries.html
6.有效修改方案
方案一:应用预置成可卸载方案,即预置在data/app目录下,不会报错及闪退。
方案二:应用还是预置在system/app目录下不可卸载,但是修改签名为:LOCAL_CERTIFICATE := platform,不会报错及闪退。
方案三:根据log,此问题的原因是Android N 之后, third party app 会被限定不能使用非AOSP library;
所以把机器中的system/etc/public.libraries.txt文件pull出来,把libssl.so添加到system/etc/public.libraries.txt文件中;
即把libssl.so开放出来;然后再把public.libraries.txt文件push进去,重启手机即可验证。
因为system/etc/public.libraries.txt文件是由/system/core/rootdir/etc/public.libraries.android.txt生成,
所以真正的修改是:把libssl.so添加到/system/core/rootdir/etc/public.libraries.android.txt中;
这样全编译出来,在system/etc/public.libraries.txt文件中就包含了libssl.so。完成~
2021.5.7日更新:
真正的原因是:应用自带的libssl.so包含一个外部lib未实现的函数(/system/lib64/libssl.so不包含),所以load失败;即系统的libssl.so与应用的libssl.so版本不一致导致。
上面的三种方案其实都不是好的解法,准确说不是从根本上解决,如第三种方式,这种方式由于把系统的libssl.so暴露出来,会导致其它同样使用了libssl.so库的三方应用出现闪退,原因也是系统的libssl.so与应用的libssl.so版本不一致导致。
解决方式:(1)应用把自带的libssl.so替换成系统的/system/lib64/libssl.so,可以解决此问题(验证可行);
(2)把系统的/system/lib64/libssl.so换成应用的libssl.so,可以解决此问题(验证可行);(百度SDK推荐,但是系统不推荐,怕出现不可控风险等);
即把应用和系统的libssl.so的版本统一起来,或者说版本可以不一样,只要不出现这种“应用自带的libssl.so包含一个外部lib未实现的函数(/system/lib64/libssl.so不包含)”即可。
其实之前的方案三与现在的解决方式没有本质的区别,都是使系统的libssl.so与应用的libssl.so版本一致,只不过方案三由于把系统的libssl.so暴露出来,影响太大,即对所有的三方应用均产生影响;而现在的解决方式(1)只会对单独的应用产省影响。
可以参考百度关于Android定位SDK的说明
http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/create-project/android-studio
系统预置三方应用so库加载失败:System.err: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol...
1.问题:预置三方应用到system/app目录,且保持应用的签名即LOCAL_CERTIFICATE := PRESIGNED;预置成功后,使用应用过程中,应用闪退。但是直接安装(adb install或是把apk放在文件管理器中然后进行安装)不存在此问题。2.关键Log:12-22 19:33:30.664 10290 10290 W System.err: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol
今天在做一个SDK开发的时候,因为library中用到了.so
库
文件,所以我直接从之前的项目中复制过来对应的.so文件到libs中,但是开发完成后,运行直接到native方法处就崩溃。。。我一脸蒙蔽哈。。。
这TM什么情况,在native处崩溃后,没有任何错误提示,搞的我1个小时定位问题。。。
最后实在搞不了了,还是写了个日志输出代码,发现这个错误:
java
.
lan
g.Unsatisf...
今天测试突然给我说我写的XX界面一点app就crash了!
纳尼,我肯定表示不服啊!怎么可能出现一点击就崩溃的情况呢,明明自己的测试了的!
然后我又用自己的测试机试了下没问题(Version:5.0.2),然后又使用crash的测试手机(Version:4.4),乖乖,居然是4.4才会出现的情况!(4.4以下没有验证哈!可能都会吧!!!)
lo
g显示:
W/System.
err
:
java
.
lan
g.NoClassDefFound
Err
or: android/os/PersistableBundle
W/System.
err
: at
java
.
lan
g.Class.getDeclar
原文:http://www.ve
lo
cityreviews.com/forums/t390018-
java
-
lan
g-
unsatisfiedlinkerror
-cant-
lo
ad-library-from-jni-code.html
For System.
lo
adLib
Android的本地实现层次具有基本的
库
和程序。这些
库
和程序是Android基本
系统
运行的基础。主要包含了以下的内容:C语言底层
库
libcutils、Init进程、Shell工具、C++工具
库
libutils。
Android的源代码结构分为三部分:
(1)核心工程:是建立android
系统
的基础,在根目录下的若干文件夹。
bionic:提供C/C++标准
库
的功能,它
### 回答1:
SQLAlchemy.exc.Operational
Err
or: (pymysql.
err
.Operational
Err
or) 是一个数据
库
操作错误,通常是由于数据
库
连接问题或语法错误引起的。这个错误可能会导致
应用
程序无法正常工作,需要及时解决。常见的解决方法包括检查数据
库
连接配置、检查SQL语句是否正确、检查数据
库
是否正常运行等。
### 回答2:
Sqlalchemy.exc.Operational
Err
or: (pymysql.
err
.Operational
Err
or)是一种在使用Sqlalchemy
库
时可能出现的错误,通常意味着连接数据
库
时出现了一些问题。这种错误可能会导致某些数据
库
操作无法顺利完成。
要分析这个错误,需要考虑以下几个方面:
1. 数据
库
连接问题:这种错误可能是由于数据
库
连接出现了问题。例如,可能是因为数据
库
停机、网络故障、数据
库
登录信息有误等原因导致的。解决此问题需要检查数据
库
连接信息是否正确,是否能够正常连接数据
库
。
2. 权限问题:有时,该错误也可能是因为SQLAlchemy
库
没有足够的访问权限而导致的。这可能是由于数据
库
管理员在设置数据
库
访问权限时限制了某些用户的权限。解决此问题需要检查是否已授予SQLAlchemy
库
足够的权限。
3. SQL 语句问题:这种错误也可能由于SQL语句存在某种问题导致的。可能是由于SQL语法错误、查询条件错误、列名或表名错误等等。解决此问题需要检查SQL语句的正确性,并确保SQL语句符合SQLAlchemy
库
的要求。
总之,要解决Sqlalchemy.exc.Operational
Err
or: (pymysql.
err
.Operational
Err
or)错误,需要综合考虑上述问题,并对具体情况进行逐一排查和解决。在排查可能原因时,可以通过错误日志或其他工具来进行诊断和调试。
### 回答3:
sqlalchemy.exc.operational
err
or: (pymysql.
err
.operational
err
or)是发生在使用SQLAlchemy的过程中的一个异常错误,它通常是由于连接数据
库
时出现问题导致的。
具体来说,这个错误通常是由于以下几种情况引起的:
1.数据
库
连接超时:在进行数据
库
操作时,如果连接超时,就会导致出现这个错误。这种情况下,可以尝试调整连接超时时间或增加数据
库
服务器资源。
2.网络中断或数据
库
服务器宕机:当网络发生故障或数据
库
服务器宕机时,也会导致这个错误。这种情况下,可以检查网络连接或重启数据
库
服务器来解决问题。
3.数据
库
权限不足:在进行数据
库
操作时,如果当前用户没有足够的权限进行该操作,就会出现这个错误。这种情况下,可以检查数据
库
授权或更改当前用户权限来解决问题。
4.SQL语句错误:在执行SQL语句时,如果语法错误或逻辑错误,也会导致这个错误。这种情况下,可以检查SQL语句是否正确或优化SQL语句来解决问题。
总之,如果出现sqlalchemy.exc.operational
err
or: (pymysql.
err
.operational
err
or)错误,首先需要检查数据
库
连接是否正常,同时还要注意检查SQL语句和数据
库
权限等方面的问题,才能找到解决方法并消除错误。
CSDN-Ada助手:
android:launchMode与android:taskAffinity之间的相互影响
AmazingMQ:
android:launchMode与android:taskAffinity之间的相互影响
执行adb disable-verity提示:Device is locked. Please unlock the device first
ashura417:
Failed to load WebView provider: No WebView installed
浮华苍生_mo: