Android Gradle 问题总结

作者: 温暖的外星 | 来源:发表于2018-08-08 16:01 被阅读13次

    Android D8 DEX 编译器

    Android Studio 3.1(++) 版本中,将 D8 作为新版本开发工具默认的 Dex 编译器。那么什么是 D8 呢,D8 与之前的 Dex 打包器有何区别呢?

    安卓项目在打包生成 Apk 安装文件的过程中,最重要的一步便是将我们所写的 java 代码编译过成 .class 字节文件再打包转化成一个或多个 .dex 格式的代码压缩文件。这种 dex 文件便是 Android 虚拟机所能识别、解析并运行的程序。

    Google 一直在致力于提升 Dex 文件的编译和运行优化工作,并开发出称之为下一代 dex 编译器:D8。其实早在 AS 3.0 Beta 版本中,Google 已经引入 D8 的测试使用。直到当前 3.1 新版本的发布,才正式将其作为默认 Dex 编译器。

    Android Studio 3.1 版本起 gradle 默认采用 D8 进行编译, AS 3.1之前版本可以采用 android.enableD8=true 来开启 D8 编译,如 3.1 版本或后续版本禁止 D8 编译,可以通过在 android.enableD8=false 来禁止 D8

    *Google 官网地址

    *R8


    Android enableAapt2

    上线前产品要求替换 启动页图片,这是甩过来一张 jpg 格式的图片,由于整个工程都是采用 png 格式,所以就在 AS 中动态的修改了图片的的后缀名称, 这时再去编译就会甩一个异常信息给你

    Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
    

    这是需要在 gradle.properties 文件中申明

    android.enableAapt2=false
    

    或者在 build.gradle 文件中 buildTypes 节点中添加

    aaptOptions.cruncherEnabled = false
    aaptOptions.useNewCruncher = false
    

    禁止 Gradle 检查 png 的合法性

    *stackoverflow stackoverflow


    android multi dex 64k

    随着产品的不断完善,代码量的不断增加,最后在打包时 android multi dex 64k 方法数限制就映入眼前了, 关于解决方法 网上有很多做法,这里列出 Google 官方对 64K 限制的解决方法

    *Google 官方对 dex 64k 介绍 {"自备梯子"}

    当然可以添加混淆来剔除无用的函数,也可以通过 dexOptions 来设置

    dexOptions {
                javaMaxHeapSize "2g"
    
                additionalParameters += '--multi-dex'
    
                additionalParameters += '--set-max-idx-number=62000'
    
                additionalParameters += '--minimal-main-dex'
            }
    

    // 方法超出后生成多个 dex 文件
    additionalParameters += '--multi-dex'
    // 改变 dex 方法数上限 这里设置 62000
    additionalParameters += '--set-max-idx-number=62000'
    // -main-dex-list指定的所有class会打包到主dex中

    {

    这里也可以通过 multidex-config 文件 keep 某一个类文件到主 dex 文件中
    
    如: multiDexKeepProguard file('multidex-config.txt')
    

    }

    additionalParameters += '--minimal-main-dex'

    这里可以采用 useDexArchive 来禁用增量dexing

    如:

    android.useDexArchive=false
    

    最后可以使用 FaceBook redex 来进行压缩, 关于 redex 优化 facebook 文档上有详细的介绍

    *FaceBook develop

    *Github 地址

    相关文章

      网友评论

        本文标题:Android Gradle 问题总结

        本文链接:https://www.haomeiwen.com/subject/parxbftx.html