Gradle 二三事

1.各种不想解决的黄色小提示,不想写contentDescription,设计稿上字体就是小于12sp等等

    lintOptions {
      //发生错误的时候停止构建
      abortOnErrortrue
      //不忽略警告
      ignoreWarningsfalse
      //lint 规则配置
      lintConfig file("../lint.xml")
    }

然后具体的lint规则配置:lint.xml

  
    
      
      
      
  

2.签名配置 signingConfigs--使用gradle打包的时候

 signingConfigs {
        config {
            keyAlias KEY_ALIAS
            keyPassword KEY_PASSWORD
            storeFile file(STORE_FILE)
            storePassword STORE_PASSWORD
        }
    }

新建一个Android 项目的时候,,rootProject下面会生成gradle.properties和local.properties(sdk 位置)文件,gradle.properties中的内容不需要显示调用,可以直接在build.gradle中使用,如上。当配置比较简单的时候,可以将这些内容直接在gradle.properties配置。
gradle.properties中的内容:

KEY_ALIAS=测试
KEY_PASSWORD=666666
STORE_FILE=../测试.jks
STORE_PASSWORD=666666

当然,gradle.properties也可以配置其他很多东西,SDK Version,app version 啊,第三方的key secret啊,当然这些东西多了以后,你就会发现我的天,这个
gradle.properties里面怎么什么都有?!
这个时候,我们就需要新建一个**.properties文件了,就跟你有一个student bean ,然后又有一堆course相关的属性一样,当然你可以放到student里面,但是最好还是新建一个course类啦,好,我们现在新建一个keystore.properties,把上图的内容放到keystore.properties里面,有多个环境的key就每个分开写,那在build.gradle里面怎么使用这个新建的properties呢?

def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

为啥要定义变量呢,因为你接下来要用啊,2333...怎么用呢,不要着急,马上来了:

 keyAlias keystoreProperties['keyAlias']
 keyPassword keystoreProperties['keyPassword']
 storeFile file("../${keystoreProperties['storeFile']}")
 storePassword keystoreProperties['storePassword']

其他properties请自由发挥。

3.刚才讲到多个环境,为啥会有多个环境呢,哦,因为dev一个环境,QA一个环境,prod一个环境呀,这么多环境请求地址这些都不一样,怎么办呢?好办!
productFlavors了解一下。你可以在这里面干些什么呢?
先分一下环境吧

prod{
}
qa{
}
dev{
}

A.不同的url地址:

prod{
  buildConfigField 'String', 'BASE_URL', '"https://www.baidu.com"'
}
qa{
  buildConfigField 'String', 'BASE_URL', '"https://www.google.com"'
}

好,你在代码里面请求的时候,只需要调用BuildConfig.BASE_URL就可以了,麻麻再也不用担心切换环境了。
gradle3.0以后,需要在defaultConfig里面添加flavorDimensions 属性

  defaultConfig {
        applicationId "com.test"
        minSdkVersion MIN_SDK_VERSION as int
        targetSdkVersion TARGET_SDK_VERSION as int
        versionCode VERSION_CODE as int
        versionName VERSION_NAME
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        flavorDimensions "channel","charge","env"
    }

flavorDimensions是将Flavors中的内容进行分类,比如渠道(百度,360,应用宝等等),比如是否收费免费之类的,比如环境,然后不同分类可以互相组合,比如百度收费,百度免费,360收费,360免费等等
申请这个属性以后,需要在Flavors中声明这是属于哪个分类,所以将之前的改写成

prod{
 dimension "env"
  buildConfigField 'String', 'BASE_URL', '"https://www.baidu.com"'
}
qa{
 dimension "env"
  buildConfigField 'String', 'BASE_URL', '"https://www.google.com"'
}

B.不同的环境不同的签名文件

prod{
  signingConfig signingConfigs.prod
}
qa{
  signingConfig signingConfigs.qa
}

这个signingConfigs.prod和signingConfigs.qa是什么呀?哦,自己在signingConfigs里面添加的啊,欲知后事如何,需缴纳五块钱:

signingConfigs{
  prod{
    keyAlias keystoreProperties['keyAliasStage']
    keyPassword keystoreProperties['keyPasswordStageProd']
    storeFile file("../${keystoreProperties['storeFileStageProd']}")
    storePassword keystoreProperties['storePasswordStageProd']
  }
  qa{
    keyAlias keystoreProperties['keyAliasStageQa']
    keyPassword keystoreProperties['keyPasswordStageProdQa']
    storeFile file("../${keystoreProperties['storeFileStageProdQa']}")
    storePassword keystoreProperties['storePasswordStageProdQa']
  }
}

嗯,看完上诉,你的信用卡已自动扣款五块,感谢各位支持!!
你说啥?五块钱还想要手机上同时安装各个环境的包?!
好嘛,applicationIdSuffix了解一下,同样还是在我们的productFlavors里面:

prod{
 applicationIdSuffix ".prod"
}
qa{
 applicationIdSuffix ".qa"
}

你说啥?包名变了第三方库没法用了?唉,你的五块钱好值钱啊。
写在build.gradle里面的,都可以像2那样,放在.properties了,放在AndroidManifest里面的呢,额,不告诉你!


这个好像JS啊,啊,是啊,我也不知道什么像什么,那value的值写到哪里呢,都跟你说productFlavors了解一下啦,当然这个不写在productFlavors里面,哈哈哈,有本事跟着网线爬过来打我啊,我用无线网,哈哈哈

android {
      buildTypes {
        prod {
            manifestPlaceholders = [**_apikey: "12345664"]
        }
        qa {
            manifestPlaceholders = [**_apikey: "123456677"]
        }
      }
}

不同环境不同的第三方签名,意味着你可以对不同环境发生的各种事情进行监控,嗯,你懂的。

4.configurations 依赖分组
在Gradle中,依赖都被会分配到某一个具体的configuration中。Configuration代表着一个或多个构件及构件所需依赖的一个分组。

系统已经预定义了一些configuration,比如,compile,runtime,testCompile,testRuntime等,这个好像是gradle3.0以前,3.0以后是implementation,testImplementation。

compile/implementation 放在这个configuration下的依赖是在编译产品代码时所使用的,但它作为一个分组,包含产品代码和编译所需的依赖。
runtime 产品代码在运行时需要的依赖,默认,也会包含compile中的依赖。
testCompile 编译测试代码时所需要的依赖,默认,被编译的产品代码和产品代码需要的编译依赖也属于该分组。
testRuntime 运行测试时需要的依赖。默认,包含compile,runtime和testCompile的分组的构建和依赖。

上面这一大段都是抄的!感谢复制粘贴让我少些了好多字,废话少说,比如我们又一个监控内存泄漏的leakcanary,这个玩意儿引入以后,会生产一个查看内存泄漏的app,但是在我们版本发布以后我们是不想要这个的,为啥不想要啊?你还买一送一啊?!所以我们经常会区分debug版本和release版本,当然不同环境下可能需求也不一样,所以:

prodDebugCompile "com.squareup.leakcanary:leakcanary-android:1.5"
    prodReleaseCompile "com.squareup.leakcanary:leakcanary-android-no-op:1.5"
    qaDebugCompile "com.squareup.leakcanary:leakcanary-android:1.5"
    qaReleaseCompile "com.squareup.leakcanary:leakcanary-android-no-op:1.5"

然后配置configuration:

configurations {
    prodReleaseCompile
    prodDebugCompile
    qaReleaseCompile
    qaDebugCompile
}

这样,在我们打包的时候,gradle就会根据不同场景打包不同的依赖。

你可能感兴趣的:(Gradle 二三事)