详解2个build.gradle文件

注意:本篇文章是本人阅读相关文章的总结,方便以后查阅,所有内容非原创,侵权删。

本篇文章内容来自于
1.Android第一行代码 郭霖
2.相对应的知识块的最下方会给出原来的帖子的链接

目录

  1. 最外层目录下的build.gradle文件
  2. app目录下的build.gradle文件
    --2.1 Android Studio3.0中dependencies依赖由compile变为implementation/api的区别
    --2.2 versionCode和versionName

项目中有两个build.gradle文件。
一个在最外层目录下,一个在app目录下。两个文件对构建AS项目都起到了至关重要的作用。

1. 最外层目录下的build.gradle文件

通常情况不用修改这个文件中的内容。除非添加一些全局的项目构建的配置

buildscript { //构建脚本
    //两处repositories都有jcenter()
    //jcenter是一个代码托管仓库,很多Android开源项目都会选择将代码托管到jcenter上。
    //进行了这行声明后,我们就可以在项目中轻松引用任何jcenter上的开源项目了。
    repositories { //仓库
        google()
        jcenter()
    }
    dependencies { //依赖
        //使用classpath声明了一个Gradle插件。
        //为什么要声明这个插件呢?因为Gradle并不是专门为构建Android项目而开发的。java C++等多个项目都可以使用Gradle来创建。
        //如果我们想用他来构建项目,则必须声明这个插件
        classpath 'com.android.tools.build:gradle:3.0.1'
    }
}

allprojects {
    repositories { //仓库
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

2. app目录下的build.gradle文件

apply plugin: 'com.android.application'
//应用了一个插件
//两种值可以选 com.android.application(表示这是一个应用程序模块) 和 com.android.library(表示这是一个库模块)
//应用程序模块和库模块最大的区别:前者可以直接运行,后者只能作为代码库依附于别的应用程序模块来运行。

android { //android闭包 可以用来配置项目构建的各种属性
    compileSdkVersion 26 //指定项目的编译版本 24就是使用Android 7.0系统的SDK编译
    buildToolsVersion "26.0.2" //指定项目构建工具的版本 有更新版本系统会自动提示?
    
    defaultConfig { //可以对项目的更多细节进行配置
        applicationId "com.example.apple.systemdemo1" //指定项目的包名(创建时设置,后期修改则在这里修改)
        minSdkVersion 15 //指定项目最低兼容的Android系统版本,15表示最低兼容到Android4.0系统
        targetSdkVersion 26 //targetSdkVersion表示你在该目标版本上已经做过了充分的测试。系统将会为你的应用程序启用一些最新的功能和特性。
        //比如Android6.0系统引入了运行时权限这个功能,将targetSdkVersion指定成23或者更高,那么系统会启动运行时权限。
        //但如果你将targetSdkVersion指定成22 那么说明你的程序最高只在Android5.1系统上做过充分的测试。Android6.0系统中引入的新功能自然不会启用。
        versionCode 1 //用于指定项目版本号
        versionName "1.0" //用于指定项目的版本名
        //versionCode和versionName在生成安装文件时特别重要
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    //buildTypes闭包用于指定生成安装文件的相关配置
    //通常只会有2个子闭包,一个是debug 一个是release
    //debug包用于指定生成测试版安装文件的配置 release闭包用于指定生成正式版安装文件的配置
    //debug包可以忽略不写。
    //通过AS直接运行项目生成的都是测试文件
    buildTypes {
        release {
            minifyEnabled false //用于指定是否对项目的代码进行混淆 true表示混淆 false表示不混淆
            //proguardFiles用于指定混淆时使用的规则文件
            //这里指定了2个 proguard-android.txt是AndroidSDK目录下的tools/proguard的,里面是所有项目通用的混淆规则
            //proguard-rules.pro是当前项目根目录下的,里面可以编写当前项目特有的混淆规则
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

//dependencies闭包可以指定当前项目所有的依赖关系
//通常AS项目有三种依赖方式:本地依赖+库依赖+远程依赖
//本地依赖可以对本地的jar包或者目录添加依赖关系
//库依赖可以对项目中的库模块添加依赖关系
//远程依赖则可以对jcenter库上的开源项目添加依赖关系
dependencies {
    //本地依赖声明 表示将libs目录下的所有.jar后缀的文件都添加到项目的构建路径中
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //远程依赖 com.android.support是域名(用于和其他公司的库作区分) appcompat-v7是组名称(用于和同一个公司中不同的库作区分) 26.1.0是版本号(用于对同一个库中不同的版本作区分)
    //加上远程依赖的声明后:Gradle会在构建项目时先检查以下本地是否已经有这个库的缓存,没有则自动联网下载,然后添加到项目的构建目录中。
    implementation 'com.android.support:appcompat-v7:26.1.0'
    //库依赖 compile project +要依赖的库的名称 比如一个库模块叫helper 则为compile project(':helper')
    //testImplementation是用于声明测试用例库的
    testImplementation 'junit:junit:4.12'
}

2.1 Android Studio3.0中dependencies依赖由compile变为implementation/api的区别

//3.0之前
compile fileTree(dir: 'libs', include: ['*.jar'])
//3.0之后
implementation fileTree(dir: 'libs', include: ['*.jar'])
或
api fileTree(dir: 'libs', include: ['*.jar'])

在3.0版本中,compile 指令被标注为过时方法,而新增了两个依赖指令,一个是implementation和api,这两个都可以进行依赖添加
推荐:依赖首先应该设置为implementation的,如果没有错,那就用implementation,如果有错,那么使用api指令,这样会使编译速度增快。

api和implements的区别:
api 完全等同于compile指令
implementation 将该依赖隐藏在内部,而不对外部公开。则对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序。好处是编译速度会加快。
比如:A用implements依赖gson库,B又依赖A,此时B无法直接使用gson库。

来自/具体参考:Android Studio3.0中dependencies依赖由compile变为implementation的区别

2.2 versionCode和versionName

versionCode 1 //用于指定项目版本号
versionName "1.0" //用于指定项目的版本名

VersionCode只能输入整形,
VersionName输入随意,可为"1.6.0",也可以为"两只老虎,两只老虎"。

Google为APK定义了两个关于版本属性:VersionCode和VersionName,他们有不同的用途。
VersionCode:对消费者不可见,仅用于应用市场、程序内部识别版本,判断新旧等用途。
VersionName:展示给消费者,消费者会通过它认知自己安装的版本

重要结论:
1.不同版本的VersionCode一定要不一样,否则应用市场不会让你通过审核。目测,各种应用市场都是通过VersionCode来判断是否提醒用户更新的。
2.VersionName一般取成方便理解的标识。1.2.0明显比1.1.1的版本要新。而我们普通人也习惯了这种记录版本的方式。

命名规则:
VersionName-------
常见软件版本号的形式是major.minor.maintenance.build
major是主版本号,一般在软件有重大升级时增长
minor是次版本号,一般在软件有新功能时增长
maintenance是维护版本,一般在软件有主要的问题修复后增长
build构建版本(测试版本一般会用到)
正式版本:major.minor.maintenance----1.0.0
测试版本:major.minor.maintenance.build----1.0.0.5

VersionCode-------
我公司以5位数的 int 来表示 (每次升级版本时,versioncode的值都要比以前的值要大)
正式版本:major.minor.maintenance----1.0.0(versioncode:10000)
测试版本:major.minor.maintenance.build----1.0.0.5(versioncode:10005)

从manifest读取versionName的代码

    PackageManager pm = context.getPackageManager();  
    PackageInfo pi;  
    String versionName = "";  
    try {  
        pi = pm.getPackageInfo(context.getPackageName(), 0);  
        versionName = pi.versionName;  
    } catch (NameNotFoundException e) {  
        e.printStackTrace();  
    }  

具体参考/来自
android中的VersionCode和VersionName到底有什么区别
Android APP VersionCode和VersionName命名规则VersionName的命名规则

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 本文原作者为:kale2010 .blog地址:http://www.cnblogs.com/tianzhijie...
    NoValue阅读 3,552评论 0 11
  • 不同于 Eclispse,Android Studio 是采用 Gradle 来构建项目的,Gradle 是一个非...
    QDJdeveloper阅读 918评论 0 0
  • 转载注明出处:http://www.jianshu.com/p/5255b100930e 0. 前言 完全由个人翻...
    王三的猫阿德阅读 2,514评论 0 4
  • 风是凶手导致月的残,所以乌云还未出现,沙漠里就凋落许多花瓣。只有 沉默的溪涧,流传着彩虹的幻现。一场雨终究是一场灾...
    李一十八阅读 400评论 0 0