关于Android Studio里的Gradle,你所需要知道的都在这里了

前言

你是不是有这种感觉,每当你使用Android Studio的时候,总会被她的优雅和便捷深深的吸引,但是一旦打开build.gradle文件就有一种想死的冲动,这尼玛都是什么啊,老子看不懂啦(ノಠ益ಠ)ノ彡┻━┻ ,不要着急,这篇文章就是来解救你的,看完这篇文章,你的种种疑问都会迎刃而解,从此与Android Studio过上快乐幸福的生活。(大雾→_→)

Gradle介绍

Gradle是一个先进的build toolkit,可以方便的管理依赖包和定义自己的build逻辑。到底有多先进,Android Studio官方集成Gradle,Google还专门写了Android Plugin for Gradle,你们感受一下。

基础配置

Android Studio中有一个顶级的build.gradle文件,每一个module还有一个自己的build.gradle。这个文件是使用Groovy语法和Android Plugin for Gradle元素的配置文件。通常我们只需要修改module的build文件就可以了。
下面是一个简单的例子

<code class="hljs rust has-numbering">apply plugin: <span class="hljs-string">'com.android.application'</span>

android {
    compileSdkVersion <span class="hljs-number">19</span>
    buildToolsVersion <span class="hljs-string">"19.0.0"</span>

    defaultConfig {
        applicationId <span class="hljs-string">"com.example.my.app"</span>
        minSdkVersion <span class="hljs-number">8</span>
        targetSdkVersion <span class="hljs-number">19</span>
        versionCode <span class="hljs-number">1</span>
        versionName <span class="hljs-string">"1.0"</span>
    }
    buildTypes {
        release {
            minifyEnabled <span class="hljs-keyword">true</span>
            proguardFiles getDefaultProguardFile(<span class="hljs-string">'proguard-android.txt'</span>), <span class="hljs-string">'proguard-rules.pro'</span>
        }
    }
}

dependencies {

     <span class="hljs-comment">// Module dependency</span>
    compile project(<span class="hljs-string">":lib"</span>)

    <span class="hljs-comment">// Remote binary dependency</span>
    compile <span class="hljs-string">'com.android.support:appcompat-v7:19.0.1'</span>

    <span class="hljs-comment">// Local binary dependency</span>
    compile fileTree(<span class="hljs-keyword">dir</span>: <span class="hljs-string">'libs'</span>, include: [<span class="hljs-string">'*.jar'</span>])
}
</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li></ul>

第一句apply plugin: ‘com.android.application’说明在这个build文件中使用Android plugin for Gradle,有了这一句后,那些针对Android的元素才有意义。比如android {…}这个就是配置所有针对Android项目build时的选项。

  • compileSdkVersion: 编译时用的sdk版本
  • buildToolsVersion: build工具的版本
  • defaultConfig: 动态的在build时配置AndroidManifest.xml里的项目,defaultConfig里的配置可以覆盖manifest里的配置。
  • buildTypes: 配置如何构建和打包你的App,默认有debug和release两个类型。debug类型包含调试时的信息,并且有debug key签名。release默认是不含签名的。本例中release版本用了ProGuard。
  • dependencies:android {…}这个元素之外,配置此模块的依赖。

依赖

<code class="hljs rust has-numbering">dependencies {

     <span class="hljs-comment">// Module dependency</span>
    compile project(<span class="hljs-string">":lib"</span>)

    <span class="hljs-comment">// Remote binary dependency</span>
    compile <span class="hljs-string">'com.android.support:appcompat-v7:19.0.1'</span>

    <span class="hljs-comment">// Local binary dependency</span>
    compile fileTree(<span class="hljs-keyword">dir</span>: <span class="hljs-string">'libs'</span>, include: [<span class="hljs-string">'*.jar'</span>])
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>
  • 模块依赖: compile project(“:lib”),表明本模块依赖于lib模块,编译的时候系统会把lib模块包含进来
  • 远程的二进制依赖: compile ‘com.android.support:appcompat-v7:19.0.1’,当本地没有此依赖时会默认从Maven Central Repository下载相应的依赖。从哪里下载可以在顶级的build文件中配置。
  • *本地二进制依赖:**compile fileTree(dir: ‘libs’, include: [‘.jar’]),把jar包拷贝到/libs文件夹下,compile fileTree(dir: ‘libs’, include: [‘*.jar’])意思是,app/libs下的所有jar包都包含进来

ProGuard

ProGuard的作用是在byte级别对你的app进行分析优化,使得你的App变得更小,更快。值得一提的是,当你使用某些开源项目时,他们会提醒你把一些包排除在ProGuard里,防止出错。

<code class="hljs r has-numbering">android {
    <span class="hljs-keyword">...</span>
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(<span class="hljs-string">'proguard-android.txt'</span>), <span class="hljs-string">'proguard-rules.pro'</span>
        }
    }
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>

getDefaultProguardFile(‘proguard-android.txt’)获得默认的ProGuard配置。每个模块也都有模块级别的ProGuard规则,在proguard-rules.pro这个文件里,当然你也可以自己配置ProGuard规则。关于ProGuard的详细配置,请参考ProGuard Manual

Application ID

Application ID是用来唯一标识要发行的应用的。在build.gradle里设置。

<code class="hljs bash has-numbering">   defaultConfig {
        applicationId <span class="hljs-string">"com.example.my.app"</span>
        minSdkVersion <span class="hljs-number">15</span>
        targetSdkVersion <span class="hljs-number">19</span>
        versionCode <span class="hljs-number">1</span>
        versionName <span class="hljs-string">"1.0"</span>
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>

系统允许你对不同的产品类型设定不同的id,比如免费版和高级版。

<code class="hljs lua has-numbering">productFlavors {
        pro {
            applicationId = <span class="hljs-string">"com.example.my.pkg.pro"</span>
        }
        free {
            applicationId = <span class="hljs-string">"com.example.my.pkg.free"</span>
        }
    }

    buildTypes {
        <span class="hljs-built_in">debug</span> {
            applicationIdSuffix <span class="hljs-string">".debug"</span>
        }
    }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>

配置签名

debug版本与release版本的区别在于是否可以在一个安全的设备上debug和APK如何被签名的。在debug版本中,系统会提供一个默认的key来签名和已知的证书来授权App,避免在构建的时候出现密码提示。但是在release版本中,除非你主动提供一个key,不然系统是不会构建此项目的。

Release签名步骤

  1. 创建keystore。keystore是一个包含一系列私钥的二进制文件,这个文件必须妥善保管。
  2. 创建一个私钥。一个私钥代表着一个app实体。
  3. 在build文件中配置
<code class="hljs r has-numbering">android {
    <span class="hljs-keyword">...</span>
    defaultConfig { <span class="hljs-keyword">...</span> }
    signingConfigs {
        release {
            storeFile file(<span class="hljs-string">"myreleasekey.keystore"</span>)
            storePassword <span class="hljs-string">"password"</span>
            keyAlias <span class="hljs-string">"MyReleaseKey"</span>
            keyPassword <span class="hljs-string">"password"</span>
        }
    }
    buildTypes {
        release {
            <span class="hljs-keyword">...</span>
            signingConfig signingConfigs.release
        }
    }
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul>

4.在Android Studio中启动assembleRelease。app/build/apk/app-release.apk这个文件就是包含你release key的apk了。
注:一般不会直接在build文件中写入密码的,密码信息可以写在环境变量中

<code class="hljs avrasm has-numbering">storePassword System<span class="hljs-preprocessor">.getenv</span>(<span class="hljs-string">"KSTOREPWD"</span>)
keyPassword System<span class="hljs-preprocessor">.getenv</span>(<span class="hljs-string">"KEYPWD"</span>)</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li></ul>

或者用命令行输入

<code class="hljs avrasm has-numbering">storePassword System<span class="hljs-preprocessor">.console</span>()<span class="hljs-preprocessor">.readLine</span>(<span class="hljs-string">"\nKeystore password: "</span>)
keyPassword System<span class="hljs-preprocessor">.console</span>()<span class="hljs-preprocessor">.readLine</span>(<span class="hljs-string">"\nKey password: "</span>)</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li></ul>

在Android Studio中配置签名

  1. 菜单栏里,点击Build > Generate Signed APK.
  2. 在弹出的窗口里点击Create new
  3. 填写相关信息
    key

  4. Build Type 选择release
    type

到此为止,你就可以去应用市场发布你的应用啦 ^_^

Build变量

定义productFlavors

有时你需要对同一个App发行不同的版本,如免费版、付费版之类的。这时你就需要用到productFlavors了。

<code class="hljs r has-numbering">android {
    <span class="hljs-keyword">...</span>
    defaultConfig { <span class="hljs-keyword">...</span> }
    signingConfigs { <span class="hljs-keyword">...</span> }
    buildTypes { <span class="hljs-keyword">...</span> }
    productFlavors {
        demo {
            applicationId <span class="hljs-string">"com.buildsystemexample.app.demo"</span>
            versionName <span class="hljs-string">"1.0-demo"</span>
        }
        full {
            applicationId <span class="hljs-string">"com.buildsystemexample.app.full"</span>
            versionName <span class="hljs-string">"1.0-full"</span>
        }
    }
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul>

productFlavors里的配置会覆盖defaultConfig里的配置,如上配置后,系统会为每一个不同版本使用一个不同的id。

给每一个版本添加对应的资源

当你有不同的版本的时候,不同版本之间肯定有不同,所以需要添加不同的资源。以demo版为例,在src目录下新建以下目录

demo

把需要的Activity,String.xml等资源加入到对应文件夹下。
在IDE左侧的Build Variants窗口里就可以看到如下四个Build变量

tupian

这样你需要哪个版本,直接选择就可以了。

最后

看到这里,再次打开build.gradle这个文件也不是感觉也没那么复杂了?是不是更爱Android Studio了?如有什么问题欢迎留言讨论。喜欢的话别忘了点个“顶”啊 ♪(^∀^●)ノ




转自:http://blog.csdn.net/L664675249/article/details/50556133



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值