Android 工程模块化设计注意事项

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

我是遗漏了apply plugin: 'kotlin-android',但是假如客户端 Module 不调用对应方法的话是能正常运行的,而且也是通过 AS 的 new module创建的,所以这一块应该是属于 AS 的 bug 吧。
很多这样类似的问题有人喜欢称之为坑与踩坑,我不太喜欢这种说法,我觉得主要还是因为我蠢。

//后续内容待更新

评论

  1. Veine
    4年前
    2020-8-02 15:35:09
    Safari 13.1 Safari 13.1 Mac OS X  10.15.4 Mac OS X 10.15.4

    你好!

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇