@Awille
2018-12-15T09:48:09.000000Z
字数 4377
阅读 91
Android note
由于task之间会互相依赖,为了简化构建过程,构建工具会生成一个动态的模型流,叫做Directed Acyclic Graph(DAG)。没有依赖的任务会被优先执行。
构建的三个阶段:
1. 初始化阶段:根据setting.gradle确定要被加载的模块,即创建项目实例,每个build.gradle对应一个项目实例。一般一个模块会有一个项目实例。
2. 配置阶段:每个项目实例会创建和配置task,构建DAG。
3. 执行阶段:按照DAG执行相应的task
Gradle 使用资源集(source set)的概念,一个资源集就是一组源文件,他们会被一起执行和编译。
该工具的作用就是自动帮我们针对项目安装对应版本的gradle,它只是单纯的包装了gradle,免去了我们手动安装正确版本的gradle的过程。
若将项目从as转到eclipse时,需要我们自己安装gradle,之后执行
gradle wrapper --gradle-version 2.4
来生成wrapper。
gradle wrapper 可以分为三部分
myapp/
├── gradlew //linux 跟mac的shell脚本
├── gradlew.bat //windows下的批处理脚本
└── gradle/wrapper/
├── gradle-wrapper.jar //上面两个脚本需要使用的jar
└── gradle-wrapper.properties //配置文件 决定gradle运行版本之类的
gradlew tasks
以上命令可以查看所有的task列表,加上--all参数可以查看每个task的具体介绍。
实际构建配置在buildscript当中, buildscript中的配置项我们可以理解为我们的gradle文件本身运行所需要的配置。
在模块的gradle当中,android是占比最大的代码块, 其中的defaultconfig代码块优先于mainifest文件中的配置,包括applicationID,versioncode,versionname等。
targetsdkversion:
API的全称是Application Programming Interface, 高api版本兼容低api版本,而低api版本不能兼容高api版本。
Android 7.0定义的手机系统的版本,该系统的版本对外开放的应用程序接口被定义为API 24,如果开发者想要在开发的APP中使用Android 7.0系统提供的功能,这些功能包括:多窗口支持、通知显示变更、JIT/AOT编译、快速的应用安装路径等等,那么新手在创建的Android项目的时候就需要选择API 24的应用程序接口。
跟版本系统与api等级对照表:
| platform version | API Level |
|---|---|
| Android 4.4-4.0 | 19 - 14 |
| Android 5.1-5.0 | 22-21 |
| Android 6.0 | 23 |
| Android 7.0 | 24 |
如果你的targetsdkversion事24, minsdkversion是11, 当你调用api14的方法是,编译器检测到你的程序可能要运行在api为11的版本上,那么编译器会提示你当前方法正常生效需要在api14以上的平台运行。这里的编译器版本是compilesdkversion来决定的。 所以在一般来说,在构建程序的时候,三根版本的选择一般是:
minsdkversion <= targetsdkversion <= compilesdkversion
AndroidManifest.xml中的packagename一个作为应用的唯一标志,这与applicationID相同,另一个是在R资源类中被用作包名。比如你构建付费版和免费版两个app,application ID不同,可以保证这两个安装到同一个手机之上,但是这两个app用的是同一个资源集,所以packagename作为R资源文件的包名可以完美的解决这个问题。
在底层,Android Studio同步实际上运行了generateDebugSources任务来生成所有必需的类。
2.3.2 BuildConfig和资源
自SDK工具版本升级到17之后,构建工具都会生成一个叫作BuildConfig的类,该类包含一个按照构建类型设置值的DEBUG常量。如果有一部分代码你只想在debugging时期运行,比如logging,那么DEBUG会非常有用。你可以通过Gradle来扩展该文件,这样在debug和release时,就可以拥有不同的常量。
这些常量可用于切换功能或设置服务器URL,例如:
android {
buildTypes {
debug {
buildConfigField "String", "API_URL",
"\"http://test.example.com/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
}
release {
buildConfigField "String", "API_URL",
"\"http://example.com/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "false"
}
}
}
上面的buildConfigField中的字段,在构建过程中会生成buildconfig的类。使用的时候可以采用BuildConfigField.xxx来进行使用。其中配置的时候,字符串必须要用专一双引号括起来。包括资源文件的配置,也可以采用类似于上面的方式,资源文件的标识符为resValue 如下:(buildconfigFied当中一般是自定义变量的配置)
debug {
resValue "string", "app_name", "Example DEBUG"
}
gardle允许在project对象上添加额外属性即自定义值, 不过要通过ext代码块,使用代码块当中的自定义值时,调用方法为:
ext {
compileSdkVersion = 22
buildToolsVersion = "22.0.1"
}
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
}
带cmd参数执行task:
gradlew printProperties -Pcmd="Hello from the command line"
在顶层的gradle当中,可以定义默认任务,
defaultTasks 'clean', 'assembleDebug'
在没有定义默认任务之前,系统的默认的任务为help任务,所以只是单纯执行gradlew不指定task的话,会执行help任务,如果做了上面代码的制定,gradlew就是直接执行clean跟assembleDebug任务。
gradle支持三种不同的依赖库:Maven,lvy和静态文件或文件夹。
一个依赖的组成:group:name:version, 例如com.google.code.gson:gson:2.3
其中name是唯一一定需要的字段,group和version可选,但是田间version可以确保你的版本不会自动更新。
自有maven仓库定义:
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
credentials { //添加凭证
username 'user'
password 'secretpassword'
}
}
}
自有lvy仓库定义:
repositories {
ivy {
url "http://repo.acmecorp.com/repo"
}
}
本地仓库:配置绝对url即可
repositories {
maven {
url "../repo"
}
}
添加jar文件为依赖:
dependencies {
compile files('libs/domoarigato.jar')
}
一次性添加整个文件夹下的jar文件:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
创建依赖项目的使用模块:使用该模块的时候,要使用android提供的library插件,帮助打包成aar文件,让aar文件可以被使用。
apply plugin: 'com.android.library'
当创建一个新的构建类型时,gradle会创建一个新的源集。源集目录名称和variant名称相同。但是该目录不会自动创建,所以在创建变体之前你要去手动创建该源集目录。
使用不同的源集的时候,资源会被一种的特殊的方式处理。 Drawables和layout文件将完全覆盖在main资源集中有相同名称的资源,但是values文件中的文件则不会被覆盖。
manifest文件与之类同。如果你为一个构建类型创建了一个manifest文件,那么你不必从main源集中拷贝整个manifest文件,只需添加需要的标签即可。Android插件将会合并manifest。
用来创建同一个app的不同版本,通过在android代码块当中添加productFlavors代码块来添加flavor版本。
android {
productFlavors {
red {
applicationId 'com.gradleforandroid.red'
versionCode 3
}
blue {
applicationId 'com.gradleforandroid.blue'
minSdkVersion 14
versionCode 4
}
}
}
由于productflavor与defaultconfig字段同级,所以所有的flavor版本配置属性是相同的。同样productflavor也是可以拥有自己的源集的,源集目录名为:flavor + vaiantname.
flavorDimension数组定义了维度,维度的顺序非常重要。当结合两个flavor时,它们可能定义了相同的属性或资源。在这种情况下,flavor维度数组的顺序就决定了哪个flavor配置将被覆盖。在上一个例子中,color维度覆盖了price维度。该顺序也决定了构建variant的名称。