Android -- Gradle

简介:

使用gradle的目的                                                                     

  • 更容易重用资源和代码;
  • 可以更容易创建不同的版本的程序,多个类型的apk包;
  • 更容易配置,扩展;
  • 更好的IDE集成;

Gradle基本结构                                                                       

使用ide创建的gradle构建的项目,会自动创建一个build.gradle,如下:

复制代码
buildscript {
    repositories {
        mavenCentral()
    }
 
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.0'
    }
}
 
apply plugin: 'android'
 
android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"
}
复制代码

可以看到,构建文件主要有三个区域:

复制代码
buildscript{…}

//Configures the build script classpath for this project. 设置脚本的运行环境

apply plugin: 'android'

//设置使用android插件构建项目

android{…}

//设置编译android项目的参数
复制代码

任务task的执行                                                                       

  • assemble The task to assemble the output(s) of the project(输出一个项目文件,android就是打包apk)
  • check The task to run all the checks.(运行检查,检查程序的错误,语法,等等)
  • build This task does both assemble and check (执行assemble和check)
  • clean This task cleans the output of the project(清理项目输出文件)

上面的任务assemble,check,build实际上什么都不做,他们其实都是其他任务的集合。

执行一个任务的方式为gradle 任务名, 如gradle assemble,在android项目中还有connectedCheck(检查连接的设备或模拟器),deviceCheck(检查设备使用的api版本)。通常我们的项目会有至少生成两个版本,debug和release,我们可以用两个任务assembleDebug和assembleRelease去分别生成两个版本,也可以使用assemble一下子生成两个版本。gradle支持任务名缩写,在我们执行gradle assembleRelease的时候,可以用gradle aR代替。

基本的构建定制                                                                       

我们可以在build.gradle文件中配置我们的程序版本等信息,从而可以生成多个版本的程序。 
支持的配置有:

  • minSdkVersion 最小支持sdk版本
  • targetSdkVersion 编译时的目标sdk版本
  • versionCode 程序版本号
  • versionName 程序版本名称
  • packageName 程序包名
  • Package Name for the test application 测试用的程序包名
  • Instrumentation test runner 测试用的instrumentation实例
复制代码
android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"
 
    defaultConfig {
        versionCode 12
        versionName "2.0"
        minSdkVersion 16
        targetSdkVersion 16
    }
}
复制代码

目录配置                                                                              

默认情况下项目目录是这样的 
有两个组件source sets,一个main,一个test,对应下面两个文件夹。

src/main/ 
src/androidTest/

然后对于每个组件目录都有两个目录,分别存储java代码和资源文件

java/ 
resources/

对于android项目中呢,对应的目录和文件是 
AndroidManifest.xml //该文件src/androidTest/目录下不需要,程序执行时会自动构建

res/ 
assets/ 
aidl/ 
rs/ 
jni/

如果需要上面这些文件,但是不是在上面所说的目录,则需要设置。

复制代码
sourceSets {
    main {
        java {
            srcDir 'src/java'
        }
        resources {
            srcDir 'src/resources'
        }
    }
}
复制代码

可以给main或者test设置根目录,如

sourceSets {
        androidTest.setRoot('tests')
    }

可以指定每种文件的存储路径

复制代码
sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
复制代码

特别是我们的ndk生成的.so文件,通常我们不是放到jni目录中的,我们需要设置一下

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

签名配置                                                                              

可以给不同类型进行不同的配置:

复制代码
android {
    signingConfigs {
        debug {
            storeFile file("debug.keystore")
        }
 
        myConfig {
            storeFile file("other.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
    }
 
    buildTypes {
        foo {
            debuggable true
            jniDebugBuild true
            signingConfig signingConfigs.myConfig
        }
    }
}
复制代码

上面的配置文件配置两个类型,一个时debug类型,一个时自己的自定义类型。两个分别使用了不同的签名,同时对于生成密钥,要填写设置的密码。代码混淆设置代码混淆设置代码混淆设置

代码混淆设置                                                                         

复制代码
android {
    buildTypes {
        release {
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android.txt')
        }
    }
}
复制代码

以上是使用默认的proguard文件去进行混淆,也可以使用自己编写的规则进行混淆,proguardFile 'some-other-rules.txt'

依赖配置                                                                              

程序中会依赖别的包,或者程序,需要引入别的类库。前面也说到了,支持maven。 
对于本地的类库,可以这样引入:

复制代码
dependencies {
    compile files('libs/foo.jar')   //单个文件
    compile fileTree(dir: 'libs', include: ['*.jar'])  //多个文件
}
 
android {
    ...
}
复制代码

对于maven仓库文件:

复制代码
repositories {
    mavenCentral()
}
 
 
dependencies {
    compile 'com.google.guava:guava:11.0.2'
}
 
android {
    ...
}
复制代码

输出不同配置的应用                                                                  

复制代码
android {
    ...
 
    defaultConfig {
        minSdkVersion 8
        versionCode 10
    }
 
    productFlavors {
        flavor1 {
            packageName "com.example.flavor1"
            versionCode 20
        }
 
        flavor2 {
            packageName "com.example.flavor2"
            minSdkVersion 14
        }
    }
}
复制代码

通过以上设置,我们可以输出不同的保命不同的版本号,以及最小sdk的程序包。当然我们可以根据自己的需求去做其他的不同。

生成多个渠道包                                                                       

复制代码
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}
apply plugin: 'android'
 
repositories {
        mavenCentral()
}
 
android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"
 
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
 
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
 
    lintOptions {
        abortOnError false
    }
 
 
//签名
    signingConfigs {
        //你自己的keystore信息
        release {
            storeFile file("×.keystore")
            storePassword "×××"
            keyAlias "××××"
            keyPassword "×××"
        }
    }
 
    buildTypes {
 
        debug {
            signingConfig signingConfigs.release
        }
 
        release {
            signingConfig signingConfigs.release
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
 
    //渠道Flavors,我这里写了一些常用的,你们自己改
    productFlavors {
        //GooglePlay{}
        //Store360{}
        //QQ{}
        //Taobao{}
        //WanDouJia{}
        //AnZhuo{}
        //AnZhi{}
        //BaiDu{}
        //Store163{}
        //GFeng{}
        //AppChina{}
        //EoeMarket{}
        //Store91{}
        //NDuo{}
        xiaomi{}
        umeng{}
    }
 
}
 
 
//替换AndroidManifest.xml的UMENG_CHANNEL_VALUE字符串为渠道名称
android.applicationVariants.all{ variant ->
    variant.processManifest.doLast{
 
        //之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁
        //${buildDir}是指./build文件夹
        //${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成
        //下面的路径是类似这样:./build/manifests/GooglePlay/release/AndroidManifest.xml
        def manifestFile = "${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml"
 
        //将字符串UMENG_CHANNEL_VALUE替换成flavor的名字
        def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
        new File(manifestFile).write(updatedContent, 'UTF-8')
 
        //将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件
        variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.dirName}/AndroidManifest.xml")
    }
}
复制代码

以上的功能就是替换我的Manifest中的渠道标示,同时去生成不同的apk包。

最后说明                                                                              

程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。

lintOptions {         abortOnError false     }

我是天王盖地虎的分割线                                                             

 

 




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4162440.html,如需转载请自行联系原作者

相关文章
|
7月前
|
SQL 人工智能 移动开发
Android Studio插件版本与Gradle 版本对应关系
Android Studio插件版本与Gradle 版本对应关系
Android Studio插件版本与Gradle 版本对应关系
|
7月前
|
Java 开发工具 Android开发
Cocos Creator 2.4.6 Android Gradle 版本升级为 6.5.1(插件4.1.0)
Cocos Creator 2.4.6 Android Gradle 版本升级为 6.5.1(插件4.1.0)
199 1
|
8月前
|
存储 Java Android开发
Android 开发 - 充分利用Gradle
Android 开发 - 充分利用Gradle
115 2
|
4天前
|
Java Android开发
Android零基础入门(二)gradle的安装和详解
Android零基础入门(二)gradle的安装和详解
13 0
|
2月前
|
Java 开发工具 Android开发
Android Studio Gradle文件解释其作用
Android Studio Gradle文件解释其作用
28 2
|
9月前
|
IDE Java 开发工具
Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8的解决方案
Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8的解决方案
|
5月前
|
开发工具 Android开发 开发者
Android 项目编译 Gradle 配置说明
Android 项目编译 Gradle 配置说明
159 0
|
6月前
|
Java Maven Android开发
android之gradle配置仓库与引入依赖
android之gradle配置仓库与引入依赖
279 0
|
8月前
|
Java 开发工具 Maven
Android 编译 gradle 内存 OOM 解决之路(二)
Android 编译 gradle 内存 OOM 解决之路
|
8月前
|
Java Android开发
Android 编译 gradle 内存 OOM 解决之路(一)
Android 编译 gradle 内存 OOM 解决之路