【问题标题】:Android multi-SDK project debug buildAndroid多SDK项目调试构建
【发布时间】:2020-02-09 20:21:04
【问题描述】:

如何将调试模式特定功能添加到拆分为多个 SDK 的 Android 应用程序中?

假设我需要为所有 SDK 的所有 OkHttp 客户端添加一个 OkHttp 拦截器。但它只能添加到应用程序的调试版本中。但是,当应用程序分解为多个 SDK 时,即使主应用程序是在调试模式下构建的,它们也会作为发布版本发布。因此,SDK 中的调试专用拦截器不会被添加到 OkHttp 客户端。

如何解决这个问题?我正在考虑利用依赖注入 (Koin) 并从启动 Koin 的应用程序传递构建类型信息,但不确定 Koin 是否支持此功能。

【问题讨论】:

    标签: android gradle dependency-injection koin


    【解决方案1】:

    您可以为应用程序的每个模块选择处于活动状态的构建变体。

    https://developer.android.com/studio/build/build-variants

    【讨论】:

    • 我使用publishToMavenLocal,它会自动创建一个发布版本并发布到maven repo。远程回购也会发生同样的情况。也许我没有解释清楚,我的主要问题是 SDK,它们有自己的项目并作为依赖项添加。
    • 如果您进行发布构建,那么您的库应该是发布变体。你的问题似乎不太清楚。
    • 你是说别人的图书馆?您想将 OkHttp 拦截器添加到您使用的 SDK 库中吗?或 SDK 的源代码?
    • SDK 我指的是我自己的库,我用它来拥有特定于功能的代码。我可以完全访问他们的代码,但是当它们发布时,它们是发布构建类型。但主应用程序可以在调试版本中。然后我不能只在这些库中使用if (BuildConfig.DEBUG) ,因为它们总是在发布中:-) 抱歉混淆了语言
    • 主app模块需要控制OkHttp Client的实例化。例如,库模块可能有一个构建器,主应用程序模块使用它来创建其 OkHttp 客户端(因此您可以通过应用程序模块传递控制您需要的任何拦截器的使用)。也许在你的问题中显示一些关于你如何在每个模块中使用 OkHttp 的代码。
    【解决方案2】:

    您可以将getAll() in Koin 用于您的目的。

    模块b:

    域:

    interface Interceptor
    class InterceptorFactory(val interceptors: List<Interceptor>) // Here you have a list of all interceptors from all modules
    class HeadersInterceptor : Interceptor
    

    科因:

    object BKoin {
    
        val network2: Module
            get() = module {
                single<HeadersInterceptor>() bind Interceptor::class
    
                single<InterceptorFactory> {
                    InterceptorFactory(getAll<Interceptor>())
                }
            }
    
    }
    

    模块应用:

    定义你的对象

     class OtherInterceptor : Interceptor
    

    声明它们

     object AKoin {
    
        val network1: Module
            get() = module {
                single<OtherInterceptor>() bind Interceptor::class
            }
    
     }
    

    初始化 Koin

     startKoin {
            val app = modules(
                listOf(
                    BKoin.network2,
                    AKoin.network1
                )
            )
            Log.d("TUT", "${app.koin.get<InterceptorFactory>().interceptors.map { it::class.simpleName }}")
        }
    

    分级:

     dependencies {
        implementation project(':moduleb')
     }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2014-07-27
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多