gradle
gradle为构建工具,Gradle 是新一代的自动化构建工具,它是一个独立的项目,跟 AS、Android无关
Gradle 采用的是一种叫做Groovy 的语言
如何把android开发和gradle结合?
插件:Gradle专门为android开发开发的插件:androidgradle plugin(比作adt)
插件再创建项目的时候,项目的根目录有个build.gradle 文件
classpath‘com.android.tools.build:gradle:2.1.2’
这个就是依赖 gradle 插件的代码,
后面的版本号代表的是 androidgradle plugin插件的版本,而不是 Gradle 的版本
as开发环境配置gradle插件,这样配置的什么版本的插件,就用对应的gradle版本构建项目
打开Android Studio内置的终端,在输入如下命令查看gradle版本:
gradlew -v
Gradle Wrapper
默认就会直接帮你安装 Gradle ,我们不需要额外的安装 Gradle 了,但是其实这个Gradle 不是真正的 Gradle ,他叫Gradle Wrapper ,意为 Gradle 的包装。
就是他在你每个项目都配置了一个指定版本的 Gradle ,你可以理解为每个 Android 项目本地都有一个小型的 Gradle ,通过这个每个项目你可以支持用不同的 Gradle 版本来构建项目。
Gradle Wrapper和build.gradle
gradlewrapper task利用gradle-wrapper.properties来下载指定的gradle(gradle版本)
build.gradle中classpath'com.android.tools.build:gradle:1.5.0'表示要使用这个android plugin的库这是android plugin是对gradle库的扩展(android插件版本,对gradle的扩充,扩充后能开发android)
模块内的build.gradle
apply plugin: 'com.android.application'
插件
该文件的第一行是Android应用插件,该插件我们在上一篇博客已经介绍过,其是google的Android开发团队编写的插件,能够提供所有关于Android应用和依赖库的构建,打包和测试。
compileSdkVersion22
buildToolsVersion
"22.0.1"
Android
该方法包含了所有的Android属性,
而唯一必须得属性为compileSdkVersion和buildToolsVersion:
compileSdkVersion:编译该app时候,你想使用到的api版本。
buildToolsVersion:构建工具的版本号。
构建工具包含了很多实用的命令行命令,例如aapt,zipalign,dx等,这些命令能够被用来产生多种多样的应用程序。你可以通过sdk manager来下载这些构建工具。
defaultConfig
方法包含了该app的核心属性,该属性会重写在AndroidManifest.xml中的对应属性。
defaultConfig {
applicationId"com.gradleforandroid.gettingstarted"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes
方法定义了如何构建不同版本的app,我们将在下一篇博客中有所介绍。
依赖管理
native包(so包)
用c或者c++写的library会被叫做so包,Android插件默认情况下支持native包,你需要把.so文件放在对应的文件夹中:
app ├── AndroidManifest.xml └── jniLibs ├── armeabi │ └── nativelib.so ├── armeabi-v7a │ └── nativelib.so ├── mips │ └── nativelib.so └── x86 └── nativelib.so
aar文件
如果你想分享一个library,该依赖包使用了Android api,或者包含了Android 资源文件,那么aar文件适合你。依赖库和应用工程是一样的,你可以使用相同的tasks来构建和测试你的依赖工程,当然他们也可以有不同的构建版本。应用工程和依赖工程的区别在于输出文件,应用工程会生成APK文件,并且其可以安装在Android设备上,而依赖工程会生成.aar文件。该文件可以被Android应用工程当做依赖来使用。
创建和使用依赖工程模块
不同的是,你需要加不同的插件:
apply plugin: 'com.android.library'
我们有两种方式去使用一个依赖工程。一个就是在你的工程里面,直接将其作为一个模块,另外一个就是创建一个aar文件,这样其他的应用也就可以复用了。
如果你把其作为模块,那你需要在settings.gradle文件中添加其为模块:
include':app', ':library'
在这里,我们就把它叫做library吧,如果你想使用该模块,你需要在你的依赖里面添加它,就像这样:
dependencies {
compile project(':library')
}
使用aar文件
如果你想复用你的library,那么你就可以创建一个aar文件,并将其作为你的工程依赖。当你构建你的library项目,aar文件将会在build/output/aar/下生成。把该文件作为你的依赖包,你需要创建一个文件夹来放置它,我们就叫它aars文件夹吧,然后把它拷贝到该文件夹里面,然后添加该文件夹作为依赖库:.
repositories {
flatDir {
dirs'aars'
}
}
这样你就可以把该文件夹下的所有aar文件作为依赖,同时你可以这么干:
dependencies {
compile(name:'libraryname', ext:'aar')
}
这个会告诉Gradle,在aars文件夹下,添加一个叫做libraryname的文件,且其后缀是aar的作为依赖。
配置
compile是默认的那个,其含义是包含所有的依赖包,即在APK里,compile的依赖会存在。
apk的意思是apk中存在,但是不会加入编译中,这个貌似用的比较少。
provided的意思是提供编译支持,但是不会写入apk。
testCompile和androidTestCompile会添加额外的library支持针对测试。
构建版本
在Gradle的Android插件中,一个构建版本意味着定义一个app或者依赖库如何被构建。每个构建版本都要特殊的一面,比如是否需要debug,application id是什么,是否不需要的资源被删除等等。你可以定义一个构建版本通过buildTypes方法。例如:
android {
buildTypes {
release {
minifyEnabledfalse
proguardFilesgetDefaultProguardFile
('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
这个文件定义了该模块是release版本,然后定义了proguard的位置。该release版本不是唯一的构建版本,默认情况下,还有个debug版本。Android studio把它视为默认构建版本。
创建自己的构建版本
当默认的构建版本不够用的时候,创建版本也是很容易的一件事,创建构建版本你只需要在buildTypes写入自己的版本。如下所示:
android {
buildTypes {
staging {
applicationIdSuffix".staging"
versionNameSuffix "-staging"
buildConfigField "String", "API_URL",
"\"http://staging.example.com/api\""
}
}
}
我们定义了一个staging版本,该版本定义了一个新的application id,这让其与debug和release版本的applicationID不同。假设你使用了默认的配置,那么applicationID将会是这样的:
1. Debug: com.package
2. Release: com.package
3. Staging: com.package.staging
这意味着你可以在你的设备上安装staging版本和release版本。staging版本也有自己的版本号。buildConfigField定义了一个新的URL地址。你不必事事都去创建,所以最可能的方式是去继承已有的版本。
android {
buildTypes {
staging.initWith(buildTypes.debug)
staging {
applicationIdSuffix ".staging"
versionNameSuffix "-staging"
debuggable = false
}
}
}
initWith()方法创建了一个新的版本的同时,复制所有存在的构建版本,类似继承。我们也可以复写该存在版本的所有属性。
Gradle for Android 第四篇( 构建变体 )
https://segmentfault.com/a/1190000004241503
https://segmentfault.com/a/1190000004260141
JUnit
JUnit测试界非常流行,其使得测试代码容易编写和维护,但是记住,JUnit只能测试逻辑代码,针对和Android SDK相关的代码其会报相应的错误。
Robolectric
Robolectric,其可以让你更方便的测试Android功能,并且还不用在设备或者模拟器上运行。
通过使用Robolectrie,你可以编写测试类,这些类可以使用Android SDK和资源文件,当然其还是跑在jvm上,这会让你测试app更加迅速。
Espresso
功能测试,其是用来测试一个app的多个模块是否能够正常工作。举个栗子,你可以创建一个功能测试来确保你点击某一按钮后是否会有一个新的activity。依然,我们会有很多框架。但是在这里,我推荐Espresso。