其他分享
首页 > 其他分享> > Android高手笔记-D8, R8编译优化

Android高手笔记-D8, R8编译优化

作者:互联网

D8

开启D8的好处
  1. 编译更快、时间更短
  2. 编译时占用内存更小
  3. .dex文件更小
  4. .dex 文件拥有更好的运行时性能
  5. 支持在代码中使用 Java 8 语言
开启与关闭
android.enableD8=false //关闭D8恢复到DX-
android.enableD8.desugaring=false //恢复到以前的行为,让脱糖发生在Java编译之后,.class字节码仍遵循Java 7格式
执行增量构建
//执行几个类的增量构建,并启用按类 dexing 处理,并为增量构建指定输出目录
d8 MainActivity.class R.class --intermediate --file-per-class --output ~/build/intermediate/dex
d8 ~/build/intermediate/dex --release --main-dex-list ~/build/classes.txt --output ~/build/release/dex
支持Java8
  1. --lib:标记目标 Android SDK 中的 android.jar路径
  2. --classpath:标记项目的部分已编译的 Java 字节码,目前不打算将这部分字节码编译为 DEX 字节码,但在将其他类编译为 DEX 字节码时需要用到这些字节码。例如,如果代码使用默认和静态接口方法(一种 Java 8 语言功能),则需要使用此标记来指定您项目的所有 Java 字节码的路径,即使您不打算将所有 Java 字节码都编译为 DEX 字节码也是如此。这是因为 d8 需要根据这些信息来理解您项目的代码并解析对接口方法的调用
d8 MainActivity.class --intermediate --file-per-class --output ~/build/intermediate/dex
--lib android_sdk/platforms/api-level/android.jar
--classpath ~/build/javac/debug
Java8新特性:接口默认方法和静态方法

R8

开启R8的好处
  1. 代码缩减(摇树优化):使用静态代码分析来查找和删除无法访问的代码和未实例化的类型,对规避 64k 引用限制非常有用;
  2. 资源缩减:移除不使用的资源,包括应用库依赖项中不使用的资源。
  3. 混淆代码:缩短类和成员的名称,从而减小 DEX 文件的大小
  4. 优化代码:检查并重写代码,选择性内联,移除未使用的参数和类合并来优化代码大小
  5. 减少调试信息 : 规范化调试信息并压缩行号信息。
开启与关闭
  1. 开启代码缩减,需要在应用的主 build.gradle 文件中将 minifyEnable 属性设置为 true
  2. 开启资源缩减:需要在应用的主 build.gradle 文件中将 shrinkResources 属性设置为 true
  1. 创建新项目或模块时,IDE 会创建一个 /proguard-rules.pro 文件,以便您添加自己的规则。
android {
    ...
    buildTypes {
        release {
            shrinkResources true //启用 R8 的资源缩减功能
            minifyEnabled true //启用 R8 的代码缩减功能
             proguardFiles
                //1. Android Gradle 插件会生成 proguard-android-optimize.txt(其中包含了对大多数 Android 项目都有用的规则),并启用 @Keep* 注解。
                getDefaultProguardFile('proguard-android-optimize.txt'),
                //2. 使用 Android Studio 创建新模块时,Android Studio 会在该模块的根目录中创建 proguard-rules.pro 文件
                'proguard-rules.pro'

                //3. AAR 库:<library-dir>/proguard.txt, JAR 库:<library-dir>/META-INF/proguard/
                //由于 ProGuard 规则是累加的,因此 AAR 库依赖项包含的某些规则无法移除,并且可能会影响对应用其他部分的编译。
                //例如,如果某个库包含停用代码优化功能的规则,该规则会针对整个项目停用优化功能。

                //4. Android 资源打包工具 2 (AAPT2):
                //使用 minifyEnabled true 构建项目后,AAPT2 会根据对应用清单中的类、布局及其他应用资源的引用,生成保留规则。
                //文件路径为:<module-dir>/build/intermediates/proguard-rules/debug/aapt_rules.txt

                //5. 自定义配置文件:详见下面的添加其他配置
        }
    }
}
添加其他配置
android {
    ...
    buildTypes {
        release {
            ...
        }
    }
    flavorDimensions "version"
    productFlavors {
        flavor1 {
            ...
        }
        flavor2 {
            proguardFile 'flavor2-rules.pro'
        }
    }
}
关闭R8
android.enableR8=false
开启R8完全模式

可以在 gradle.properties 文件中另外设置以下内容:

android.enableR8.fullMode=true
自定义要保留的代码
1. 当应用通过 Java 原生接口 (JNI) 调用方法时
2. 当您的应用在运行时查询代码时(如使用反射)
- 反射 (Reflection) 会导致 R8 在跟踪代码时无法识别到代码的入口点
-keep public class MyClass
1. 在类上添加 @Keep 可按原样保留整个类
2. 在方法或字段上添加该注释,将使该方法/字段(及其名称)以及类名称保持不变。
3. 只有在使用 AndroidX 注解库且您添加 Android Gradle 插件随附的 ProGuard 规则文件时,此注解才可用。
// You can specify any path and filename.
-printconfiguration ~/tmp/full-r8-config.txt
自定义要保留的资源
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />
严格引用检查
val name = String.format("img_%1d", angle + 1)
val res = resources.getIdentifier(name, "drawable", packageName)
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict" />
移除未使用的备用资源
android {
    defaultConfig {
        ...
        resConfigs "en", "fr"
    }
}
合并重复资源

由于文章篇幅有限,文档资料内容较多,需要《2022最新Android面试真题+解析》、数据结构与算法面试题、Java 面试题、Android四大组件、Android 面试题、UI控件篇、网络通信篇、架构设计篇、性能优化篇、源码流程篇、 Kotlin方面、第三方框架、大厂面经,可以【点击这里免费获取】,希望能够共同进步,共同学习,共勉!

本文转自 https://juejin.cn/post/7052636587288428557,如有侵权,请联系删除。

标签:--,代码,R8,D8,Android,android,资源
来源: https://www.cnblogs.com/jiajia246/p/15843891.html