转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=255063&extra=page%3D2%26filter%3Dauthor%26orderby%3Ddateline&_dsign=55ac1be3

Android Studio 相关功能介绍文件夹组织视图

最常用的有 Project 和 Android 视图,前者按照项目文件树进行组织,后者是以 Gradle 构建文件作为核心进行组织:
 
Project 视图与 Android 视图
 

Gradle 相关文件结构

让我们来观察一下Android Studio 中 Gradle 相关的结构:
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
.
├── gradle
│   └── wrapper                                //所使用的 Gradle 包装器配置
├── .gradle                                        //所使用 Gradle 版本
│   └── 2.8
├── AsInDepth.iml
├── app                                                //app module
│   ├── app.iml
│   ├── build
│   ├── build.gradle                //app module 的 build.gradle
│   ├── libs
│   ├── proguard-rules.pro
│   └── src
├── build.gradle                        //项目 build.gradle,通常配置项目全局配置,如 repositories 和 dependencies
├── gradle.properties                //项目属性文件,通常可以放置一些常量
├── gradlew                                        //Gradle 包装器可执行文件
├── gradlew.bat                                //Gradle 包装器可执行文件(Windows)
├── lib                                                //lib module
│   ├── build
│   ├── build.gradle                //lib module 的 build.gradle
│   ├── lib.iml
│   ├── libs
│   ├── proguard-rules.pro
│   └── src
├── local.properties                //项目的本地属性,通常是 sdk 所在位置
└── settings.gradle                        //项目总体设置,通常是配置项目中所有的 module

Invalidate Cache

Android Studio 会出现索引的问题,那可以从删除 cache 重建索引,File->Invalidate Caches/Restart
 

Multiple Language Editor

多语言文字可以通过右击文件 Open Translation Editor,可以同时进行编辑,但是我发现如果把 strings.xml 改了别的名字,这个功能就不 work 了。
 

Gradle 相关功能介绍Gradle View

点击红色三角运行按钮,其实是执行了 Gradle 的 一些列任务,如果你想分别执行一些任务,则可以从 Gradle View 里面查看:
 
gradle view
 

命令行

工作区下方,有一个叫做 Terminal 的 tab,点击之后,会自动 cd 到当前 project 根目录下,可以输入如下命令来尝试下:
 
1 ./gradlew build
Windows 下应该是 gradlew.bat build,下面均以 Mac 为例,不再赘述
 
可使用 help 参数来查看有哪些选项:
 
1 ./gradlew --help
下面介绍一些重要的选项:
 
  • 查看运行 log
有些时候,一个任务运行失败,只给出一个错误,没有给具体原因,你就需要查看更多信息,可以使用参数 –info 或者 –stacktrace:
 
1 ./gradlew build --info
  • 指定 module 或者 build.gradle
Gradle 默认是当前目录下寻找 build.gradle 文件执行任务,这样执行 build 会使得整个 project 所有的 module 的 build 任务都会运行,浪费不必要的时间,可以指定 module (-p) 或者 build.gradle (-b)文件以缩小作用范围:
 
1 ./gradlew -p app build

Sync

正常情况下,修改了 build.gradle 文件,文件上方就会有一个 sync 的按钮,点击之后会重新构建整个 build.gradle。但是某些特殊情况,这个同步可能会失败。那就需要一个额外的触发。
方法有四:
 
  • 再修改一下文件,便会再次出现 sync 按钮
  • 点击上方工作区的按钮
sync button top
 
  • 点击 Gradle View 中的同步按钮
sync button top
 
  • 命令行执行一次 build

Build Variant

首先要了解两个概念:
 

Build Type

分为 debug 和 release,这个概念容易懂
 

Product Flavor

这个概念主要是为了满足如下需求:同一份代码要打多个包,例如收费 pay 和免费 free,逻辑上有一些小区别,又不想通过逻辑判断这种丑陋的方式。或者你要实现所谓多渠道打包。

Build Variant = Build Type x Product Flavor

配置好了Build Type 和 Product Flavor 之后,Gradle 会生成若干个包,分别为:
 
1
2
3
4
payDebug
payRelease
freeDebug
freeRelease

配置实例

build variant
 
假设这两个版本的 app,有一个类 DiffBean 需要做大量的逻辑判断,则可以通过在 build.gradle 中配置 product flavor,在代码中添加两个与 main 平齐的文件夹,
把 DiffBean 从 main 中抽出来,分别放在两个文件夹中,只关注对应的逻辑即可。
 
关于 Product Flavor 中都能定义哪些属性,请参考 Android Gradle DSL
 

Gradle 使用的仓库

要使用远程依赖,就得有个库的仓库,Gradle 支持 maven 仓库。这些库可以是公用的,例如 mavenCentral 或者 jcenter,也可以使用私有库。
笔者曾经上传过公用库到 mavenCentral 和 jcenter,前者的繁琐与难以管理,让人深恶痛绝。Android Studio 在0.8.0版本以后,将 jcenter 作为默认的 maven 库公用库来源。
私有库可以托管在任何一个能访问到的地方,可以托管在 bintray 上的私有空间,也可以是内网服务器上,甚至可以是本机磁盘上。
下面是本人使用的仓库的一个例子:
 
1
2
3
4
5
6
7
8
9
allprojects {
    repositories {
        jcenter()
        mavenCentral()
        maven {
            url 'file:///Users/myusername/repo/'
        }
    }
}
关于库,会在本系列的四篇会有更详细的叙述。
 

使用 jni 预编译 .so 库

  • 默认情况下,可以放在与 java 平级的 jniLibs 文件夹中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    .
    ├── AndroidManifest.xml
    ├── java
    │   └── io
    │       └── kvh
    ├── jniLibs
    │   ├── armeabi
    │   │   └── libweibosdkcore.so
    │   └── armeabi-v7a
    │       └── libweibosdkcore.so
    └── res
  • 很多人喜欢放在与 src 平级的 libs 文件夹中
    1
    2
    3
    4
    5
    6
    7
    8
    ├── build.gradle
    ├── libs
    │   ├── armeabi
    │   │   └── libweibosdkcore.so
    │   └── armeabi-v7a
    │       └── libweibosdkcore.so
    ├── proguard-rules.pro
    └── src
    这样需要在 build.gradle 文件添加如下说明:
    1
    2
    3
    4
    5
    6
    android {
       sourceSets {
           main {
               jniLibs.srcDirs = ['libs']
           }
       }

升级 gradle 插件

  • 在 bintray 上查找最新的版本
  • 修改项目的 build.gradle 中插件的版本
    1
    2
    3
    4
    5
    6
    7
    8
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.0.0-alpha5'//这里
        }
    }
  • 如果有提示错误,则可能需要 gradle 的运行环境版本,修改项目根目录下文件 gradle/wrapper/gradle-wrapper.properties 中的 distributionUrl为最新,例如
    1 distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip

遇到的坑

所在的项目的包已经发布到了 mavenCentral 和 jcenter,很多用户的在集成的时候,遇到问题,其中最经典的问题,便是下面的三个。
 

下载依赖库失败,报 peer not found

连接 jcenter 库默认使用 https 协议,出现这个错,多数情况下都是因为连接失败了,原因嘛,你懂的。
可以尝试将 jcenter 改成默认使用 http 连接:
 
1
2
3
jcenter {
            url "http://jcenter.bintray.com/"
        }

下载不到特定的版本

Maven 和 Gradle 都会有一个缓存库,默认安装的情况下,是在用户根目录下的 .m2 或者 .gradle 文件夹中。
可以尝试删除里面的文件。例如将 Gradle 的 cache 文件删除:
 
1 rm -rf ~/.gradle/caches/
注意这个操作可能会导致所有的远程库都需要重新下载,要三思后行。

库重复冲突

笔者的包使用了 com.android.support:support-v4:19.0.0 包,可能用户的 app 也使用了这个包,就可能在编译进行代码合并到时候出类似的错:
 
1
2
UNEXPECTED TOP-LEVEL EXCEPTION
multiple dex files define Landroid/support/annotation/AniRes
这个时候,在 module 的 build.gradle 的 dependency 添加依赖时,加入 exclude 规则:
 
1
2
3
compile ('com.bugtags.library:bugtags-lib:latest.integration') {
        exclude group: 'com.android.support', module: 'support-v4'
}

后续引言

讲到这里,有些读者可能会遇到跟我当时开始使用 Gradle 一样的问题:遇到问题就 stackoverflow,找到 workaround 了但不知道为什么,gradle 版本更新了,发现不 work 了,甚为惆怅。
究其原因,都是不理解基础。下面扼要勾勒个大概。
首先 Gradle 是一个构建平台,它使用的是 Groovy 语言。
Groovy是一种基于 Java 的语言,提供了更好的动态特性,可以使用闭包使得编程更灵活,很适合做脚本语言。
上面提到的 settings.gradle 和 build.gradle 在 Gradle 平台中,其实都是一个 Groovy 对象。
Gradle 通过插件(plugin)的方式来支持构建。插件是很多任务(task)的集合,task 中又包含了许多 action。
而例如 productFlavors 都是一个所谓的 DSL,插件都定义了很多的 DSL,我理解的所谓的 DSL 就是一个小语言规范用来处理一个特定的事情(大多情况下是配置)。Android 的插件的 DSL 文档在 Android Gradle DSL 有说明。
理解了以上基础之后,你就会知其然,知其所以然了。

Android Studio :Android Studio 与 Gradle 深入【二】的更多相关文章

  1. Android Studio系列教程四--Gradle基础

    Android Studio系列教程四--Gradle基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ...

  2. Android高效开发环境(Genymotion,Gradle,Andriod Studio)

    临近十一,项目接近上线,终于有些碎片时间可以查看一些博客. 这篇博客是Android开发大牛Cyril Mottier在去年写的博客,我把它翻译一下共享给国内志同道合的朋友,同时也是对自己一个很好的锻 ...

  3. Android开发之深入理解Android Studio构建文件build.gradle配置

    摘要: 每周一次,深入学习Android教程,TeachCourse今天带来的一篇关于Android Studio构建文件build.gradle的相关配置,重点学习几个方面的内容:1.applica ...

  4. [转]Android Studio系列教程六--Gradle多渠道打包

    转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...

  5. Android Studio系列教程六--Gradle多渠道打包

    Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...

  6. Android Studio系列教程五--Gradle命令详解与导入第三方包

    Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...

  7. 错误异常 (1)Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) will not work properly

    [已解决]Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) wil ...

  8. 为Android Studio 项目手动下载gradle

    在http://developer.android.com/samples/index.html上下载的例子,导入Android Studio的时候,第一件事就是下载项目对应版本的gradle.gra ...

  9. android studio 一直卡在Gradle:Build Running的解决办法

    转:android studio 一直卡在Gradle:Build Running的解决办法   在使用AS开发安卓应用程序的时候经常会遇到Gradle build running一直在运行甚至卡死的 ...

  10. android studio中如何替换gradle以防下载卡住

    我们在开发过程中需要导入别人的demo工程,那么你有事就会下载gradle构建文件,然而有时下载会一直卡住,那么这时候你就会想,我自己用迅雷去下载gradle文件然后不就行了,然后问题就来了 1.我们 ...

随机推荐

  1. jquery noConflict详解

    noConflict是防止其他库也用了$作为全局变量而引起的冲突,我们看看jquery是怎么做的 首先jquery在代码的开始部分定义了2个私有变量: _jQuery = window.jQuery ...

  2. php进阶函数

    1,对文件的操作,确保多个进程可以同时读写一个文件(flock函数) flock($hamdle,int $operator) operator的取值,LOCK_SH(共享锁定,读取程序),LOCK_ ...

  3. Entity Framework 迁移命令 详解

    一.Entity Framework 迁移命令(get-help EntityFramework) Enable-Migrations 启用迁移 Add-Migration 为挂起的Model变化添加 ...

  4. [资料]自动化e2e测试 -- WebDriverJS,Jasmine和Protractor

    1. http://sentsin.com/web/658.html 2. http://www.tuicool.com/articles/AnE3Mb 3. http://www.doc88.com ...

  5. WPF EventSetter Handler Command

    最近做一个工具,突然发现ListBox和ListView等列表控件的MouseDoubleClick事件有时候是获取不到当前双击的行对象数据的,比如这样写: <ListBox Grid.Row= ...

  6. .NET程序迁移到Mysql的极简方案——让GGTalk同时支持Sqlserver与mysql全程记录!

    园子里的这个GGTalk,咱们前前后后用它移花接木做的IM项目也不下三四个了.初次入手的时候,洋洋代码,多少感觉有些难以把握.不过一来二去,理清了头绪,也就一览无余了.相信跟我们一样想要利用GGTal ...

  7. HTML5+JS 《五子飞》游戏实现(八)人机对战

    要想实现人机对战,就必须让电脑自动下棋,而且要知道自动去查找对方的棋子,看看有没有可以挑一对的,有没有可以夹一个的,这样下起来才有意思. 当电脑用户下完棋后,电脑应立即搜索用户的棋子,然后如果没有被吃 ...

  8. 项目分布式部署那些事(2):基于OCS(Memcached)的Session共享方案

    在不久之前发布了一篇"项目分布式部署那些事(1):ONS消息队列.基于Redis的Session共享,开源共享",因为一些问题我们使用了阿里云的OCS,下面就来简单的介绍和分享下相 ...

  9. 学习Google Protocol buffer之概述

    XML这种属于非常强大的一种格式,能存储任何你想存的数据,而且编辑起来还是比较方便的.致命的缺陷在于比较庞大,在某些情况下,序列化和解析都会成为瓶颈.这种对于实时性很强的应用来说,就不太适合了,想象下 ...

  10. Java关键字this、super使用总结

    版权声明:原创作品,如需转载,请与作者联系.否则将追究法律责任. 作者:熔岩日期:2007-03-01MSN :leizhimin@126.com声明:原创作品,未经授权,谢绝转载! 好久没有对所学知 ...