问题
开发时经常是多人协同开发,每个人负责不同的功能,首先由项目主负责人搭建项目框架,之后每个人通过 svn 或 git 下载项目,然后就开始开发各自的功能。有些功能是完全可以独立成一个 Module 存在的,比如相机相册、二维码等等。这时候就可以单独的创建一个 Module,最后合并时只需把你的 Module 当成一个 Library,主 Module 直接跳转到你的 Module 就可以了。这样以后项目中用到类似的功能也可直接调用。
那么自己创建的 Module 怎么才能变成 Library 呢?或者说 Module 和 Library 之间怎样切换方便调试?下面将详细介绍
详解
1. 首先在已有的项目中创建自己的 Module
2. 在项目根目录的 gradle.properties 文件中增加一个布尔值参数,这个参数就是切换用的
3. 在自己新建 Module 的 build.gradle 中添加如下代码
- 最上面判断如果 myLibrary 为 true,那么认为是 Library,否则是 Module
if (myLibrary.toBoolean()) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
- android–>defaultConfig中,如果为 Module 需要有 applicationId,Library 是不能有 applicationId 的
if (!myLibrary.toBoolean()) {
applicationId "com.lonelypluto.mylibrary"
}
- android–>sourceSets,为 Library 时 AndroidManifest.xml 为空,为 Module 时,可以调用自己的 activity 进行调试
sourceSets {
main {
if (myLibrary.toBoolean()) {
manifest.srcFile 'src/main/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
}
}
}
这样在 Module 和 Library 之间切换时就可以仅修改 gradle.properties 中的 myLibrary
完整的 build.gradle 代码
if (myLibrary.toBoolean()) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
android {
compileSdkVersion 28
defaultConfig {
if (!myLibrary.toBoolean()) {
applicationId "com.lonelypluto.mylibrary"
}
minSdkVersion 17
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
sourceSets {
main {
if (myLibrary.toBoolean()) {
manifest.srcFile 'src/main/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
Demo下载地址:ModuleOrLibrary
常见错误
1.Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve project :mylibrary.
当主Module引入的库不是Library时,不能当做库引入,需要把gradle.properties中的myLibrary改为true