Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android 之Gradle教程

$
0
0

一、什么是Gradle

          Gradle是一个工具,同时它也是一个编程框架.。可以调用Gradle自带的api编译我们的android工程,打包成apk或aar,也可以在.gradle文件中使用Groovy语言进行逻辑编程。我们在android工程中使用的每个.gradle文件 和task执行时都会转换成一个个的java对象,运行在java虚拟机上。其中主要的有Gradle对象、Project对象和Settings对象。

 

 

二、实践

 

     后面我们通过配置和创建属性文件实现以下几个任务:

     1、实现多渠道打包

     2、通过文件方式配置版本号 及版本名等信息

     3、通过文件方式配置签名文件

     4、根据不同渠道动态修改程序名称和包名

     5、根据不同渠道生成apk文件名称及自定义文件输出路径

     6、根据不同渠道定制专属页面

 

 

    在实现任务之前 先要说几个基础知识:

     

      1、声明变量

           Gradle中声明变量有三种方式  一种是 通过def关键字  如 def a =1 ,这种声明只能在声明所在的方法中使用相当于临时变量,原因后面会详细说下,另一种是 ext关键字 如ext.a = 1,这种方式是可以在外部声明在其中方法中使用的, 类似于我们成员变量,另外还有就是 直接声明  a =1,这种方式也可以在外部声明在其中方法中使用,但不能在文件外部调用,其实还有一种方式 和ext 效果一样,

1.  import groovy.transform.Field;   //必须要先import

2.  @Field x = 1

   这种方式 在我们android开发中基本不会使用  。

    2、定义方法

          定义方法 使用def 关键字   

          如  def printName(name){  

                      println "hello"+name  //结束没有 ;

                    }  

          或 def  sayHello(){

                   println "hello"

                } 

      3、调用方法

             调用方法可以用两种方式    比如  printName("gqs")   也可以  printName "gqs"

 

     下面直接贴  .gradle文件,所有的说明都穿插在代码中:

//导入插件 真正工作的就是这些插件 gradle 只是设置使用规则
//apply 其实也是一个方法,就是这样定义的
//void apply(Map<String, ?> options);
apply plugin: 'com.android.application'

// 默认版本号
ext.appVersionCode = 1
// 默认版本名z
ext.appVersionName = "1.0"
// 默认apk输出路径
 ext.appReleaseDir = "../apks"
// 默认正式包后缀名
ext.appSuffixName = "_release.apk"

// 也可以向下面这种方式声明变量
ext{
    a =1
    b = 2
}

//定义一个测试方法
def printName(name){
    println "hello====" +name
}
//可以如下调用
printName "gqs"
//printName("gqs")


////定义一个方法   获取当前日期
def getPackageTime() {
    def date = new Date()
    def formattedDate = date.format('yyyy_MM_dd_HHmm')
    return formattedDate
}




// 加载版本信息配置文件方法
def loadProperties() {

    //将我们的版本号等信息配置在了local.properties 文件中,这里的file() 是一个方法,返回一个File对象
    def proFile = file("../local.properties")
    //Properties 是一种数据类型,其实是就是继承自hashtable , 可以解析.properties文件,并以键值对方式存储起来
    //public class Properties extends Hashtable
    Properties pro = new Properties()
    proFile.withInputStream { stream->
        pro.load(stream)
    }
    //为上面定义的变量赋值
    appReleaseDir = pro.appReleaseDir
    appVersionCode = Integer.valueOf(pro.appVersionCode)
    appVersionName = pro.appVersionName
    appSuffixName = pro.appSuffixName
}



   // 调用方法 加载版本信息
  loadProperties()

  android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"
    defaultConfig {
        applicationId "com.gqs.demo"
        minSdkVersion 14
        targetSdkVersion 24
        versionCode appVersionCode
        versionName appVersionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
      // 到这里就完成了 任务 2 通过文件方式配置版本号 及版本名等信息
      //signingConfigs 是对签名文件的配置 使用时会转成一个java方法
    signingConfigs {
        debug {

        }
        release {
            def Properties localProps = new Properties()
            //signature.properties 是配置签名信息的配置文件 后面会贴出来
            localProps.load(new FileInputStream(file('../signature.properties')))
            storeFile file(localProps["STORE_FILE"])
            keyAlias localProps["KEY_ALIAS"]
            storePassword localProps["STORE_PASSWORD"]
            keyPassword localProps["KEY_PASSWORD"]
        }
    }
      // 到这里就完成了 任务 3 通过文件方式配置签名文件
      //buildTypes 对不同的打包类型 进行配置
    buildTypes {

        release {
            minifyEnabled true //实现代码混淆
            signingConfig signingConfigs.release  //使用的签名信息
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    //开始输出,自定义输出路径
                    output.outputFile =
                            new File(appReleaseDir + getPackageTime() + //获取当前日期
                                    "_v" + appVersionName +//每一个渠道的名称
                                    variant.productFlavors[0].name +
                                    appSuffixName)//appSuffixName 是我们声明的文件后缀
                }
            }


        }
    }
// 到这里 就实现了 任务 5 根据不同渠道生成apk文件名称及自定义文件输出路径
      //productFlavors  就是实现不同渠道打包了
    productFlavors {

        //对每个渠道 设定特定的包名  也就是applicationId

        rainbow{
           // 都使用默认设置
        }
        xiaomi {
            //设置特定渠道的包名
            applicationId "com.rainbow.xiaomi"
        }

        m360 {
            applicationId "com.rainbow.qihu"

        }



        productFlavors.all { flavor ->
            //动态设置不同渠道的app name
            // AndroidManifest文件中  android:label="${APP_NAME}"
            //使用渠道名称替换 APP_NAME,使每个渠道都有自己的 app名称

            flavor.manifestPlaceholders = [APP_NAME: name]
        }
        //这样 我们就完成了任务 1 和4 ;多渠道打包及根据不同渠道动态修改程序名称和包名
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
}

下面是 signature.properties

// 设置 签名文件的信息,用键值对的格式存放
//注意 为了安全,不要放到版本管理里面

//STORE_FILE 签名文件相对地址,这个地址是相对我们使用的所在位置,不是相对当前文件位置
STORE_FILE=../debug.keystore
STORE_PASSWORD=android
KEY_ALIAS=androiddebugkey
KEY_PASSWORD=android


===========================
   下面是local.properties
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=/Applications/android_tools/android-sdk-macosx

#=====以下是自己定义的内容=====
# 打包的输出路径
appReleaseDir=./apks/
# APP版本号,用来升级使用
appVersionCode=2
# APP版本名称,最终打包使用
appVersionName=1.0.0.2
# app正式版包名后缀
appSuffixName=_release.apk



    最后 实现 任务6 根据不同渠道定制专属页面

 

   只要在我们的 src文件夹下 创建和渠道相同的文件夹 可以了 ,里面放入我们要修改的布局文件或values中的文件。

 其实默认 我们用的都是 src下 main中的文件 ,如果我们创建了和渠道名称相同的文件夹 ,gradle 打包的时候 就会从对应到文件夹中取数据了。

 

    比如我替换了 首页的布局 ,最后就生成了三个不同的页面

     

    以上就是所有了,总之Gradle 是非常强大的,只要你想 ,可以实现你各种需求,当然对于android 开发终归只是辅助工具,不必理解的过于深入,但是熟练掌握基本的使用是必须的,这可以大大的提高我们到开发效率。


 代码地址 点击打开链接

作者:gqs519 发表于2016/10/21 12:01:54 原文链接
阅读:61 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles