Android同一项目同时作为应用和库使用的最佳实践是什么?
Android 同模块同时管理应用/库两种形态的最佳实践
直接上可落地的实现方案,无需维护多份build.gradle配置文件:
第一步:新增全局开关变量控制插件类型
在项目根目录的gradle.properties文件中新增自定义变量:# 切换编译形态:true=编译为库,false=编译为独立应用 isBuildAsLibrary=false然后修改模块的
build.gradle文件头部的插件声明逻辑,用变量动态判断加载的插件:plugins { if (isBuildAsLibrary.toBoolean()) { id 'com.android.library' } else { id 'com.android.application' } // 其他通用插件比如kotlin-android正常声明即可 id 'org.jetbrains.kotlin.android' }第二步:动态配置applicationId
库形态不允许配置applicationId,所以在defaultConfig块中添加判断,仅应用形态下配置:android { namespace "com.your.project.namespace" compileSdk 34 defaultConfig { // 仅应用形态配置applicationId if (!isBuildAsLibrary.toBoolean()) { applicationId "com.your.app.id" } minSdk 24 targetSdk 34 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } // 其他通用编译配置buildTypes、compileOptions等正常声明即可 }第三步:隔离不同形态的专属代码与清单配置
分别创建两个专属源码目录存放不同形态的独有内容:src/app/:存放独立应用独有的代码、资源、清单文件(比如启动页Activity、调试功能、LAUNCHER入口声明)src/library/:存放库形态独有的代码、资源、清单文件(比如对外暴露的组件声明、库专属权限)
在build.gradle的android块中添加源集动态配置:
android { sourceSets { main { if (isBuildAsLibrary.toBoolean()) { // 加载库形态专属配置 java.srcDirs += 'src/library/java' res.srcDirs += 'src/library/res' manifest.srcFile 'src/library/AndroidManifest.xml' } else { // 加载应用形态专属配置 java.srcDirs += 'src/app/java' res.srcDirs += 'src/app/res' manifest.srcFile 'src/app/AndroidManifest.xml' } } } }第四步:依赖隔离
针对不同形态的专属依赖做条件判断,避免引入无用依赖增大包体积:dependencies { // 两种形态通用的依赖正常声明 implementation 'androidx.core:core-ktx:1.12.0' // 仅独立应用需要的依赖 if (!isBuildAsLibrary.toBoolean()) { implementation 'com.google.android.material:material:1.11.0' implementation 'androidx.appcompat:appcompat:1.6.1' } // 仅库形态需要的依赖 if (isBuildAsLibrary.toBoolean()) { // 按需添加库专属依赖 } }
完成以上配置后,仅需修改gradle.properties里的isBuildAsLibrary值即可一键切换形态,不用来回替换配置文件。如果需要更方便的切换,还可以自定义构建变体,直接在Android Studio的构建变体面板选择对应形态即可,无需修改配置值。
内容的提问来源于stack exchange,提问作者Costa Mirkin
相关产品推荐
相关产品推荐

