Gradle是个啥东东?

2023-11-10

如何通俗地理解 Gradle?
我以前一直用 Eclipse with ADT 来开发Android 项目,而且对它的基础的原理掌握不深,直接上手开发的,没有去考虑太多的东西。现在手头上有一个新的项目要使用到Android Studio ,我早有耳闻AS大名,但是由于本人才疏学浅,这几天在学习AS的过程中对Gradle这个东西表示很不能理解,找了很多资料但是都描述得很专业,所以想问问各位,有没有什么比较形象易懂的解释来描述一下Gradle,它是什么东西,它有什么用,相对于Eclipse with ADT 中编译Android 程序的机制,他有什么优势?

Gradle是一个基于Apache AntApache Maven概念的项目自动化建构工具。它使用一种基于Groovy特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于JavaGroovyScala,计划未来将支持更多的语言。

上面是维基上对Gradle的解释,相信一个没有接触过构建的人是不大能看明白的,当初我也是.下面是我对Gradle 通俗的理解:
软件开发讲究代码复用,通过复用可以使工程更易维护,代码量更少..... 开发者可以通过继承,组合,函数模块等实现不同程度上的代码复用.但不知你有没有想过,软件开发也是一种工程作业,绝不仅仅是写代码,还涉及到工程的各种管理(依赖,打包,部署,发布,各种渠道的差异管理.....),你每天都在build,clean,签名,打包,发布,有没有想过这种过程,也可以像代码一样被描述出来, 也可以被复用.
举个例子
我是做Android开发的,你可知道国内有n个Android市场,n个手机品牌,n个手机尺寸......,一般公司都会针对不同的市场单独发包用来统计不同渠道的下载量等情况,可能需要针对不同(品牌,尺寸等各种硬件信息)的手机做一些特殊的处理,这个时候你可以针对不同的情况单独建一个工程,或者更好一点你可以通过一些变量来控制,像这样:
if(isMoto){do something}
else if(isHuawei){do something}
...
差异管理
但这两种解决方法都有自己的缺点,特别是前一种有极大的代码重复.后一种稍微好一点,但这种方式的差异是运行时的,不是静态的,对于moto手机上的处理逻辑对华为手机来说一点作用也没有,但这一段针对moto手机的处理逻辑也被装到了华为手机上了,通过gradle的productFlavor与buildtype可以实现静态级的差异控制可以参考 如何通过Gradle实现一套代码开发不同特性的APK · ByGhui
说到前面的多渠道问题,不同的渠道一般会对应不同的渠道号,你当然可以通过修改一次打一个包这种纯手工的方式来生成你的多渠道包,但据听说国内某团购网站的Android App有100多个渠道.这里出现了什么?重复,反复的去打包而且这些包之前的差异很小(只是渠道号不同),和写代码一样我们应该复用,通过Gradle可以实现一个命令打出所有的渠道包,一个命令打出指定的渠道包.再复杂一点,你可能需要不同的渠道对应不同的签名文件,不同的icon,不同的服务器地址...这些都可以通过Gradle来方便的实现.
依赖管理:
做软件开发你可能需要依赖各种不同的jar,library.你当然可以通过将.jar/library工程下载到本地再copy到你的工程中,但不知你是否听说过国外有个叫 中央仓库的东西,在这个仓库里你可以找到所有你能想到以及你从来没听说过的jar,aar... The Central Repository Search Engine 这里可以找到所有你需要的依赖,而你需要的只是指定一个坐标,如下:
<img src="https://pic4.zhimg.com/8883d4b758b288a74eb4c104db854c5f_b.jpg" data-rawwidth="330" data-rawheight="24" class="content_image" width="330">剩下的依赖的寻找,下载,添加到classpath等你都不需要去关心,通过这种方式来维护依赖的好处有以下几点: 剩下的依赖的寻找,下载,添加到classpath等你都不需要去关心,通过这种方式来维护依赖的好处有以下几点:
  1. 依赖不会进入到你的版本控制仓库中(默认会缓存到~/.gradle/下)
  2. 方便卸载装载依赖(只是一条坐标依赖,不需要删除即可)
  3. 方便的版本管理,如上图中的2.3.3既是picasso的版本号,若改为+就表示从中央仓库中下载最新的版本
  4. 不同工程的相同依赖不会存在重复副本(只在~/.gradle下存在一份)
项目部署
这方面我没怎么接触过,但据我所知通过一些插件,可以实现自动将你的输出(.jar,.apk,.war...)上传到指定仓库,自动部署...
罗哩罗嗦说了这么多,不知大家有没有理解
总结一下:
  1. Gradle是一种构建工具,它可以帮你管理项目中的差异,依赖,编译,打包,部署......,你可以定义满足自己需要的构建逻辑,写入到build.gradle中供日后复用.
  2. Gradle不是一种编程语言,它不能帮你实现软件中的任何实际功能
通俗的解释肯定是不严谨的解释,不妥之处欢迎讨论.
###
赞同过百,放出之前相关分享的幻灯片
###

截止到现在(1432311622353)共收到342个赞同与感谢, 再次感谢大家的支持!如果你觉得我的分享对你有帮助,请关注我! 以后我会分享更多更优质的内容给大家.
说好的幻灯片在这里
(是之前在letv时一次内部分享的幻灯片,内容有删减(涉及到公司具体项目的部分),此幻灯片参考了很多其它的资料,内部的链接很值得大家打开看看 )
 AS其实就是Intellij IDEA的安卓开发环境特供版(谷歌定制版),Intellij IDEA是有收费版本的IDE。Ant和Maven都是基于XML的构建工具,Gradle是用Groovy编写的构建工具,Groovy是JVM衍生的与JAVA语法高度兼容的动态强类型语言。Gradle通过编写一个名为build.g… 显示全部
AS其实就是Intellij IDEA的安卓开发环境特供版(谷歌定制版),Intellij IDEA是有收费版本的IDE。
Ant和Maven都是基于XML的构建工具,Gradle是用Groovy编写的构建工具,Groovy是JVM衍生的与JAVA语法高度兼容的动态强类型语言。

Gradle通过编写一个名为build.gradle的脚本文件对项目进行设置,再根据这个脚本对项目进行构建(复杂的项目也有其他文件)
Gradle 脚本本质上就是Groovy脚本,只不过高度利用了groovy的语法糖,例如省略方法参数括号和省略句尾分号等,让代码看起来像DSL。
所以几乎所有java和groovy支持的语法,它的脚本都支持。(使用JAVA和GROOVY的SDK应该也是没问题的)

Gradle支持基于惯例的构建,并有丰富的适合不同情景下的插件库,光有官方用户手册支持的就有20多种,方便构建。

Gradle里有两个基本概念:项目(projects)和任务(tasks)。项目由多个任务组成,一个项目可以理解为提供给不同设备的构建版本,如桌面版、网页版、安卓版、iOS版等等,也可以理解为一种行为,例如部署应用到生产环境。任务相当于Ant的target,可以理解成一个构建中原子性的工作,例如编译、打包、执行等。需要注意的是,Ant中他自己的命令例如javac、copy等也叫做task,但Ant的task远没有Gradle的task那么自由。

Gradle的构建分两个阶段,第一阶段是设置阶段(configuration phase),分析构建脚本,处理依赖关系和执行顺序等,脚本本身也需要依赖来完成自身的分析。第二阶段是执行阶段(execution phase),此阶段真正构建项目并执行项目下的各个任务。

Ant与Maven对于Gradle,前者编写容易,但功能有限,需要人工操作的过程也多;后者依托于庞大的依赖仓库,因此有着强大的外部依赖管理,但添加本地依赖并不方便,且项目不能灵活修改。而Gradle能很好地结合Ant与Maven各自的优点,可以随意的编写任务并组合成项目,直接利用Maven仓库,并且能很好的支持传递依赖和内部依赖。(本部分为个人主观意见,可能与大多数人的意见并不相同)(其实也都是别人的个人主观意见,来源于我当初搜索的Gradle相关文章内容)

通俗一点类比成吃饭的话,大致就是:Ant是自己买菜洗菜烧水做饭,Maven是去饭店点餐,Gradle是3D打印食物。
gradle是一个工程构建工具,java代码,和资源文件需要经过sdk里的一些程序如aapt等处理,才能形成apk包。gradle就是把那些步骤变得简单化。相当于eclipse中的ant吧!
gradle是一个工程构建工具,java代码,和资源文件需要经过sdk里的一些程序如aapt等处理,才能形成apk包。gradle就是把那些步骤变得简单化。相当于eclipse中的ant吧!
一句话概括就是:依赖管理和任务执行。像Ruby里面的bundler+rake,像iOS中的cocoapods,像node中的npm+grunt.通俗的讲就是:你的项目需要哪些第三方库,它帮你把它们都下载下来,并且编译好放到指定的位置,你就直接可以import后用了。它本身是基于Apache的an… 显示全部
一句话概括就是:依赖管理和任务执行。

像Ruby里面的bundler+rake,
像iOS中的cocoapods,
像node中的npm+grunt.

通俗的讲就是:你的项目需要哪些第三方库,它帮你把它们都下载下来,并且编译好放到指定的位置,你就直接可以import后用了。

它本身是基于Apache的ant和maven的,但都不是特别好用,要引入一个库,还得写好多行的XML,麻烦死了。而且他们在任务执行上都比较弱,所以gradle就逐渐发展壮大了并被Google所推崇了。
编译源代码只是整个软件开发过程的一个方面,更重要的是,你要把你的软件发布到生产环境中来产生商业价值,所以,你要运行测试,构建分布、分析代码质量、甚至为不同目标环境提供不同版本,然后部署。整个过程可以分成以下几个步骤:编译源代码运行单元测试… 显示全部
编译源代码只是整个软件开发过程的一个方面,更重要的是,你要把你的软件发布到生产环境中来产生商业价值,所以,你要运行测试,构建分布、分析代码质量、甚至为不同目标环境提供不同版本,然后部署。

整个过程可以分成以下几个步骤:

  • 编译源代码
  • 运行单元测试和集成测试
  • 执行静态代码分析、生成分析报告
  • 创建发布版本
  • 部署到目标环境
  • 部署传递过程
  • 执行冒烟测试和自动功能测试
如果你手工去操作这些过程会很繁琐,效率低下,Gradle提供自动化的构建机制,上面的每个步骤都可以表示成Gradle里面的一个任务(Task),任务之间可以相互依赖,比如你定义任务A和任务B,
defaultTasks 'taskB'

task taskA << {
    println "i'm task A"
}

task taskB << {
    println "i'm task B, and I depend on " + taskA.name
}

taskB.dependsOn taskA

运行命令$ gradle -q之后(参数q让Gradle不要打印错误之外的日志),就能看到如下的预期输出:


i'm task A
i'm task B, and I depend on taskA

执行完之后Gradle会生成相应的报告,如果没有问题就可以发布到生产环境中。
Gradle脚本是基于Groovy领域特定语言,也就是说构建文件也是代码,Maven引入的XML配置文件可读性和可扩展性比较差,Gradle可以让你像写代码一样写出容易维护、可复用、可读性好、易于理解的构建代码。

Gradle同样引入了依赖管理、仓库和标准项目布局,Gradle引入的领域特定语言使得添加和删除依赖非常方便,你只需要在dependency块里面添加一行代码,注明要在哪个配置部分引入依赖,以及要引入哪个依赖,比如:
dependencies {
    compile('org.springframework:spring-core:2.5.6')//表示编译期依赖spring-core这个库

    testCompile('junit:junit:4.7')//表示测试代码的时候依赖junit这个库
}
传统的构建工具比如ant一开始并没有引入中央仓库的概念,他需要手动复制依赖的库文件到指定的目录,这使得这些JAR文件添加到版本控制系统当中,而Gradle会自动解析你的依赖配置,从中央仓库比如mavenCentral()中解析并下载依赖到你的本地仓库中,这些文件并不会添加到版本控制系统当中,Gradle也支持传递依赖,你也可以排错部分传递依赖或者干脆去掉传递依赖,还可以支持动态版本,只需要把最后一位数字改成+号。

Gradle支持多项目构建,当你的项目变得越来越庞大的时候,维护起来会比较困难,Gradle多项目构建使得你可以根据代码的功能把项目分成几个子项目,比如web项目开发中把项目分成逻辑、视图和控制三个模块,每个模块可以有各自的配置和依赖,也可以定义通用的配置。

当你需要为不同的环境打生成不同的发布时,以往可能是为每一个目标环境新建一个过程,有了gradle你不需要重复的工作,你会很容易生成不同的版本,你可以指定多个版本共同的构建逻辑,也可以给他们单独指定一些脚本。

总而言之,Gradle并没有引入太新鲜的东西,它是一个结合Ant和Maven理念的优秀实现,最重要的就是引入了Groovy语言,使得构建代码更加容易维护、可读性强、易于扩展,给了你充分的自由去自定义你的项目。
你都说了要通俗的理解,那就用不着学习什么理论了,通俗着来就是了。通俗的说:gradle是打包用的。你觉得解决你的问题了吗?如果没解决,那是你的问题提得不够好。比如我猜你应该提:为什么要打包发布,打包发布有几种常见方法,为什么这些常见方法中要选gr… 显示全部
你都说了要通俗的理解,那就用不着学习什么理论了,通俗着来就是了。

通俗的说:gradle是打包用的。

你觉得解决你的问题了吗?如果没解决,那是你的问题提得不够好。比如我猜你应该提:为什么要打包发布,打包发布有几种常见方法,为什么这些常见方法中要选gradle,等等。

针对我猜的这些内容,通俗的讲是这样的:

以在eclipse里面写java程序为例

为什么需要打包:
最初写完了,直接右键run就可以了。但是程序写完了毕竟是要发布到服务器上或者给别人用的,你第一不可能让所有要运行的人都装个eclipse,第二不可能把源代码公布给所有人。所以你需要把你的代码发布成二进制形式,让其它环境方便运行,这就是打包。

为什么用ant
打包的时候要做很多事,比如说配置文件中的用户名和密码,你本地开发和程序实际运行时的内容肯定不一致,所以需要有两个文件,开发的时候用一个,实际运行的时候用一个。这样每次打包的时候都要重复的做这些事,ant可以让你用xml的形式把这些事情写成脚本,然后自动运行。

为什么用maven
你的项目要用很多jar包,比如你写日志要用个log4j吧,连数据库要用个connector吧。这年头写程序不用个spring都不好意思出门,下载下来的spring包打开一看,密密麻麻的好几十个jar,不知道用哪个不用哪个。而且,即便是你一狠心把这些jar包都放进来,很大可能性还是不能运行,因为还要依赖其它的jar包。哪天想升级个spring小版本,所有jar包都要重来一遍,你也不记得哪些是由于spring引进来的jar包了。
所以有了maven,你只要配置一下说我要用spring 3,所有jar包都给你下载好了,你直接运行就行了。赶明儿想升级版本,直接把3改成4,新的jar包也给你下载好了。

然后?
用了maven,jar包是方便了,但我打包的时候还是有好多事要做啊,然后你会发现maven实在是不知道怎么做这些事,于是开始怀念ant。
gradle就是又能干maven的活,又能干ant的活,用groove语言写脚本,表达能力还更强。

就这意思。


===
我也是这两天才看了两眼gradle,了解不深。简化版如下:

ant可以自动化打包逻辑。
maven也可以自动化打包,相比于ant,它多做的事是帮你下载jar包。
但是maven的打包逻辑太死板,定制起来太麻烦,不如ant好用。gradle就是又能自动下jar包,又能自己写脚本,并且脚本写起来还比ant好用的这么个东西。

一句话,一个帮你把一连串的工作进行整合的工具。
gradle是一个依赖管理/自动化编译测试部署打包工具。依赖管理简单地说就是你只用写一行代码就可以自动帮你把jar/aar包下载下来并能被当前工程所使用。自动化构建就是gradle可以通过一些命令去执行一些特有任务比如编译测试打包等等。gradle相较ant,更加简… 显示全部
gradle是一个依赖管理/自动化编译测试部署打包工具。
依赖管理简单地说就是你只用写一行代码就可以自动帮你把jar/aar包下载下来并能被当前工程所使用。
自动化构建就是gradle可以通过一些命令去执行一些特有任务比如编译测试打包等等。
gradle相较ant,更加简单高效,并且能处理很多复杂的任务比如多渠道打包。
我这里分享一篇文章给你,你就知道gradle为什么那么有用处了,尤其是打包多渠道apk的时候。 http://blog.chengyunfeng.com/?p=833
我这里分享一篇文章给你,你就知道gradle为什么那么有用处了,尤其是打包多渠道apk的时候。
gradle+AS+NDK有无数的坑如果你使用NDK的话 建议用NDK就先暂时不要上AS
gradle+AS+NDK有无数的坑
如果你使用NDK的话 建议用NDK就先暂时不要上AS
先来个定义: Gradle是一个自动化编译工具。自动化编译工具有很多,例如Maven,Ant,Ivy。他们各有各的特点,而Gradle则是综合了他们的优点而诞生的编译工具。我不知道为什么Android放弃了自身的adt插件,进而选择gradle作为默认编译工具,但在这里,我简单说… 显示全部
先来个定义:
Gradle是一个自动化编译工具。
自动化编译工具有很多,例如Maven,Ant,Ivy。他们各有各的特点,而Gradle则是综合了他们的优点而诞生的编译工具。

我不知道为什么Android放弃了自身的adt插件,进而选择gradle作为默认编译工具,但在这里,我简单说一下,我对 Gradle 的一些看法:

1.Gradle 使用 Groovy 作为自己的默认开发语言:
    • Groovy是一种JVM动态语言,原生支持Java语法,这对于大部分Java开发人员来说是一个好消息,因为不需要太大的学习成本。
2.Gradle 支持 Maven 和 Ivy 的仓库
    • 如果没有三方代码仓库,那么我们在本地就会拥有一大堆的libs文件,同时还需要维护他们之间的引用关系,这只能用丧心病狂来形容
    • 所以Gradle中内置的Maven,Ivy仓库支持能够帮助我们维护仓库引用关系,从此代码库就干净了
3.Gradle 的plugin 功能
    • plugin插件我认为是gradle所有功能中最好的,他就像应用中的增强包一样,帮你完善编译过程。
    • 而且plugin插件也可以由自己进行开发定制,并发布到公开仓库供别人使用
    • 同时拥有了plugin之后,你也可以自己完成自己的程序编译工具。

然后我们再看看引入Gradle打包之后,AndroidStudio多了哪些功能:
  1. flavor 多渠道包编译
  2. databinding 数据绑定
  3. 编译task定义
  4. 通过dsl描述依赖和编译规则
其实并不是说google不能在自身的databinding框架中使用这些,而是既然已经有了一个gradle能够帮助他实现这些功能,他为什么还要费力不讨好的去做。
简单可以理解为自动化构建工具 ,项目编译,既打包〈包括多渠道打包〉,管理依赖,发布版本等,类似于maven,可书写方式更自由,脚本也更简单清晰 欢迎加入Gradle中文用户组,群号码:109752483
简单可以理解为自动化构建工具 ,项目编译,既打包〈包括多渠道打包〉,管理依赖,发布版本等,类似于maven,可书写方式更自由,脚本也更简单清晰

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gradle是个啥东东? 的相关文章

随机推荐

  • 数学建模之Python-随机森林算法

    理论 代码 coding utf 8 author Administrator step1 调用包 import pandas as pd from sklearn model selection import train test spl
  • Arduino UNO R3

    Arduino 常见型号 当然还有 LilyPad 附图 最常见的自然是UNO 最新版是第三版R3 国内也有一些改进的板子 我用的是一般的板子 拿到货也只能默默了 简介 The Uno is a microcontroller board
  • SyntaxError: unexpected EOF while parsing

    报错在eval 函数 正确代码段 with open COCO train json r as f data f readline data data strip split del data 0 del data 1 for i in d
  • 华为HCIA(五)

    Vlan id 在802 1Q中 高级ACL不能匹配用户名和源MAC 2 4G频段被分为14个交叠的 错列的20MHz信道 信道编码从1到14 邻近的信道之间存在一定的重叠范围 STA通过Probe获取SSID信息 Snmp报文 网络管理设
  • Java-1.1

    题目描述 编写程序 显示Welcome to Java Welcome to Computer Science Programming is fun 代码 public class PrintfMessage public static v
  • 首次访问(域名)过程

    1 解析出域名对应的ip地址 先知道默认的网关 使用arp协议获取默认网关的mac地址 组织数据发送给默认网关 ip还是dns服务器的ip但是mac地址是默认网关的mac地址 默认网关拥有转发数据的能力把数据转发给路由器 路由器根据自己的路
  • 网络编程之字节序

    字节序 计算机数据表示存在两种字节顺序 网络字节顺序NBO Network Byte Order 与主机字节顺序HBO Host Byte Order 或者是大端模式和小端模式 网络字节序 大端模式 网络字节顺序NBO 按从高到低的顺序存储
  • 普通人学Python有意义吗?

    普通人学Python有意义吗 Python作为一种跨平台的计算机程序设计语言 近些年来越来越受到企业和IT从业者的青睐 那么 普通人是否需要学习Python呢 学会Python有什么意义呢 今天小编就和大家聊一聊这个话题 Python有效提
  • 拿手机干什么

    前段时间在知乎网上收集了一下人们主要拿手机干什么 收到的反馈是 除了记事本 短信聊天 QQ聊天 回复邮件 发微博 回复帖子需要简短敲字外 大部分就是索取信息 看来无线移动上网 屏幕增大 键盘消失是需求大趋势 因为索取信息比提交数据要多 提交
  • wayland 之opengl es

    EGL 是 OpenGL ES 渲染 API 和本地窗口系统 native platform window system 之间的一个中间接口层 它主要由系统制造商实现 使用 EGL 绘图的基本步骤 Display EGLDisplay 是对
  • html里link使用方法,html的link标签怎么使用?

    html的link标签怎么使用 link标签是放在与之间的 把link放入这对符号中间 lt gt 写成这样 然后在link后面添加属性和属性对应的值 新手同学看到这里估计一头雾水 别担心 如乐老师举个例子你就懂了 比如 这段代码的作用是给
  • logback 不同类的日志打印在不同的文件中

    在Spring Boot中 您可以使用Logback为不同的类配置不同的日志文件 以下是一个基本的 logback xml 配置示例 展示了如何为两个类 com example Class1 和 com example Class2 配置不
  • MySql:局域网和权限用户管理

    MySql 5 6 XP 5 7 win7 添加用户和设置局域访问权限操作 请在 http sourceforge net 下载MySql Control Center 不是安装版本 use mysql select from user u
  • OPEN CV 环境配置 VS 2022(超详细+图解)

    先来说明一下写这篇博客的初衷吧 由于前段时间在和一位大佬的交流之中 他提出了一个建议 说叫我平时可以自己做一些嵌入式开发项目什么的 有极大的利处 我就跟着bi站的老师 华清创客学院 开始学习 但是老师的教程是用虚拟机创建一个linux系统
  • 人事管理系统 数据流图_大学毕业设计-宾馆管理系统

    目录 第一章 绪论 1 1 1概述 1 第二章 宾馆管理系统系统分析 1 2 1可行性分析 1 2 2 需求分析 2 第三章 系统概要设计 2 3 1 功能需求 2 3 2 主要功能 3 3 3 系统开发目的 3 3 4 运行环境 3 3
  • 异步日志的实现

    异步日志的实现 异步管理类 异步工厂类 登录校验 登录 异步管理类 采用单例模式的静态饥饿加载 利用空间换时间 提高效率 使用异步延迟任务线程池 通过其内直接创建饥一个static对象 形成饥饿加载 以达到记录日志时的单例模式 import
  • Android-Studio-常用配置和快捷键

    原文链接http www open open com lib view open1466732917214 html articleHeader1 http www jianshu com p bc8f6bfe12c6 以下直接在 Sett
  • VS版本、GCC版本与C++版本的对应关系

    做嵌入式开发经常遇到一些编译器和C 版本不匹配的问题 现整理如下 目前C语言的标准有 C89 ANSI C C90 C95 C99 ISO C C11 C1x 目前C 语言的标准有 C 98 C 03 对98小幅修改 C 11 全面进化 C
  • C语言与C++,C#究竟是什么关系?

    简单来说 C 就像是C语言的亲弟弟 而C 就是他们二者的远房亲戚 其实它更像是Java的表兄弟 小编c 学习群825414254获取c 一整套系统性的学习资料还有数十套pdf这三门语言都是十分优秀的编程语言 也都有很高的运行效率 这三种编程
  • Gradle是个啥东东?

    如何通俗地理解 Gradle 我以前一直用 Eclipse with ADT 来开发Android 项目 而且对它的基础的原理掌握不深 直接上手开发的 没有去考虑太多的东西 现在手头上有一个新的项目要使用到Android Studio 我早