You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:17:09