将Android库与其他模块一起发布为依赖项

ewm0tg9j  于 2023-01-28  发布在  Android
关注(0)|答案(1)|浏览(178)

我有3个模块的项目结构:x一个一个一个一个一个一个一个一个一个一个一个和x一个一个一个一个二个一个。
它们之间的依赖关系如下:
:library--* 取决于 --〉:internal,通过实施
:library--
取决于 --〉:shared通过api
:internal--
取决于 *--〉:shared,通过实施
因此,:library使用:internal没有公开它,而:shared公开它。此外,:internal也使用:shared

    • 问题:**如何使用maven-publish Gradle插件发布:library模块并包含其他模块源?

目前,我的发布如下所示(:library的 * build. gradle. kts *):

publishing {
    publications {
        register<MavenPublication>("release") {
            groupId = Project.GROUP_ID
            artifactId = Project.ARTIFACT_ID
            version = Project.VERSION
            from(components["release"])
        }
    }
}

但在发布(我使用JitPack)并将其作为依赖项添加到另一个项目的 * build. gradle * 文件中后,我在尝试构建它时遇到以下错误:

> Could not resolve all files for configuration ':app:debugCompileClasspath'.
   > Could not find [:shared module].
     Required by:
         project :app > [`:library` module]

如何将我的依赖模块提供给已发布的依赖模块?

0pizxfdo

0pizxfdo1#

有三种方法可以解决这个问题:
1.将库的每个子模块直接发布到Maven
1.创建包含子模块的afat .aar
1.创建单个模块SDK

1.在创建包含以下模块的项目时,将库的每个子模块直接发布到Maven

  • 核心
  • 储存库
  • 等等

将每个子模块直接发布到Maven并不是一个合理的选择,但当然,这也是实现我们所需的一种方法。

2.创建包含子模块的afat .aar向依赖项添加类路径

buildscript {
    ...
    dependencies {
        ...
        classpath 'com.github.kezong:fat-aar:1.3.8'
    }
}

应用插件

plugins {
    id 'com.android.library'
    ...
    id 'com.kezong.fat-aar'
}

像代码隐藏一样实现你的模式

dependencies {
    ...
    embed project(path: ':parentmodule:submodule', configuration:'default')
}

3.创建单个模块SDKKotlin有四个不同的可见性修饰符:

私有受保护内部公有
值得注意的是,这里缺少一个项目内部的修饰符,但在不同的模块中可见。
因此,当数据库模块想要使其方法可由库访问时,它需要将这些方法标记为公共的!
然而,这不仅会使它们可以被库访问,还会使那些方法可以被任何使用库的应用程序访问!因此SDK的内部结构暴露给了外界。
虽然这个限制是Kotlin(和Java)的基础,但是有一些方法可以减轻这个限制:

  • 将所有内部API移至“内部包”
  • 使用R8/proguard模糊处理SDK中的所有非公共类
  • 创建单个模块SDK。

相关问题