为什么要对 Gradle 统一管理
在实际项目中,经常会出现一个 Project 中有多个 Module 的情况,如果每个 Module 又同时拥有相同的依赖,比如 v4 包,那么,每次 v4 包升级的时候修改多个 Module 中的 build.gradle 文件,更新其版本都是一件麻烦的事情,而且很有可能忘记某个 Module。所以,将依赖进行统一管理,对于一个 Project 下拥有多个 Module 的情况来说是非常必要的。
如何管理
假设你的 Project 结构如下:
root
--module1
--build.gradle
--module2
--build.gradle
...
--build.gradle
使用脚本 config.gradle
为了方便管理,可以在根目录下新建 config.gradle 文件
root
--module1
--build.gradle
--module2
--build.gradle
...
--build.gradle
--config.gradle
在 config.gradle 中添加如下代码(具体情况根据自己项目来定):
ext {
android = [
compileSdkVersion: 23,
buildToolsVersion: "24.0.0 rc1",
applicationId : "com.sivan.rxretrofitdemo",
minSdkVersion : 16,
targetSdkVersion : 23,
versionCode : 1,
versionName : "1.0"
]
dependencies = [
"appcompat-v7" : "com.android.support:appcompat-v7:23.3.0",
"rxjava" : "io.reactivex:rxjava:1.1.3",
"rxandroid" : "io.reactivex:rxandroid:1.1.0",
"retrofit" : "com.squareup.retrofit2:retrofit:2.0.0-beta4",
"gson" : "com.google.code.gson:gson:2.6.2",
"converter-gson" : "com.squareup.retrofit2:converter-gson:2.0.0-beta4",
"adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4",
"butterknife" : "com.jakewharton:butterknife:7.0.1",
"logging-interceptor": "com.squareup.okhttp3:logging-interceptor:3.0.1"
]
}
OK,依赖写完了,那如何在项目中使用呢
在 root 目录下的build.gradle 中加上apply from: "config.gradle"
接下来就剩下最后一步了,在需要添加依赖的 Module 中使用
- android 节点的使用
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
applicationId rootProject.ext.android.applicationId
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
}
}
- dependencies 节点的使用
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile rootProject.ext.dependencies["appcompat-v7"]
compile rootProject.ext.dependencies["rxjava"]
compile rootProject.ext.dependencies["rxandroid"]
compile rootProject.ext.dependencies["gson"]
compile rootProject.ext.dependencies["converter-gson"]
compile rootProject.ext.dependencies["adapter-rxjava"]
compile rootProject.ext.dependencies["retrofit"]
compile rootProject.ext.dependencies["butterknife"]
}
以后再对依赖包升级的时候直接修改 config.gradle 文件就 OK 了
使用配置文件 gradle.properties
对依赖进行统一管理的另一种方法是使用配置文件 gradle.properties(通常 IDE 会自动生成此文件),在此文件中添加键值对:
LOGGING_INTERCEPTOR=com.squareup.okhttp3:logging-interceptor:3.0.1
CARD_VIEW=com.android.support:cardview-v7:23.3.0
在 Module 的 build.gradle 中使用:
dependencies {
compile LOGGING_INTERCEPTOR
compile CARD_VIEW
}
So easy!
作者:遇见67
链接:https://www.jianshu.com/p/a092bcc3de7d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Gradle使用详解
原文出处:http://www.jianshu.com/p/02cb9a0eb2a0 还在更新中。
一)基本配置
-
build配置
- buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
- }
- }
Android脚本
- apply plugin: 'com.android.application'
Android配置
- android {
- compileSdkVersion 22
- buildToolsVersion "22.0.1"
- }
项目结构
- MyApp
- ├── build.gradle
- ├── settings.gradle
- └── app
- ├── build.gradle
- ├── build
- ├── libs
- └── src
- └── main
- ├── java
- │ └── com.package.myapp
- └── res
- ├── drawable
- ├── layout
- └── etc.
Gradle Wrapper结构(这些新建项目时都添加给了用户,不需要重新添加)
- myapp/
- ├── gradlew
- ├── gradlew.bat
- └── gradle/wrapper/
- ├── gradle-wrapper.jar
- └── gradle-wrapper.properties
运行build任务 - 列出所有可用任务
- $ ./gradlew tasks
生成App-debug.apk任务
- $ ./gradlew assembleDebug
- # Apk路径: MyApp/app/build/ outputs/apk
手动导入Eclipse-Android项目(自动导入请连续点“下一步”)
在项目路径下创建build.gradle文件:
- buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
- }
- }
- apply plugin: 'com.android.application'
- android {
- compileSdkVersion 22
- buildToolsVersion "22.0.1"
- sourceSets {
- main {
- manifest.srcFile 'AndroidManifest.xml'
- java.srcDirs = ['src']
- resources.srcDirs = ['src']
- aidl.srcDirs = ['src']
- renderscript.srcDirs = ['src']
- res.srcDirs = ['res']
- assets.srcDirs = ['assets']
- }
- androidTest.setRoot('tests')
- }
- }
- dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- }
-
PS 也可以复制粘贴Eclipse-Android项目的源代码到Android Studio的项目里
二)自定义配置
-
Gradle所有文件结构
- MyApp
- ├── build.gradle
- ├── settings.gradle
- └── app
- └── build.gradle
settings.gradle
- include ':app'
MyApp/build.gradle
- buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:1.2.3'
- }
- }
- allprojects {
- repositories {
- jcenter()
- }
- }
MyApp/app/build.gradle
- apply plugin: 'com.android.application'
- android {
- compileSdkVersion 22
- buildToolsVersion "22.0.1"
- defaultConfig {
- applicationId "com.gradleforandroid.gettingstarted"
- minSdkVersion 14
- targetSdkVersion 22
- versionCode 1
- versionName "1.0"
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- }
- dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- compile 'com.android.support:appcompat-v7:22.2.0'
- }
基础任务
- $ ./gradlew assemble -为所有构建类型创建apk
- $ ./gradlew check 运行所有的检查,比如说Android Lint,如果发现问题可终止任务
- $ ./gradlew build 运行以上两个任务
- $ ./gradlew clean -清除生成的apk
- ++++
- $ ./gradlew connectedCheck - 在设备上运行测试
- $ ./gradlew deviceCheck - 远程设备运行测试
- $ ./gradlew installDebug/installRelease - 在设备商安装指定版本
- $ ./gradlew uninstall - 卸载
Build Types不同版本的参数设置 - BuildConfig/Resource Value
- android {
- buildTypes {
- debug {
- buildConfigField "String", "API_URL","\"http://test.example.com/api\""
- buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
- resValue "string", "app_name", "Example DEBUG"
- }
- release {
- buildConfigField "String", "API_URL", "\"http://example.com/api\""
- buildConfigField "boolean", "LOG_HTTP_CALLS", "false"
- resValue "string", "app_name", "Example"
- }
- }
- }
全局设置(项目根目录的build.gradle)
- allprojects {
- apply plugin: 'com.android.application'
- android {
- compileSdkVersion 22
- buildToolsVersion "22.0.1"
- }
- }
设置全局参数
- ext {
- compileSdkVersion = 22
- buildToolsVersion = "22.0.1"
- }
在MyApp/app/build.gradle里面使用参数
- android {
- compileSdkVersion rootProject.ext.compileSdkVersion
- buildToolsVersion rootProject.ext.buildToolsVersion
- }
默认任务(MyApp/build.gradle)
- defaultTasks 'clean', 'assembleDebug'
三) 依赖管理
-
仓库
预设配置仓库
- repositories {
- mavenCentral()
- jcenter()
- mavenLocal()
- }
远程仓库
- repositories {
- maven {
- url "http://repo.acmecorp.com/maven2"
- credentials {
- username 'user'
- password 'secretpassword'
- }
- }
- ivy {
- url "http://repo.acmecorp.com/repo"
- }
- }
本地仓库
- repositories {
- maven {
- url "../repo"
- }
- }
本地依赖
项目文件依赖
- dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- }
原生库结构与配置
- # 结构:
- app
- ├── AndroidManifest.xml
- └── jniLibs
- ├── armeabi
- │ └── nativelib.so
- ├── armeabi-v7a
- │ └── nativelib.so
- ├── mips
- │ └── nativelib.so
- └── x86
- └── nativelib.so
- # 配置:
- android {
- sourceSets.main {
- jniLibs.srcDir 'src/main/libs'
- }
- }
Libray项目
- # 修改Android插件:
- apply plugin: 'com.android.library'
- # settings.gradle新增libray项目:
- include ':app', ':library'
- # app内引用library项目:
- dependencies {
- compile project(':library')
- }
依赖概念
- <待续>
Android Studio内添加依赖
四)构建变体
- <待续>
五)多模块构建管理
-
加速构建
- 在gradle.properties里面添加:
- org.gradle.parallel=true
六) 测试
-
单元测试
使用JUnit
- # 结构:
- app
- └─── src
- ├─── main
- │ ├─── java
- │ │ └─── com.example.app
- │ └───res
- └─── test
- └─── java
- └─── com.example.app
- # 依赖:
- dependencies {
- testCompile 'junit:junit:4.12'
- }
使用Robolectric
- # 依赖:
- apply plugin: 'org.robolectric'
- dependencies {
- compile fileTree(dir: 'libs', include: ['*.jar'])
- compile 'com.android.support:appcompat-v7:22.2.0'
- testCompile 'junit:junit:4.12'
- testCompile'org.robolectric:robolectric:3.0'
- testCompile'org.robolectric:shadows-support:3.0'
- }
- # Demo:
- @RunWith(RobolectricTestRunner.class)
- @Config(manifest = "app/src/main/AndroidManifest.xml", sdk = 18)
- public class MainActivityTest {
- @Test
- public void clickingButtonShouldChangeText() {
- AppCompatActivity activity = Robolectric.buildActivity(MainActivity.class).create().get();
- Button button = (Button) activity.findViewById(R.id.button);
- TextView textView = (TextView) activity.findViewById(R.id.label);
- button.performClick();
- assertThat(textView.getText().toString(), equalTo(activity.getString(R.string.hello_robolectric)));
- }
- }
功能测试
使用Espresso
- <待续>
测试覆盖度
使用Jacoco
- <待续>
七)创建任务与插件
- <待续>
八)配置CI
- <待续>
九)自定义配置 - 进阶
-
缩减apk文件大小
使用ProGuard
- android {
- buildTypes {
- release {
- minifyEnabled true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- }
收缩资源文件 - 自动 (<手动待续>)
- android {
- buildTypes {
- release {
- minifyEnabled true
- shrinkResources true
- }
- }
- }
加速构建
- org.gradle.parallel=true # 并行构建
- org.gradle.daemon=true # 开启Gradle守护进程
- org.gradle.jvmargs=-Xms256m -Xmx1024m # 配置JVM<参照下图>
使用Profiling
- <待续>
使用Jack(Java Android Compiler Kit) and Jill(Jack Intermediate Library Linker)
- <待续>
忽略Lint
- android {
- lintOptions {
- abortOnError false
- }
- }
使用Ant
- <待续>
app打包 - 进阶
分割apk
- android {
- splits {
- density {
- enable true
- exclude 'ldpi', 'mdpi'
- compatibleScreens 'normal', 'large', 'xlarge'
- }
- }
- }
- 生成结果:
- app-hdpi-release.apk
- app-universal-release.apk
- app-xhdpi-release.apk
- app-xxhdpi-release.apk
- app-xxxhdpi-release.apk
引用:
-
《Gradle for Android》