ChenViVi / eden

使用 Github Issue 搭建博客 Web端
http://eden.valorachen.top/
28 stars 4 forks source link

记一些以前不知道的 Gradle 配置 #15

Open ChenViVi opened 6 years ago

ChenViVi commented 6 years ago

记一些以前不知道的 Gradle 配置

前言

关于 Gradle 的使用,最多的操作就是导库,顶多也就配置过自动签名,因为实战上没这个需求自己也不太主动学。我一向都是用什么学什么,只要我需要做一个东西,跨技术甚至跨领域都没关系。可能今天想做 Android 程序后天就觉得有个想法需要学建站技术才能实现,然后打游戏需要 记 BOSS 技能 CD 时间又做了个桌面定时软件,我甚至接触过编曲。但是如果我不需要做的功能,可能就瞟一眼完事,不会去深入理解,超懒

发现了个官方文档:https://google.github.io/android-gradle-dsl/current/index.html

另外,Gradle 编译默认不是多线程的

ABI 管理

我甚至都不知道这个东西的专有名词是叫 ABI

啥是 ABI

ABI 是 Application Binary Interface 的缩写

典型的 ABI 包含以下信息:

Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64

arm64-v8a ,x86_64 这两个 ABI 应用并不是必须要做支持,手机一般都会提供自动兼容,像微信就是一个 armeabi打天下

在 Gradle 中配置应用支持的 ABI

ndk {
    abiFilters "armeabi"
}

参考

https://developer.android.com/ndk/guides/abis?hl=zh-cn

https://blog.csdn.net/justFWD/article/details/49308199

Lint

啥是 Lint

Lint 在项目编译时会检查一些导致代码质量不佳的错误,比如 有个 layout 文件没有用到什么的

gradle 配置 Lint 提示

android {
    lintOptions {
        // true--关闭lint报告的分析进度
        quiet true
        // true--错误发生后停止gradle构建
        abortOnError false
        // true--只报告error
        ignoreWarnings true
        // true--忽略有错误的文件的全/绝对路径(默认是true)
        //absolutePaths true
        // true--检查所有问题点,包含其他默认关闭项
        checkAllWarnings true
        // true--所有warning当做error
        warningsAsErrors true
        // 关闭指定问题检查
        disable 'TypographyFractions','TypographyQuotes'
        // 打开指定问题检查
        enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
        // 仅检查指定问题
        check 'NewApi', 'InlinedApi'
        // true--error输出文件不包含源码行号
        noLines true
        // true--显示错误的所有发生位置,不截取
        showAll true
        // 回退lint设置(默认规则)
        lintConfig file("default-lint.xml")
        // true--生成txt格式报告(默认false)
        textReport true
        // 重定向输出;可以是文件或'stdout'
        textOutput 'stdout'
        // true--生成XML格式报告
        xmlReport false
        // 指定xml报告文档(默认lint-results.xml)
        xmlOutput file("lint-report.xml")
        // true--生成HTML报告(带问题解释,源码位置,等)
        htmlReport true
        // html报告可选路径(构建器默认是lint-results.html )
        htmlOutput file("lint-report.html")
        //  true--所有正式版构建执行规则生成崩溃的lint检查,如果有崩溃问题将停止构建
        checkReleaseBuilds true
        // 在发布版本编译时检查(即使不包含lint目标),指定问题的规则生成崩溃
        fatal 'NewApi', 'InlineApi'
        // 指定问题的规则生成错误
        error 'Wakelock', 'TextViewEdits'
        // 指定问题的规则生成警告
        warning 'ResourceAsColor'
        // 忽略指定问题的规则(同关闭检查)
        ignore 'TypographyQuotes'
    }
}

参考

https://developer.android.com/studio/write/lint?hl=zh-cn

https://blog.csdn.net/berber78/article/details/60766091

dex 编译

啥是 dex

搞不懂 dex,就反编译玩过。大概查了一下,dex 对于 Davlik虚拟机, 就像 exe 对于 Windows一样吧。也就是 dex 编译 必然是 Android 编译的一部分咯

Gradle 配置 dex 编译

android {
    dexOptions {
        //是否开启增量编译, 当dex 对应的文件有修改的时候才去编译dex优化编译效率,这个功能 android studio 默认是关闭的,如果开启multi dex 此句无效
        incremental false
        //是否预加载 dex 库依赖项以加快您的增量构建速度
        preDexLibraries = false
        //是否忽略方法数限制的检查
        jumboMode = false
        //进行 dex 编译的进程所使用的最大栈内存,太小可能导致OOM而无法通过编译
        javaMaxHeapSize "2048M"
    }
}

参考

https://stackoverflow.com/questions/28927255/how-can-i-use-android-dexoptions

https://www.cnblogs.com/zhaoyanjun/p/5736305.html

https://stackoverflow.com/questions/26779552/what-does-the-incremental-dex-option-in-android-studio-do

https://stackoverflow.com/questions/33750404/android-gradle-what-is-javamaxheapsize-4g

packagingOptions(打包选项)

packagingOption的选项

简单翻译一下官方文档就理解了

First-pick

First-pick 选项对应的文件会被打包到 apk 中,如果有多个对应文件,只有第一个会被打包,其他的会被忽略

packagingOptions {
    pickFirst "anyFileWillDo"
}

Merge

Merge 选项对应的文件会被合并到 apk 中。例如,当合并两个文件的时候,如果第一个文件的结尾不是换行符变会自动添加一个换行符,然后第二个文件的内容会被合并到第一个文件的末尾,这样就构成了合并后的文件

packagingOptions {
    merge "/LICENSE.txt" // Same as: merges += ["/LICENSE.txt"]
}

Exclude

Exclude 选项对应的文件不会被编译到 apk 中

packagingOptions {
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/NOTICE.txt'
 }

参考

https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html

productFlavors(打包特性)

用于多渠道打包

配置多渠道

在 Android Studio 3.0 中,需要加入 flavorDimensions

flavorDimensions "versionCode"

添加 demo 渠道

productFlavors {
    demo {}
}

打包命令

打包 demo 渠道的 apk

./gradlew assembleGoogleRelease

打包所有渠道的 apk

./gradlew assembleRelease

参考

https://juejin.im/entry/577383c66be3ff006adc92a3

https://blog.csdn.net/mynameishuangshuai/article/details/51783303

https://blog.csdn.net/SYIF88/article/details/75009663