异常:
Unresolved reference: ads
问题:

多模块项目根据不同渠道加载模块
场景:同一个项目需要同时上架海外和国内,但是海外上架不允许引入国内的广告资源,但是国内的包又需要使用广告。这个时候就可以将广告变成单独的模块,然后通过判断该不该加载广告资源模块。下面以广告模块(ads)在googlePlay渠道包上为例
- 创建一个模块New->Module->Android Library

- 在一个公共模块中创建一个公共的广告接口,被其他模块实现

- 创建一个广告ads模块,里面包含广告方法的实现和资源的引入,实现公共接口
AdsInterface

- 在ads同一层下创建一个空实现的广告模块emptyAd,里面
实现和ads模块完全一样的包名和类名

- 在项目的gradle.properties里面创建一个
INTERNATIONAL_VERSION
,用来判断加载的是哪个模块,名字任意

- 创建一个公共模块ChannelBase,实现一个工厂方法,获取对应广告的初始值。这个方法最关键的是ads和emptyAd模块使用了同样的模块包名才可以不管你导入的是哪个模块都可以调用该模块下的方法

6.在公共模块ChannelBase的build.gradle.kts里面调用gradle.properties的值进行判断引入哪个模块资源
kotlin
val international: Boolean by project.extra {
(findProperty("INTERNATIONAL_VERSION") as? String)?.toBoolean() ?: false
}
plugins {
}
android {
}
dependencies {
//这个是广告接口AdsInterface所在的类,必须引入才能在工厂类AdManagerFactory里面调用
implementation(project(":core:tool-utils"))
//根据gradle.properties中定义的值进行引入对应的模块资源
if (international) {
implementation(project(":core:emptyAd"))
} else {
implementation(project(":core:ads"))
}
}
- 其他模块可通过工厂类直接调用广告,这样不管打的包里面有没有实现对应的广告方法都不会导致引用处报错
scss
AdManagerFactory.csj().initADS()
AdManagerFactory.csj().loadSplashAd()