Android 多渠道打包多模块项目

异常:

Unresolved reference: ads

问题:

多模块项目根据不同渠道加载模块

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

  1. 创建一个模块New->Module->Android Library
  1. 在一个公共模块中创建一个公共的广告接口,被其他模块实现
  1. 创建一个广告ads模块,里面包含广告方法的实现和资源的引入,实现公共接口AdsInterface
  1. 在ads同一层下创建一个空实现的广告模块emptyAd,里面实现和ads模块完全一样的包名和类名
  1. 在项目的gradle.properties里面创建一个INTERNATIONAL_VERSION,用来判断加载的是哪个模块,名字任意
  1. 创建一个公共模块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"))
    }
}
  1. 其他模块可通过工厂类直接调用广告,这样不管打的包里面有没有实现对应的广告方法都不会导致引用处报错
scss 复制代码
AdManagerFactory.csj().initADS()
AdManagerFactory.csj().loadSplashAd()
相关推荐
成都大菠萝10 分钟前
Android Car CarProperty 车辆信号链路
android
敲代码的鱼25 分钟前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
时光足迹2 小时前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app
Coffeeee6 小时前
闲聊几句,Android老哥们,你们多久没做技改需求了
android·程序员·代码规范
萝卜er7 小时前
Fragment 生命周期与状态恢复-《Android深水区(四)》
android
萝卜er7 小时前
Intent 显式、隐式与 PendingIntent-《Android深水区(五)》
android
Kapaseker9 小时前
一文吃透 Kotlin 集合操作符
android·kotlin
三少爷的鞋10 小时前
Main-safe:现代Android 架构真正的分水岭
android
沐怡旸19 小时前
深入解析 Android Performance Analyzer (APA) 底层架构与技术原理
android
李斯维1 天前
从历史的角度看 Android 软件架构
android·架构·android jetpack