在最新的一个项目里,因为遇到了多客户端的需求,是一个类似滴滴的项目,需要分货主端和车主端,互相有些差异也有一些共用的地方。那么怎么做是最便于维护与拓展的呢,我当时想了这样几个方案:

– 单 Project 单 Module,通过 gradle 进行差异化打包,而日常开发中对于能复用的页面添加 type 参数来区别。优点是简单方便。缺点是维护起来比较混乱。

– 单 Project 分主 Module 与次 Module,比如以车主端为主 Module,主要代码与资源都在该 Module 里面,而货主端引用该 Module,并进行定制化开发。优点是同样比较简单方便,也较为清晰。缺点是货主端会引入很多用不上的资源。

– 单 Project 基础 Module 两个客户端 Module,把基础控件和能共用的部分都封装到基础 Module 里,两个客户端 Module 各自引用它们。优点是清晰易维护。缺点是使用多 Module 本身存在的一些问题。

– 俩 Project,写完一个客户端后复制粘贴代码。优点是成本低难度最小,缺点是改起来恶心。

就观感而言应该是单 Project,分基础 Module 和 客户端 Module 最佳。但是多个 Module 协同开发之间还是存在一些问题的,因此写下此篇文章。由于文章还没竣工,不敢妄称指南,先取名为注意事项。

跨 Module 引用 kotlin 的代码异常,提示「Unresolved reference: xxx」

问题详情:在基础 Module 里写入的一些 Kotlin 方法,在客户端 Module 引用时编译不能通过,提示「Unresolved reference: xxx」,基础 Module 设置的 Application 在运行时会提示「Unable to instantiate application xxx.BaseApplication: java.lang.ClassNotFoundException」。

问题排查:创建了 Java 文件发现一切正常,因此判断是 kotlin 的问题。猜测是因为 kotlin 的作用域与 Java 不一样,但是设置了对应作用域修饰符后依旧无用。搜索结果里有很多干扰内容,最后 ‘Unresolved reference’ errors for android library module referenced in app module

解决了问题,因为作为 Library 的基础 Module 没有正确配置 kotlin。检查是否有以下内容:

apply plugin: 'kotlin-android'

dependencies {

implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVersion:"

}

我是遗漏了 apply plugin: 'kotlin-android'

,但是假如客户端 Module 不调用对应方法的话是能正常运行的,而且也是通过 AS 的 new module

创建的,所以这一块应该是属于 AS 的 bug 吧。

很多这样类似的问题有人喜欢称之为坑与踩坑,我不太喜欢这种说法,我觉得主要还是因为我蠢。

//后续内容待更新

标签:Android, Module

, 多客户端

, 模块化

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐