如何排查.NET MAUI Android应用DllNotFoundException缺失的依赖?
解决Android上.NET MAUI调用Hyperledger Anoncreds SDK时的DllNotFoundException问题
一、定位缺失的.so依赖
1. 查看Android动态库加载日志
通过ADB命令抓取系统加载动态库的详细日志,能直接看到加载失败的具体库名:
adb logcat | grep "dlopen"
日志中会记录所有.so文件的加载尝试,包括失败条目,比如dlopen failed: library "libxxx.so" not found,这就是缺失的依赖。
2. 分析SDK核心.so的依赖链
用Android NDK自带的readelf工具,直接分析SDK提供的主.so文件(比如libanoncreds.so),列出它直接依赖的所有动态库:
readelf -d /path/to/your/sdk/lib/libanoncreds.so | grep NEEDED
将输出的依赖列表和你打包到MAUI项目的.so文件对比,即可找出遗漏的库。
3. 排查MAUI项目的打包配置
检查项目.csproj文件中AndroidNativeLibrary的配置,确保所有需要的.so都被正确包含,并且适配目标设备的ABI架构:
<ItemGroup> <AndroidNativeLibrary Include="libs\**\*.so"> <Abi>arm64-v8a;x86_64</Abi> <!-- 匹配你的模拟器/设备架构 --> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </AndroidNativeLibrary> </ItemGroup>
二、Android平台类似Dependency Walker的分析工具
1. readelf(Android NDK自带)
最实用的命令行工具,能直接解析.so的依赖信息,功能类似Dependency Walker的核心依赖分析,是排查Android动态库依赖的首选。
2. Android版ldd
获取适配Android的ldd工具,推送到设备后运行:
adb push ldd /data/local/tmp/ adb shell chmod +x /data/local/tmp/ldd adb shell /data/local/tmp/ldd /path/to/apk/lib/arm64-v8a/libanoncreds.so
输出会显示每个依赖的加载状态,明确标记缺失的库。
3. objdump(Android NDK自带)
和readelf功能类似,可用来查看.so的依赖:
objdump -x /path/to/your/sdk/lib/libanoncreds.so | grep NEEDED
额外注意事项
- Rust编译的SDK可能依赖系统级库(如libssl、libcrypto),若SDK未静态编译这些依赖,需将对应.so也打包到项目中。
- 针对抛出异常的特定SDK方法,查看对应的Rust源码实现,定位该功能用到的额外依赖,缩小排查范围。
内容的提问来源于stack exchange,提问作者HPe
相关产品推荐
相关产品推荐

