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

基于Expo Modules集成Android动态功能的技术求助

解决方案:Expo应用集成minSdk30+库的动态功能模块兼容方案

修复SoLoader循环依赖崩溃问题

动态模块与主模块重复依赖SoLoader是启动崩溃的核心原因,按以下步骤处理:

  • 在动态功能模块的build.gradle中,排除主模块传递的SoLoader依赖:
    dependencies {
        implementation(project(":app")) {
            exclude group: "com.facebook.soloader", module: "soloader"
        }
        // 你的minSdk30+外部库依赖
        implementation 'com.example:required-lib:1.0.0'
    }
    
  • 主模块build.gradle中保留原有SoLoader依赖即可,无需额外修改。

配置Expo与动态模块的条件交付

  1. 修改主模块AndroidManifest.xml,添加动态模块的安装条件(仅API30+用户自动安装):
    <!-- 需在manifest根节点添加命名空间:xmlns:dist="http://schemas.android.com/apk/distribution" -->
    <dist:module
        dist:instant="false"
        dist:title="@string/feature_module_title">
        <dist:delivery>
            <dist:install-time>
                <dist:conditions>
                    <dist:min-sdk-version>30</dist:min-sdk-version>
                </dist:conditions>
            </dist:install-time>
        </dist:delivery>
        <dist:fusing dist:include="true" />
    </dist:module>
    
  2. 在Expo的app.json中声明动态模块,同时保留主应用的低minSdk版本:
    "android": {
        "minSdkVersion": 21, // 保持你原有最低版本
        "dynamicFeatures": [":your_feature_module_name"],
        "extraBuildGradle": "android/extra-build.gradle" // 可选,用于自定义构建逻辑
    }
    

代码层面的隔离与条件调用

  • 主应用中仅在API30+环境下加载动态模块及外部库,避免低版本触发类加载:
    import com.google.android.play.core.splitinstall.SplitInstallManagerFactory
    import com.google.android.play.core.splitinstall.SplitInstallRequest
    
    // 在合适的初始化时机(如Application onCreate或首页启动)执行
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val splitInstallManager = SplitInstallManagerFactory.create(this)
        val request = SplitInstallRequest.newBuilder()
            .addModule("your_feature_module_name")
            .build()
    
        splitInstallManager.startInstall(request)
            .addOnSuccessListener {
                // 初始化外部库
                com.example.requiredlib.ExternalLibrary.init()
            }
            .addOnFailureListener {
                // 处理模块安装失败逻辑
            }
    }
    
  • 低版本代码绝对不能直接引用动态模块或外部库的类,可通过接口抽象或反射实现功能隔离,避免ClassNotFoundException。

测试验证

  • 用API29及以下设备测试:确保应用正常启动,功能不受影响,无崩溃日志。
  • 用API30+设备测试:验证动态模块自动安装,外部库功能正常运行。

内容的提问来源于stack exchange,提问作者eeynard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:02:49