AndroidStudio是谷歌官方的开发工具,在其基础上google实现了很多较为实用的插件。
工具虽然强大,但在实用时也需要借助于强大的互联网,需要从网络上下载大量的库和工程需要的构建工具。由于国内强大GFW导致很多国外的网站无法正常访问,更别谈下载了。所以导致很多参考工程,从github上下载下来用Studio打开时一直会卡在Background Tasks如下图所示:
新手在使用AndroidStudio时通常会遇到如下问题:
1. Android sutdio打开一个工程一直卡在Background Tasks怎么办?
2. 手动配置Gradle Home后,怎么还是提示错误?
3. 下载了Gradle,配置了gradle home,为什么打开工程显示还要在远程库下载?
为了能全面,彻底滴解决上述问题,先了解下gradle到底是什么?Studio中用她做了些什么?
Gradle是一种构建脚本,用Groovy语言实现,一种类似于java的语言。AndroidStudio使用Gradle作为构建工具,是构建工具就必须管理依赖库,当工程中使用了开源库时只需在build.gradle中告知gradle从哪个远程库下载就可以了。下面详细介绍AndroidStudio工程的settings.gradle、Project的build.gradle、Module的build.gradle、gradle/wrapper这些文件分别是用来干什么的。
include ':app'
位于工程的根目录,用于指示 Gradle 在构建应用时应将哪些模块包括在内
当然一个工程可以包含多个moudle,若还有一个lib moudle ,settings.gradle则如下:
include ':app', ':lib'
位于工程的跟目录,指定Gradle构建所引用的仓库和依赖的插件
/**
* buildscript 配置gradle的依赖,此处不能配置模块的依赖
**/
buildscript {
/**
* repositories 告知gradle从哪里下载自身的依赖库,
* 目前支持JCenter, Maven Central, and Ivy,也可以配置自己使用的依赖库
**/
repositories {
jcenter()
}
/**
* 配置gradle构建工程的依赖插件(Android Plugin for Gradle)的版本
**/
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.8.3'
}
}
/**
* 配置工程中所有模块的远程依赖仓库。若工程某个模块中不依赖这里定义的远程仓库,则需在模块的build.gradle中申明
**/
allprojects {
repositories {
jcenter()
}
}
模块级 build.gradle 文件位于每个 // 目录,用于配置适用于其所在模块的构建设置。您可以通过配置这些构建设置来提供自定义打包选项(例如附加构建类型和产品风味),以及替换 main/ 应用清单或顶级 build.gradle 文件中的设置。
/**
* 应用com.android.application 插件构建此模块
**/
apply plugin: 'com.android.application'
/**
*开始配置安卓特定的编译选项
*/
android {
/**
* compileSdkVersion 指定gradle构建时采用的API版本,应用可以在当前版本的系统或者比当前版本更低的系统中运行
* buildToolsVersion 指定编译工具的版本,可以通过SDK Manager下载相应的版本
*/
compileSdkVersion 25
buildToolsVersion "25.0.0"
/**
* defaultConfig 封装默认设置和编译变量,能根据编译系统动态得重写AndroidManifest.xml中的属性
*/
defaultConfig {
/**
* applicationId 应用的名字
* 但是代码中的包名仍然参考main/AndroidManifest.xml
*/
applicationId 'com.example.myapp'
// 定义运行的最小系统版本
minSdkVersion 15
// 执行运行的api版本,通常和compileSdkVersion一致
targetSdkVersion 25
// 定义应用的版本
versionCode 1
// 定义对用户的版本
versionName "1.0"
}
/**
* buildTypes 配置了许多的编译类型。默认情况下,定义了debug 和release两种。
* debug编译类型在编译系统中默认支持,不用配置。编译时采用debugging tools而签名采用debug key
* release 编译类型应用了混淆设置,但是在默认情况下没有签名。
*/
buildTypes {
/**
* 默认情况下,Android Studio 对release编译类型进行了配置,
* minifyEnabled减少应用的体积,并且指定了混淆设置文件
*/
release {
minifyEnabled true // Enables code shrinking for the release build type.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
/**
* productFlavors 字面翻译是产品口味,在多渠道打包用的比较多,或者是针对同一款应用不同的使用限制。
* 在productFlavors中可以重写defaultConfig中的配置。在默认情况下编译系统是没有创建productFlavors的。
* 这里示范创建了付费和免费两种产品特性,每种特性定义了不同的应用id,所以同一款手机可以同时安装者款应用
*/
productFlavors {
free {
applicationId 'com.example.myapp.free'
}
paid {
applicationId 'com.example.myapp.paid'
}
}
/**
* 拆分专用版本的apk,以减小应用的提交
* 比如:jni时分别拆分成arm版和x86版
* 或者根据屏幕密度拆分
*
*/
splits {
// Screen density split settings
density {
// Enable or disable the density split mechanism
enable false
// Exclude these densities from splits
exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
}
}
}
/**
* 本模块的依赖配置
*/
dependencies {
compile project(":lib")
compile 'com.android.support:appcompat-v7:25.1.0'
compile fileTree(dir: 'libs', include: ['*.jar'])
}
Gradle 还包括两个属性文件,位于项目根目录,可用于指定适用于 Gradle 构建工具包本身的设置:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
//你的工程所使用的gradle版本号
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
位于工程的gradle\wrapper目录,用于配置gradle,若IED将工程的gradle配置成Use default gradle wrapper 模式,当GRADE_HOME(默认为C:\Users\Administrator\.gradle\wrapper\dists)中没有工程指定的gradle版本,则主动从网上下载。
下载这部分的逻辑实现在gradle\wrapper\gradle-wrapper.jar中可以通过反编译查看其源码,GradleWrapperMain.java中先读取gradle-wrapper.properties配置的版本信息,若默认目录不存在对应的Gradle,则从配置的网站上下载gradle。
为构建系统配置本地环境属性,例如 SDK 安装路径。由于该文件的内容由 Android Studio 自动生成并且专用于本地开发者环境。
ndk.dir=D\:\\AndroidStudio\\ASSDK\\ndk-bundle
sdk.dir=D\:\\AndroidStudio\\ASSDK
Usage 1:
Usage2:
如上图所示:
Use default gradle wrapper(recommended): 是否让gradle-wrapper.jar根据gradle-wrapper.properties的定义去查找对应的gradle。优先本地查找,若本地不存在则再在gradle-wrapper.properties中定义的distributionUrl地址中下载。下载的Gradle会存放在
C:\Users\Administrator\.gradle\wrapper\dists
下载完成后会自动解压。
Use local gradle distribution:
选择之后,Gradle home才可以设置,作用为本工程指定本地存在的Gradle,为了减少麻烦,选择的版本一定要和gradle-wrapper.properties中定义的版本保持一致,否则会报莫名其妙的错;
Offline work:
跟下面的Service directory path 不存在关联。选择表示在Service directory path目录中已经下载好了各种依赖库,不用gradle再去下载。如果选择了,但是所在目录中却没有依赖库,则会提示如下错误:
Error:No cached version of com.google.guava:guava:18.0 available for offline mode.
"toggle.offline.mode">Disable Gradle 'offline mode' and sync project
如下图所示:
点击下 Disable Gradle offline mode and sync project ,Android Studio 会自动反选此项
有了上面的详细介绍,刚开始提的三个问题是不是很容易解答了呢?
问题1.
卡顿是由于要下载Gradle。按如下方式解决:
此选项勾选后,会从网络下载gradle,由于网络原因,可能会花费时间较长;
手动从网络上下载gradle/wrapper/gradle-wrapper.properties文件中定义的gradle版本,再将下载的压缩包拷贝过来。
再重新启动Studio,gradle解压后,会自动从远程依赖库中下载所需要的依赖库
那是因为选择了 Offline work 模式导致。gradle只是构建工具,若依赖的第三方库不存在则会提示出错。
不选择Offline work ,gradle构建工具会自动从远程依赖库中下载所需要的各种库。
问题3
第三方依赖的库就是通过gradle从远程依赖库中下载的,若下载库时间长,应该是本地网速不好导致。
显示类似上图的下载是很正常的,表示构建工具正在从远程依赖库中下载依赖文件!
Error:Failed to complete Gradle execution.
Cause:
文件名、目录名或卷标语法不正确。
Gradle 目录配置不正确导致