Gradle配置构建多Module项目 0x01 配置远程代码库 可以按如下方式声明特定的 Maven 或 Ivy 代码库:
1 2 3 4 5 6 7 8 allprojects { repositories { maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/google' } maven { url "file://local/repo/" } ivy { url "https://repo.example.com/ivy" } } }
0x02 统一配置Gradle依赖库版本 随着项目采用模块化,组件化开发,moudle 的个数也会随着增加,统一管理配置gradle就显得比较重要了。
1、在 project 根目录创建一个 config.gradle
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ext { versions = [ compileVersion : 26 , buildVersion : "26.0.2" , sdkMinVersion : 15 , sdkTargetVersion : 26 , appVersionCode : 520 , appVersionName : "1.0.0" ] support = [ appcompat : "com.android.support:appcompat-v7:26.+" , recyclerview: "com.android.support:recyclerview-v7:26.+" ] deps = [ glide : "com.github.bumptech.glide:glide:4.11.0" ] }
2、在 Project 根目录下的 build.gradle
添加apply
1 apply from: 'config.gradle'
3、在相应Moudle中调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 android { def versions = rootProject.ext.versions compileSdkVersion versions.compileVersion buildToolsVersion versions.buildVersion defaultConfig { applicationId "com.dench.wanandroid" minSdkVersion versions.sdkMinVersion targetSdkVersion versions.sdkTargetVersion versionCode versions.appVersionCode versionName versions.appVersionName } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt' ), 'proguard-rules.pro' } } } dependencies { def dependencies = rootProject.ext.deps def support = rootProject.ext.support implementation support.appcompat implementation support.recyclerview implementation dependencies.glide }
0x03 配置Flavor 创建产品变种与创建构建类型类似:将其添加到构建配置中的 productFlavors
代码块并添加所需的设置。产品变种支持与 defaultConfig
相同的属性,这是因为,defaultConfig
实际上属于 ProductFlavor
类。这意味着,您可以在 defaultConfig
代码块中提供所有变种的基本配置,每个变种均可更改其中任何默认值,如 applicationId
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 android { defaultConfig {...} buildTypes { debug{...} release{...} } flavorDimensions "version" productFlavors { demo { dimension "version" applicationIdSuffix ".demo" versionNameSuffix "-demo" versionCode 30000 + android.defaultConfig.versionCode } full { dimension "version" applicationIdSuffix ".full" versionNameSuffix "-full" versionCode 20000 + android.defaultConfig.versionCode } } }
0x04 创建源代码集 1、Gradle 要求:
在所有构建变体之间共享的所有内容创建 main/
源代码集 和目录。
将“debug”构建类型特有的 Java 类文件放在 src/debug/java/
目录中。
1 2 3 4 5 6 7 8 9 10 11 12 13 debug ---- Compile configuration: compile build.gradle name: android.sourceSets.debug Java sources: [app/src/debug/java] Manifest file: app/src/debug/AndroidManifest.xml Android resources: [app/src/debug/res] Assets: [app/src/debug/assets] AIDL sources: [app/src/debug/aidl] RenderScript sources: [app/src/debug/rs] JNI sources: [app/src/debug/jni] JNI libraries: [app/src/debug/jniLibs] Java-style resources: [app/src/debug/resources]
依次转到 MyApplication > Tasks > android ,然后双击 sourceSets 。Gradle 执行该任务后,系统应该会打开 Run 窗口以显示输出。
2、更改默认源代码集配置
1 2 3 4 5 6 7 8 9 android { sourceSets { main { java.srcDirs = ['other/java' ] res.srcDirs = ['other/res1' , 'other/res2' ] manifest.srcFile 'other/AndroidManifest.xml' } } }
0x05 声明依赖项 1 2 3 4 5 6 dependencies { freeImplementation project(":mylibrary" ) testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }
0x06 配置签名 1、在项目的根目录下创建一个名为 keystore.properties
的文件,并使其包含以下信息:
1 2 3 4 storePassword =myStorePassword keyPassword =myKeyPassword keyAlias =myKeyAlias storeFile =myStoreFileLocation
2、在 build.gradle
文件中,按如下方式加载 keystore.properties
文件(必须在 android 代码块前面):
1 2 3 4 5 6 7 8 def keystorePropertiesFile = rootProject.file("keystore.properties" )def keystoreProperties = new Properties()keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { }
3、输入存储在 keystoreProperties
对象中的签名信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 android { signingConfigs { release { keyAlias keystoreProperties['keyAlias' ] keyPassword keystoreProperties['keyPassword' ] storeFile file(keystoreProperties['storeFile' ]) storePassword keystoreProperties['storePassword' ] } } buildTypes { release { signingConfig signingConfigs.release } } }
如需从环境变量获取这些密码,请添加以下代码:
1 2 storePassword System.getenv("KSTOREPWD" ) keyPassword System.getenv("KEYPWD" )
0x07 apk重命名 1 2 3 4 5 6 7 8 9 android { applicationVariants.all { variant -> if (variant.buildType.name == 'release' ) { variant.outputs.all { outputFileName = "app_v${variant.versionName}.${buildTime}_${variant.productFlavors[0].name}_${variant.buildType.name}.apk" } } } }
or
1 2 3 outputFileName = "app_v${versionName}.${buildTime}_${flavorName}_${buildType.name}.apk" outputFileName = "../../${outputFileName}" println outputFileName
0x08 将构建变量注入清单 1、如果您需要将变量插入在 build.gradle
文件中定义的 AndroidManifest.xml
文件,可以使用 manifestPlaceholders
属性执行此操作。此属性采用键值对的映射,如下所示:
1 2 3 4 5 6 android { defaultConfig { manifestPlaceholders = [hostName: "www.example.com" ] applicationId "com.example.myapp" } }
2、您可以将某个占位符作为属性值插入清单文件,如下所示:
1 2 3 4 <intent-filter ... > <data android:scheme ="http" android:host ="${hostName}" ... /> <action android:name ="${applicationId}.TRANSMOGRIFY" /> </intent-filter >
0x09 gradle自定义Java变量和资源值 在构建时,Gradle 将生成 BuildConfig
类,以便应用代码可以检查与当前构建有关的信息。您也可以从 Gradle 构建配置文件中使用 buildConfigField()
方法将自定义字段添加到 BuildConfig
类中,然后在应用的运行时代码中访问这些值。同样,您也可以使用 resValue()
添加应用资源值。
1 2 3 4 5 6 7 8 9 10 11 12 13 def buildTime = new Data().format("yyyyMMddHHmm" , TimeZone.getTimeZone("GTM+08:00" ))android { buildTypes { release { buildConfigField("String" , "BUILD_TIME" , "\"${buildTime}\"" ) resValue("string" , "build_time" , "${buildTime}" ) } debug { buildConfigField("String" , "BUILD_TIME" , "\"0\"" ) resValue("string" , "build_time" , "0" ) } } }
在应用代码中,您可以按如下方式访问属性:
1 2 Log.i(TAG, BuildConfig.BUILD_TIME); Log.i(TAG, getString(R.string.build_time));
0x10 设定编码 1 2 3 4 5 allprojects { tasks.withType(JavaCompile){ options.encoding = "UTF-8" } }