Android构建环境问题:使用Prefab时.so文件无法打包进APK(仅本地)
使用OpenSSL Prefab时libcrypto.so/libssl.so未打包进APK问题解决
问题现象
集成OpenSSL Prefab的全新空白NDK项目,构建后libcrypto.so和libssl.so未被打包进APK,运行应用时抛出UnsatisfiedLinkError,提示找不到libcrypto.so。
错误日志
FATAL EXCEPTION: main (Ask Gemini) Process: com.example.myapplication2, PID: 3723 java.lang.UnsatisfiedLinkError: dlopen failed: library "libcrypto.so" not found: needed by /data/app/~~ZiyE6_J10pUvMSnKs4xW4A==/com.example.myapplication2-z6zIpCtVD-xUDRzIzDQC6A==/base.apk!/lib/x86_64/libmyapplication2.so in namespace clns-6 at java.lang.Runtime.loadLibrary0(Runtime.java:1082) at java.lang.Runtime.loadLibrary0(Runtime.java:1003) at java.lang.System.loadLibrary(System.java:1661) at com.example.myapplication2.MainActivity.<clinit>(MainActivity.java:14) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45) at android.app.Instrumentation.newActivity(Instrumentation.java:1378) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3676) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8177) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
已完成排查
- 验证APK内容,确认
libcrypto.so/libssl.so未被打包 - 相同项目在同系统的其他机器上可正常构建
- 已尝试重装SDK、Android Studio、Java,创建新项目并清理所有已知缓存(未重装Windows 11)
- 手动构建并打包库可正常工作,但希望使用Prefab而非本地特殊处理
关键差异发现
对比正常机器的构建日志,本地机器缺少将OpenSSL的libcrypto.so、libssl.so硬链接到构建目录的步骤,仅处理了libc++_shared.so,无报错直接跳过,且Gradle缓存已下载OpenSSL相关文件。
可能的解决方法
- 检查权限与运行方式:以管理员身份运行Android Studio,确保其有足够权限访问Gradle缓存和构建目录,避免硬链接操作因权限不足被静默跳过
- 确认文件系统类型:确保项目目录和Gradle缓存所在分区为NTFS(FAT32等文件系统不支持硬链接),若不是则将项目移至NTFS分区
- 配置Prefab强制链接:在模块的
build.gradle中添加以下配置,强制Gradle处理OpenSSL库的链接:android { buildFeatures { prefab true } prefab { openssl { link true } } } - 对齐Gradle/AGP版本:检查其他正常机器使用的Gradle和Android Gradle Plugin(AGP)版本,将本地版本调整为一致,避免版本兼容性问题导致的链接逻辑异常
- 显式声明CMake依赖:在
CMakeLists.txt中明确链接OpenSSL库,确保Gradle能识别到依赖关系:find_package(openssl REQUIRED CONFIG) target_link_libraries(your-native-lib-name PRIVATE openssl::crypto openssl::ssl)
内容的提问来源于stack exchange,提问作者Gradyn Wursten
相关产品推荐
相关产品推荐

