完整代码地址:https://gitee.com/android100/modulepro111
一、配置签名文件
将签名文件放在根目录中,
创建一个sign.properties文件,并定义好签名所需要的属性:
# release
# 自己创建一个
storePassword=xq123456
keyPassword=xq123456
keyAlias=key0
storeFile=../key.jks
# debug
# 默认签名文件位置:C:\Users\able\.android
storePassword_debug=android
keyPassword_debug=android
keyAlias_debug=androiddebugkey
storeFile_debug=../debug.keystore
在app的build.gradle中配置签名:
//获取properties
def keystorePropertiesFile = rootProject.file("sign.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
//添加
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
debug {
keyAlias keystoreProperties['keyAlias_debug']
keyPassword keystoreProperties['keyPassword_debug']
storeFile file(keystoreProperties['storeFile_debug'])
storePassword keystoreProperties['storePassword_debug']
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
//修改
signingConfig signingConfigs.release
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
//修改
signingConfig signingConfigs.debug
}
}
}
使用gradle脚本可以直接打包,然后在build文件夹中看到:
二、统一管理版本
- 创建一个config.gradle文件,并定义版本和依赖:
ext {
android = [
compileSdkVersion: 28,
buildToolsVersion: "28.0.3",
minSdkVersion : 17,
targetSdkVersion : 28,
versionCode : 1,
versionName : "1.0.0",
applicationId : "com.example.myandroidconfig",
]
version = [
androidSupportSdkVersion: "28.0.0",
retrofitSdkVersion : "2.4.0",
glideSdkVersion : "4.8.0",
canarySdkVersion : "1.5.4",
constraintVersion : "1.0.2",
okhttp : "3.8.1"
]
dependencies = [
//support
"appcompat-v7" : "com.android.support:appcompat-v7:${version["androidSupportSdkVersion"]}",
"design" : "com.android.support:design:${version["androidSupportSdkVersion"]}",
"palette" : "com.android.support:palette-v7:${version["androidSupportSdkVersion"]}",
"support-v4" : "com.android.support:support-v4:${version["androidSupportSdkVersion"]}",
"cardview-v7" : "com.android.support:cardview-v7:${version["androidSupportSdkVersion"]}",
"annotations" : "com.android.support:support-annotations:${version["androidSupportSdkVersion"]}",
"recyclerview-v7" : "com.android.support:recyclerview-v7:${version["androidSupportSdkVersion"]}",
"constraint-layout" : "com.android.support.constraint:constraint-layout:${version["constraintVersion"]}",
"percent" : "com.android.support:percent:${version["androidSupportSdkVersion"]}",
"dynamic" : "com.android.support:support-dynamic-animation:${version["androidSupportSdkVersion"]}",
"multidex" : "com.android.support:multidex:1.0.2",
//network
"retrofit" : "com.squareup.retrofit2:retrofit:${version["retrofitSdkVersion"]}",
"retrofit-converter-gson" : "com.squareup.retrofit2:converter-gson:${version["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava2": "com.squareup.retrofit2:adapter-rxjava2:${version["retrofitSdkVersion"]}",
"okhttp" : "com.squareup.okhttp3:okhttp:${version["okhttp"]}",
"logging-interceptor" : "com.squareup.okhttp3:logging-interceptor:${version["okhttp"]}",
"rxandroid2" : "io.reactivex.rxjava2:rxandroid:2.1.0",
"rxjava2" : "io.reactivex.rxjava2:rxjava:2.1.11",
"rxrelay" : "com.jakewharton.rxrelay2:rxrelay:2.0.0",
"retrofit-adapter-rxjava" : 'com.squareup.retrofit2:adapter-rxjava:2.1.0',
"rxandroid" : "io.reactivex.rxjava2:rxandroid:1.2.1",
"rxjava" : "io.reactivex.rxjava2:rxjava:1.2.1",
//router
"router" : "com.alibaba:arouter-api:1.4.1",
"router-compiler" : "com.alibaba:arouter-compiler:1.2.2",
//image
"glide" : "com.github.bumptech.glide:glide:${version["glideSdkVersion"]}",
"glide-compiler" : "com.github.bumptech.glide:compiler:${version["glideSdkVersion"]}",
"glide-transformations" : "jp.wasabeef:glide-transformations:3.3.0",
"picasso" : "com.squareup.picasso:picasso:2.5.2",
"takephoto" : "com.jph.takephoto:takephoto_library:4.0.3",
"imagepicker" : "com.lzy.widget:imagepicker:0.5.0",
//view
"tablayout" : "com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar",
"flowlayout" : "com.zhy:flowlayout-lib:1.0.3",
//tools
"eventbus" : "org.greenrobot:eventbus:3.0.0",
"dagger" : "com.google.dagger:dagger:2.13",
"utilcode" : "com.blankj:utilcode:1.12.5",
"easypermissions" : "pub.devrel:easypermissions:1.0.1",
]
}
- 在项目的build.gradle中配置:
apply from: 'config.gradle'
- 在app的build.gradle中配置:
android {
def android = rootProject.ext.android
compileSdkVersion android.compileSdkVersion
//compileSdkVersion android["compileSdkVersion"] //这种写法也可
buildToolsVersion android.buildToolsVersion
defaultConfig {
applicationId android.applicationId
minSdkVersion android.minSdkVersion
targetSdkVersion android.targetSdkVersion
versionCode android.versionCode
versionName android.versionName
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
def dependencies = rootProject.ext.dependencies
implementation dependencies["constraint-layout"]
implementation dependencies["appcompat-v7"]
implementation dependencies["design"]
//implementation dependencies.design //这样写也可
}
三、模块开发
创建book的Android library,并在config.gradle中定义book模块是否为应用的开关:
ext {
isBookApplication = true //book模块开关,false:作为Lib组件存在, true:作为application存在
}
创建应用和依赖的AndroidManifest.xml
book模块的build.gradle:
if (rootProject.ext.isBookApplication) {//应用
apply plugin: 'com.android.application'
} else {//依赖
apply plugin: 'com.android.library'
}
android {
def android = rootProject.ext.android
compileSdkVersion android["compileSdkVersion"]
buildToolsVersion android.buildToolsVersion
defaultConfig {
//应用需要 applicationId
if (rootProject.ext.isBookApplication) {
applicationId "com.example.book"
}
minSdkVersion android.minSdkVersion
targetSdkVersion android.targetSdkVersion
versionCode android.versionCode
versionName android.versionName
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
//模块与应用的启动判断:应用需要启动
sourceSets {
main {
if (rootProject.ext.isBookApplication) {
manifest.srcFile 'src/main/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
}
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
def dependencies = rootProject.ext.dependencies
implementation dependencies["appcompat-v7"]
}
app模块的build.gradle:
dependencies {
if (!rootProject.ext.isBookApplication) {//book模块为应用时,不能依赖
implementation project(':book')
}
}
我们可以在config.gradle中的isBookApplication字段进行切换应用还是依赖
当为true时,我们可以单独运行book: