Android Studio 与 Gradle
1. 描述
以前是用IntelliJ IDEA直接玩安卓程序的, 但是自从Google根据IDEA开发了新的ide后, 很多开发者都转向Android Studio了, 网络上的有些源代码无法直接在IDEA上编译, 于是下了个Android Studio折腾, 用过IntelliJ IDEA后安装、配置环境都很简单, 不太相同的地方是Google采用Gradle作为Android app开发的包管理器之后, 其自家推出的Android Studio自然得默认下载它, 于是在新建工程的最后一步, 提醒你可能需要配置一下代理才能使用成功的下载安装Gradle, 使用SS代理, 成功下载安装
2. 项目结构
新建空白项目的结构:
3. Gradle简介
Gradle是一种依赖管理工具, 基于Groovy语言, 面向Java应用为主, 它抛弃了基于XML的各种繁琐配置, 取而代之的是一种基于Groovy的内部领域特定(DSL)语言。其优点有很多:
像Ant一样,通用灵活的构建工具
可以切换的,基于约定的构建框架
强大的多工程构建支持
基于Apache Ivy的强大的依赖管理
支持maven, Ivy仓库
支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件。
对Ant的任务做了很好的集成
基于Groovy,build脚本使用Groovy编写
有广泛的领域模型支持构建缺点么, 我觉得就是又增加了入门者的学习成本
4. Gradle配置
新建空白工程的里根目录和app目录下各有一个build.gradle文件,文件内容分别是:
4.1 build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
4.2 app/build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "info.hypocrisy.test"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.0'
}
4.3 直观认识
在./build.gradle中的task clean中加入println 'test gradle.'
, 那么每次运行gradle时都会在Gradle Console里显示出test gradle, 当然, 显示的东西太多, 这一条不是很好找, 命令行下新建一个test.gradle文件:
task test {
println 'test gradle.'
}
之后gradle -b test.gradle -q test
即可在terminal中看到test gradle.
4.4 解释说明
从上述build.gradle文件可以很轻松的看出在android中使用gradle基本上就是各种配置选项, 对于不同目录下都可以建立build.gradle文件, 其作用域自然也就是当前目录, 比如./目录下的作用域就是整个project, 而./app目录下的作用范围就是app目录下的这些源文件。这样理解的话, 无论gradle怎么变, 都可以很轻松的快速掌握它, 与以前的android结构相比, 现在的gradle近似相当于其AndroidManifest.xml文件, 虽然现在此XML仍然存在。而gradle的功能更为强大, 至于其更多配置选项可以以后慢慢接触。
4.5 setting.gradle
在根目录下,还有一个setting.gradle文件。这个文件是全局的项目配置文件, 里面主要声明一些需要加入gradle的module(比如上述我们的app目录, 这个类似于java的结构com.xxx.xxx, 最终存放代码的部分都可以作为一个module, 而每个dot分隔开来的部分在android studio的结构里看就是一个目录), 这个Test程序的setting.gradle内容为: include ':app'
, 如果我们加入了一个新的module叫做gaea, 那么setting.gradle内容就变为: include ':app', ':gaea'
, 如果我们再加入了一个extra/hecate的module, 类似于extra.hecate, 那么setting.gradle内容就变为:include ':app', ':test', ':extra:hecate'
5. gradlew
了解了gradle的基本知识,以及android studio里一个project的配置信息,就很容易想到,如果我们从网上down了一份源码,别人虽然也是用gradle配置的,但是如果gradle版本不一样,那么由于其配置的一些语法不同,可能就无法正常编译打包了。我们注意到项目结构的根目录下有gradlew的文件,gradlew代表 gradle wrapper,相当于本地封装了gradle,在/gradle/wrapper/gralde-wrapper.properties
文件中声明了它指向的目录和版本。在Android Studio下的terminal下运行 gradlew -v
,若是第一次运行则显示Downloading如图:
下载的目录为C:\Users\[Username]\.gradle\wrapper\dists\gradle-2.4-all\3i2gobhdl0fm2tosnn15g540i0\
因为下载过程有点慢,也可以去https://services.gradle.org/distributions下载其他版本然后放到C:\Users\[Username]\.gradle\wrapper\dists
相应目录下解压即可。
下载成功后即可用grdlew wrapper的命令代替全局的gradle命令,再次运行gradlew -v
,结果如下:
再次执行gradlew build
可以编译并打包成apk文件,如果依赖不全会自动下载gradle的一些依赖,一般下载到C:\Users\[Username]\.gradle\caches\modules-2\files-2.1\
目录下。下载成功会出现:
Terminal上可以看出编译成功与否。编译成功后可以在Test\app\build\outputs\apk\
文件夹下找到apk文件,如下图:
最后可以运行gradlew clean
,其作用是清除/app目录下的build文件夹,依赖不全也会下载gradle的一些依赖。
以上在下载过程中可以看到https://jcenter.bintray.com/这个网址一直在出现,其实所有通过gradle导入的jar包都是从此网站的仓库上Downlad的。如果你需要的jar包在这个网站上没有,那就无法通过gradle的方式来导入。至于怎么确定是从这个网站Download,其实在根目录下的build.gradle中指定了:
allprojects {
repositories {
jcenter()
}
}
gradlew的其他用法和参数搭配可以通过gradlew -h
查看。
6. 其他建议
除了以上命令行的做法, 还可以在将工程导入Android Studio后, 查看每个Module下的 build.gradle 下的buildToolsVersion, 然后通过 SDK Manager 查看本地你安装的 SDK Build-tools, 如果相应版本没有安装先下载安装; 之后, 更新build.gradle和gralde-wrapper.properties相应的部分, 然后使用Android Studio的Make build或Run app即可
也可以不使用Android Studio调用安卓模拟器, 手动打开Android Emulator, 之后将app-debug.apk拷到android-sdk\platform-tools目录下, cmd下cd到该目录执行adb install app-debug.apk
即可将打包后的apk安装到正在运行的Emulator上了。顺便说下创建新的模拟器时勾选Use Host GPU效果应该会好点。