第1章 老司机 要飙车 抓紧 开启你的Android路

Android简述

什么是Android呢?Android,是一种基于Linux的自由及开放源代码的操作系统,主要应用于移动设备,例如手机,平板等。

Android历史

  • 2003年10月,Andy Rubin等人创建Android公司,并组建Android团队; (意味Android的诞生)

  • 2005年8月17日,Google低调收购了成立仅22个月的高科技企业Android及其团队; (意味Android拥有了雄厚的资源与强势的背景,同时也为将来征战四方打下基础)

  • 2007年11月5日,谷歌向外界展示了名为Android的操作系统,并在当天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,并与84家硬件制造商、软件开发商及电信营运商组成 开放手持设备联盟(Open Handset Alliance) 来共同研发改良Android系统,这一联盟将支持谷歌发布的手机操作系统以及应用软件,Google以Apache免费开源许可证的授权方式,发布了Android的源代码(新生的系统,强势的背景,雄厚的资源,为我Android造势一波)

  • 2008年,在GoogleI/O大会上,谷歌提出了AndroidHAL架构图,在同年8月18号,Android获得了美国联邦通信委员会(FCC)的批准,在2008年9月,谷歌正式发布了Android 1.0系统,这也是Android系统最早的版本; (Android正式启航)

  • 2010年2月份,Linux内核开发者Greg Kroah-Hartman将Android的驱动程序从Linux内核“状态树”(“staging tree”)上除去,从此,Android与Linux开发主流将分道扬镳。在同年5月份,谷歌正式发布了Android 2.2操作系统。谷歌将Android 2.2操作系统命名为Froyo,翻译完名为冻酸奶;

  • 2010年10月份,谷歌宣布Android系统达到了第一个里程碑,即电子市场上获得官方数字认证的Android应用数量已经达到了10万个,Android系统的应用增长非常迅速。在2010年12月,谷歌正式发布了Android 2.3操作系统Gingerbread (姜饼)

  • 2011年1月,谷歌称每日的Android设备新用户数量达到了30万部,到2011年7月,这个数字增长到55万部,而Android系统设备的用户总数达到了1.35亿,Android系统已经成为智能手机领域占有量最高的系统;(Android翻开新的篇章:辉煌)

  • 2011年8月2日,Android手机已占据全球智能机市场48%的份额,并在亚太地区市场占据统治地位,终结了Symbian(塞班系统)的霸主地位,跃居全球第一(一战成名,笑傲江湖)

  • 2013年11月1日,Android4.4 KitKat(奇巧巧克力)正式发布,从具体功能上讲,Android4.4提供了各种实用小功能,新的Android系统更智能,添加更多的Emoji表情图案,UI的改进也更现代,如全新的HelloiOS7半透明效果;(历史上重大改版,再次翻开新的篇章:巅峰)

  • 2014年11月3日,Android 5.0 Lollipop(棒棒糖)正式发布。 并且从Android 5.0 后,谷歌推出一种全新新的Material Design设计风格,也被称为一门新的设计语言,并逐渐在Android各大应用上尽情绽放光彩;

  • 2015年5月28日,Android 6.0 Marshmallow(棉花糖)正式发布。 新系统的整体设计风格依然保持扁平化的MeterialDesign风格。Android6.0在对软件体验与运行性能上进行了大幅度的优化,并且新增运行时权限、低电耗模式和应用待机模式省电功能、新的协助技术等。例如普遍耗电问题,据测试,Android6.0可使设备续航时间提升30%;

  • 2016年8月22日,Android 7.0 Nougat(牛轧糖)正式发布。 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更,重点关于点在于权限的严格控制与管理;

  • 2017年5月,Android 8.0 Oreo(奥利奥)正式发布。引入官方对其描述:更智能、更迅捷、更强大。广受世人喜爱的不仅仅是曲奇饼干,更是为您打造的全新 Android 系统。它主要更新内容便是继续深入优化了电源及性能,并提供了多种全新方式来扩展应用。例如:通知渠道、画中画、自动填充、自适应图标等。

当然Android的历史之路当然不止上面所述的几个版本而已,这里只是为大家简述,了解即可。谷歌官方版本的不断升级也为自己赢得一个当之无愧的称号:版本帝~!

而目前移动端,几乎划分为Android、IOS俩大阵营,当然还有微软的WinPhone和其他一些占比比较低的阵营,Android几乎属于霸主的地位。

Android系统架构

image

下面将依次进行简单说明。

第一层为:系统应用层

Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊状态。因此第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。

系统应用可用作用户的应用,以及提供开发者可从其自己的应用访问的主要功能。例如,如果你的应用要发短信,无需自己构建该功能,可以改为调用已安装的短信应用向你指定的接收者发送消息。

第二层为:Java API 框架

可通过以 Java 语言编写的 API 使用 Android OS 的整个功能集。这些 API 形成创建 Android 应用所需的构建块,它们可简化核心模块化系统组件和服务的重复使用,包括以下组件和服务:

  • 丰富、可扩展的视图系统,可用以构建应用的 UI,包括列表、网格、文本框、按钮甚至可嵌入的网络浏览器;
  • 资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件;
  • 通知管理器,可让所有应用在状态栏中显示自定义提醒;
  • Activity 管理器,用于管理应用的生命周期,提供常见的导航返回栈;
  • 内容提供程序,可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己的数据。

第三层:原生 C/C++ 库

许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形; 如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库

第四层:Android Runtime

对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行。 ART 的部分主要功能包括:

  • 预先 (AOT) 和即时 (JIT) 编译;
  • 优化的垃圾回收 (GC);
  • 更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置监视点以监控特定字段;
  • 在 Android 版本 5.0(API 级别 21)之前,Dalvik 是 Android Runtime。如果您的应用在 ART上运行效果很好,那么它应该也可在 Dalvik 上运行,但反过来不一定。

Android 还包含一套核心运行时库,可提供 Java API 框架使用的 Java 编程语言大部分功能,包括一些 Java 8 语言功能

第五层:硬件抽象层 (HAL)

硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。

第六层:Linux 内核

Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。

使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序

工欲善其事,必先利其器

工欲善其事,必先利其器。掌握好的开发工具,总是使我们开发过程中事半功倍。

话说当年开发Android第一利器当属Eclipse,而随着谷歌BaBa突然对Eclipse以后不支持ADT更新,并且推出Android Studio作为首位开发Android的软件,让我们这些吃瓜群众实属大惊。

在这里不得不吐槽的是,早期的Android Studio稳定性相对来讲比较low,随着版本迭代升级,现在Android Studio可谓空前强大,让人爱不释手。

到目前为止,Android Studio稳定版本为2.3.3,而关于Android Studio 3.0却只是Beta 5。而我们今天将依据Android Studio 3.0 Beta 5版本进行举例说明如何在本机一步步配置到最后使用Android Studio。

Android Studio 3.0 Beta 5 下载

官方地址如下:

https://developer.android.google.cn/studio/preview/index.html

注:

1. 下面将统一称Android Studio 3.0 Beta 5为AS;

小伙伴们可从官方地址下载AS抢先试用。

点击下载后,勾选确定阅读许可协议,方可开始下载。

image

解压安装

将下载好的AS解压到本地目录下面,最好新建AndroidStudio3.0目录,方便管理,当然,尊重个人习惯。

解压完成后,进入bin目录下,双击studio64.exe,开始运行安装

image

双击之后,弹出如下提示框,下面将分别为大家介绍每个的含义or作用:

image

完成AS安装需要设置如下选项:

  1. 导入之前Android Studio 2.3配置信息;
  2. 自定义位置以及配置文件夹或安装之前的版本;
  3. 不导入任何配置。

这里我们选择不导入任何配置,纯天然,无污染,一切从新开始,I like it。

点击确定后,启动AS 3.0 Beta 5,这速度,666~

image

启动完成后会提示一个找不到SDK位置,不要着急,因为我们选择的是重新开始~

image

直接关闭,AS会自动查找可用的SDK。

image

运行AS安装向导

Welcome Android Studio~!

简单翻译内容如下:

运行此工作向导将为Android开发设置开发环境,此外此向导还会帮助开发者创建首个Android项目。

image

选择你想要安装的Android Studio类型,此时有如下俩个选择:

  1. 标准版

Android Studio将安装使用最常见的设置和选项。建议大多数用户选择此项    2. 自定义

你可以自定义安装设置和组件安装

这里我们选择自定义,也就是下面的选项,因为后期会有一个SDK的下载,一般来讲都是我们确定好统一目录,方便管理,这里选择推荐的,它默认下载到C盘中,个人不推荐。

image

选择你的撸码UI界面风格,我喜欢黑的~嘿嘿

image

这一步可以手动选择SDK下载存放位置。

image

而这一步,就列举出来将要下载文件的详情。

image

乌拉拉,下载喽~ 这一步,大家可以抽根烟,泡个妹子,喝杯咖啡,不急不急~

image

真想唱一句,我等你等了那么久...

image

久违了,老伙计

image

好了,到此 AS 3.0 Beta 5安装完毕。

了解与Android沟通的语言

走过了序幕,翻过了Hello Android,踏平了工欲善其事必先利其器,来到了了解与Android沟通的语言。

为什么单独作为一小节来说明这个东西,简单为大家说明一下:

就好比Java的编程思想是,万物皆对象。在此注明,这个对象和你身边躺着的那位可不一样哦~

我们总是基于各种语言开发,试问,有谁能知道有多少种语言可以开发Android呢?又有谁敢十分肯定的说呢?少之又少。那我们为何不去简单了解下呢?哪儿怕为了在面试中更好的吹水,要更高的Money,当然,也不是说你知道开发语言越多越能要Money,了解,掌握,熟练方才是根本。

综上所述,简明概括为一句话:多了解还是没有坏处的~!

Android开发语言

Java

Kotlin-谷歌官方开发Android第一语言

The first Android Project

经过前几小节的铺垫,这节正式为你拉开Android开发序幕,学习万千语言的第一步,Hello Word~

本节,我们继续采取图文结合的方案进行讲解~

开启我们第一个Android Pro

简单了解首页功能项

找到昨天安装目录,运行安装完毕的Android Studio 3.0 Beta 5版,如下图:

image

每个选项含义如下:

  • 开始一个新的Android Studio项目

  • 打开已存在的Android Studio项目

  • 从版本控制中检出项目,在此提供GitHub、CVS、Git、Goodle Cloud、Mercurial、SubVersion(SVN)方式

  • 配置或者调试APK

  • 迁移Eclipse项目

  • 导入Android源码示例

新建项目

选择新建项目,你可以设置项目名称、项目包名、以及项目保存地址。

当然如果你是ndk爱好者,你也可以勾选下方的导入C++依赖;

如果你也想体验下谷歌新宠儿,Kotlin,你也可以勾选下面的Kotlin依赖。

image

选择最低兼容的SDK版本

从这一步就可以看出我大Android设计领域之广,你可以创建Android手机(移动端) Pro,也可以创建Android 手表类型Pro,当然还可以创建Android TV Pro 以及 Auto Pro。

image

当然,你也可以点击“Help me choose”去查看目前版本在市场占有率,从而决定你最低兼容SDK版本。

image

选择创建Activity的模板

image

创建一个空的Activity

image

安装所需组件。

image

点击finish,开始构建我们的第一个Android Pro。

image

首次构建时间比较久,当然大家可以选择进行优化以加快Build速度。

构建完成后自动打开Android Studio界面,但是我们发现此时抛出一个异常如下:

image

猜测应该为Gradle出的问题,这时候需要打开设置,去查看我们的Gradle配置是否出现问题。

image

设置使用本地Gradle,然后点击try,ok。

启动模拟器

Android Studio中为我们内置了模拟器,当然你也可以下载Genymotion,这里就直接选择使用内置模拟器。

点击后打开预览界面,接着点击创建模拟器(左下角),开始进行选择心仪的模拟器进行下载安装即可。

image

大家可以清晰的看到谷歌为我们提供的一些设备型号,好好挑选一番`

当我们选择某个型号的手机后,Android Studio会为我们罗列出其型号支持的Android系统版本,按需下载。

image

点击下载并勾选用户协议

image

进行下载中,稍等片刻即好。

image

下载完成准备安装。

image

确认当前设备名称,一般默认即可。

image

安装完成后,当前模拟器便会显示你刚刚下载的那个,随后点击启动,我们先来运行一把~

运行 查看第一个Android Pro结果

点击如下图标,开始运行当前项目。

image

选择当前我们开启的模拟器设备,双击确定。

image

运行结果如下:

image

OK,到此为止,我们第一个Android应用已经完成,并且成功运行。

下面,我们回过头,一起来看下Android Studio的项目结构以及每个所代表的含义。

Android Studio目录结构简述

下面将依据官方图例进行说明:

image

要查看项目的实际文件结构(包括 Android 视图下隐藏的所有文件),请从 Project 窗口顶部的下拉菜单中选择 Project。

选择 Project 视图后,你会看到更多文件和目录。最重要的一些文件和目录如下所示:

模块名称

  • build/:包含构建输出;

  • libs/:包含私有库;

  • src/:包含模块的所有代码和资源文件,分为以下子目录:

    • androidTest/:包含在 Android 设备上运行测试的代码;

    • main/:包含“主”源集文件:所有构建变体共享的 Android 代码和资源(其他构建变体的文件位于同级目录中,例如调试构建类型的文件位于 src/debug/ 中);

      • AndroidManifest.xml:说明应用及其每个组件的性质;

      • java/:包含 Java 代码源;

      • jni/:包含使用 Java 原生接口 (JNI) 的原生代码;

      • gen/:包含 Android Studio 生成的 Java 文件,例如您的 R.java 文件以及从 AIDL 文件创建的接口;

      • res/:包含应用资源,例如可绘制对象文件、布局文件和 UI 字符串;

      • assets/:包含应原封不动地编译到 .apk 文件中的文件。您可以使用 URI 像浏览典型文件系统一样浏览此目录,以及使用 AssetManager 以字节流形式读取文件;

    • test/:包含在您的主机 JVM 上运行的本地测试的代码;

  • build.gradle(模块):定义模块特定的构建配置;

build.gradle(项目):定义适用于所有模块的构建配置。此文件已集成到项目中,因此你应当在所有其他源代码的修订控制中保留这个文件

嗯哼,基本介绍到此结束,欢迎大家继续观看下面文章以便你更好的掌握Android~

参考文献

  1. 谷歌官方:https://developer.android.google.cn/studio/projects/index.html

android log 学习以及了解build文件

亲爱的小伙伴,通过前面几节的内容学习,相信大家已经对Android有个大概的认知,对,就是这么easy。

下面,深呼一口气,让我们一起完成第一章最后的学习~

本节目标

  • 如何将项目转为Kotlin项目;

  • Android中Log如何运用实践;

  • build文件作用

本小节将基于以上三点为大家进行细致描述。

如何将项目转为Kotlin项目

kotlin推出之后,可谓开启了新的一波学习大潮,国外的大牛好评如潮。而我们一开始创建的项目如何兼容Kotlin呢?

So Easy~!

操作流程如下:

点击 Code ---> Convert Java File To Korlin File

因为我们首次使用Kotlin,So,我们需要在Convert完成之后进行下载Kotlin支持。

Kotlin: A new version 1.2.0-release-Studio3.0-1 of the Kotlin plugin is available. Install

Platform and Plugin Updates: Restart Android Studio to activate changes in plugins?

image

下载完成后,会有一个Config标识,点击,进行配置。

这几步只需要按照提示进行即可,配置完成后再次查看Activity内容如下:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

到此,完成转化的工作,下面你就可以驾着Kotlin尽情奔驰了~

玩转Log日志

Android中为我们提供了Log工具类,而此类的作用就是方便我们在开发中不便调试或者说仅仅是需要查看当前某个参数而使用。

Log有几个级别,分别对应我们开发中遇到的不同情况,这里直接截取源码关于Log级别描述。

    /**
     * Priority constant for the println method; use Log.v.
     */
    public static final int VERBOSE = 2;

    /**
     * 输出Debug时调试日志
     */
    public static final int DEBUG = 3;

    /**
     * Priority constant for the println method; use Log.i.
     */
    public static final int INFO = 4;

    /**
     * 输出警告日志
     */
    public static final int WARN = 5;

    /**
     * 输出Error日志
     */
    public static final int ERROR = 6;

    /**
     * Priority constant for the println method.
     */
    public static final int ASSERT = 7;

上面简单为大家写了几个项目中常用的级别,那么如何使用呢?

很简单,统一格式,统一使用方式:

(String tag, String msg): tag标识,msg详情

那么在实际开发中又是如何使用的呢?

Log.e("APK_BUS", "this is a error log")

如上所示,设定Tag为:APK_BUS,Msg为:this is a error log

运行所示:

image

查看时需要选择日志级别以及Tag即可。

在公司开发时,大多数是多人协作开发,开发过程中不可避免要输出相应值,但是开发完成后,很多时候我们都忽略了这个日志的输出,那么如何避免这个问题呢?

定义一个统一工具类,统一进行管理,通过标识符进行管理开关闭日志输出。

var isStartLog = true

fun logD(tag: String, msg: String) {
    if (isStartLog) {
        Log.d(tag, msg)
    }
}

fun logE(tag: String, msg: String) {
    if (isStartLog) {
        Log.e(tag, msg)
    }
}

fun logI(tag: String, msg: String) {
    if (isStartLog) {
        Log.i(tag, msg)
    }
}

fun logW(tag: String, msg: String) {
    if (isStartLog) {
        Log.w(tag, msg)
    }
}

fun logV(tag: String, msg: String) {
    if (isStartLog) {
        Log.v(tag, msg)
    }
}

调用如下:

logE("APK_BUS", "Hello LogHelper")

正式打包前,只需要设置isStartLog为false即可。

这样一来,是不是很方便了呢?

build文件初窥

build文件一个存在项目根目录下,一个存在app下,这俩个分别有什么区别么?

首先,这个从位置上来说,一个属于项目级别,一个属于app源码相关级别。一个统筹全局,一个管好自己。

先来说下项目下的build文件到底是干什么的。

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.2.0'

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

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

项目下build文件作用就是为整个项目做一个初始化,为什么这么说呢?

由于我们的AS推崇的是远程依赖方式使用相关三方库,那么如何使用远程库,或者说是远程库一个基本配置又是什么?我们不得而知,只能往下解析查看。

  • buildscript:加载gradle脚本自身需要使用的资源以及相关依赖项、第三方插件、maven仓库地址等;

    • repositories:依赖管理的服务器。默认是 jcenter();

    • dependencies:依赖管理,具体到你要用什么;

  • allprojects:所有项目配置

  • task clean:清理Build文件

而app下的build文件如下:

apply plugin: 'com.android.application'

android {
    // 编译sdk的版本,也就是API Level,例如API-19,API-20,API-21等
    compileSdkVersion 25
    // build tools的版本,其中包括了打包工具aapt,dx等 这个工具位于你的sdk目录/build-tools/下
    buildToolsVersion "25.0.2"
    // 项目默认配置
    defaultConfig {
        applicationId "应用包名"
        // 最小sdk版本,如果设备小于这个版本或者大于maxSdkVersion(一般不用)将无法安装这个应用
        minSdkVersion 12
        // 开启分包
        multiDexEnabled = true
        // 目标sdk版本,如果设备等于这个版本,那么android不进行兼容性检查,运行效率会高一点
        targetSdkVersion 23
        // 版本号(更新频率),暂时规则为 每次在原有版本号上累加此次更新内容数量
        versionCode 1
        // 版本信息 (用户实际看到的版本号)
        versionName "1.0.0"
        // 自动化测试地址
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        ndk {
            //设置支持的SO库架构
            abiFilters 'armeabi', 'arm64-v8a' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
        }
    }
    // 配置multiDex,使其Android Studio编译速度更快
    dexOptions {
        // 关闭对Lib做preDexing
        preDexLibraries = false
        // 开启incremental dexing,优化编译效率,这个功能android studio默认是关闭
        //incremental true
        // 增加java堆内存大小
        javaMaxHeapSize "4g"
    }

    signingConfigs {
        release {
            storeFile file('本地key存放地址')
            storePassword '密码'
            keyPassword '密码'
            keyAlias '别名'
        }
    }

    buildTypes {
        // release(正式)版本的配置
        release {
            // 是否支持zip
            zipAlignEnabled true
            // 注:Android Studio 2.3版本之后默认开启移除无用资源文件
            // 是否进行混淆
            minifyEnabled false
            // 是否支持调试 测试版开启 正式版关闭
            debuggable true
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        // debug(测试)版本的配置
        debug {
            minifyEnabled false
            zipAlignEnabled true
            shrinkResources false // 移除无用的resource文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            debuggable true
            //signingConfig signingConfigs.release
        }
    }
    // 关闭Android Studio对PNG合法性检查
    aaptOptions {
        cruncherEnabled = false
        useNewCruncher = false
    }
    // lint检查
    lintOptions {
        // 关闭Android Studio 在打包Release版本时检测
        checkReleaseBuilds false
        // lint时候终止错误上报,防止编译的时候莫名的失败
        abortOnError false
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
    }
}

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

嗯哼,到这里,build介绍完毕,剩下只能各位在开发过程中挖掘了~

猜你喜欢

转载自www.cnblogs.com/aaron911/p/12155441.html