• android gradle项目剖析


    1 配置文件

    1.1 gradle属性文件

    1.1.1 gradle.properties

    对项目范围内的gradle进行配置,比如设置cache。

    1.1.2 local.properties

    设置sdk的路径。

    1.2 编译文件

    1.2.1 顶级编译文件

    build.gradle

    1.2.2 模块级编译文件

    build.gradle

    1.2.2.2 关于apply

    是为gradle指定一个plugin,如果是android项目,那么就是为gradle指定androud plugin,plugin:'com.android.application',gradle就知道这是一个android项目。

    还有一个gradle的plugin,android library plugin,plugin:'com.android.library'。

    1.2.2.3 关于android

    android相关的编译选项放在这里。

    1.2.2.4 关于task

    task是构建中的原子性操作,该task一旦触发就会被执行。

    可以在artifacts中触发task的执行。

    android相关的task?这个地方需要再补充一下。

    1.2.2.5 关于artifacts

    显式指定构建生成的目标文件。

    1.3 gradle设置文件

    settings.gradle,设置编译时应该包含的模块。

    可见,最重要的配置文件是编译文件。

    2 编译文件的语法

    2.1 buildscript

    buildscript代码块中声明的是gradle脚本自己需要的资源,可以声明的资源包括依赖项、第三方插件和maven库地址。

    buildscript中的dependencies的依赖用classpath,

    2.2 allprojects

    allprojects代码块中声明的是所有的projects的配置。比如repositories就是配置给所有的模块都可以使用的仓库。

    3 gradle的仓库

    gradle使用的是maven和ant的仓库,准确来说,主要使用的是maven的仓库。如果设置了多个库,gradle去查找依赖的时候,是按照配置的库的顺序依次查找的。

    一般有三个maven库jcenter(),mavenCentral()和google()。

    4 模块级编译文件中的依赖

    4.1 依赖项配置

    4.1.1 implementation

    可以在编译时隐藏自己的依赖。

    app依赖于libary1, library1依赖于library2,如果他们都用的是implementation的话,那么app中不能直接使用library2中的类,因为library1隐藏了自己的依赖library2,使得其对app不可见。这样,修改了library2,不会重新编译app。

    4.1.2 api

    编译时不能隐藏自己的依赖。

    4.1.3 compileOnly

    只编译时有效,不参与打包。比如com.android.support。

    4.1.4 runtimeOnly

    只生成apk时参与打包,不参与编译。

    4.2 依赖项类型

    4.2.1 本地库模块依赖项

    implementation project(':library')

    这个地方的project是settings.gradle中include的模块名。

    4.2.2 本地二进制文件依赖项

    implementation fileTree(dir:'libs', include:['*.jar','*.aar'])

    该模块的libs目录下的jar二进制文件和aar二进制文件。

    4.2.3 远程二进制文件依赖项

    implementation 'com.android.support:design:28.0.0'

    这是implementation group:'com.android.support', name:'design', version:'28.0.0'的缩写。

    5 android相关的编译选项

    5.1 compileSdkVersion

    指定android api level要小于或者等于该版本,这个指的是在编写代码时使用的android sdk的api,如果高于该设置,那么编译是通过不了的,这样就能够保证targetSdkVersion了。

    5.2 defaultConfig

    指定applicationId,versionCode和versionName,这些在app store中都是唯一的。

    还有minSdkVersion和targetSdkVersion。

    如果手机的sdk版本小于minSdkVersion的话,app是安装不上去的。因为,app中可能会使用高版本的新的api,这样导致app中的api在小版本的手机中没有,故跑不起来。

    maxSdkVersion不再检测。

    关于targetSdkVersion

    描述:目标SdkVersion

    作用:标识在指定的SdkVersion已做充分测试,Android系统不会针对此版本进行兼容处理

              如果targetSdkVersion=16的app跑在SdkVersion=16的手机上,则Android系统不会做任何兼容处理,从而提高了性能

              如果targetSdkVersion=16的app跑在SdkVersion=17的手机上,则Android系统需要做兼容处理以保障app仍然以16的特性运行

              如果targetSdkVersion=16的app跑在SdkVersion=15的手机上,可能会出现错误,所以至少要保证app在minSdkVersion的手机上测试通过

    定义位置:AndroidManifest.xml

    默认值:minSdkVersion

    检测时机:运行时

    app的向前兼容和向后兼容

    minSdkVersion保证了app的向前兼容,一些新的app可以跑在老的机器上;进行sdk版本判断,调用老的api即可。

    targetSdkVersion保证了app的向后兼容,一些老的app可以跑在新的机器上,它们的作用是不同的。

    使用模拟器来进行测试从而降低成本。

    5.3 buildTypes

    有两个build type,一个是debug,一个是release,比如在release中混淆方案。

    minifyEnabled,打开混淆;

    zipAlignEnabled,优化apk。

    5.4 dataBinding

    即数据绑定。

    6 关于gradle本身

    6.1 com.android.tools.build:gradle:3.4.2

    这个是用于编译android应用的gradle plugin。

    6.2 android studio的版本、gradle的版本和android plugin的版本适配

    一般已经弄好的项目的额gradle的版本集合android plugin的版本是适配的,可能和android studio的版本不适配。

    7 关于android studio

    下载android studio之后,需要下载anroid sdk和command line tools,这样就可以构建library和apk了。

  • 相关阅读:
    MutationObserver 简单应用场景
    call apply bind sleep
    js 继承,Object.setPrototypeOf | Object.getPrototypeOf | Object.create class
    JSON.stringify
    javascript 与node的 event-loop
    js 不常用面试题 数组对象深度取值
    Oracle单表备份
    mybatis批量写法
    mybatis批量更新
    Python中if __name__ == '__main__':理解
  • 原文地址:https://www.cnblogs.com/hustdc/p/11428803.html
Copyright © 2020-2023  润新知