Deep Dive into R8 Technology

happyer - Jun 11 - - Dev Community

1. Introduction to R8 Technology

In Android application development, as the functionality of the application increases, so does its size and complexity. This not only affects the download and installation speed of the application but can also put pressure on the user's device storage. To address these issues, Google introduced R8 (Runtime Reduction) technology, aimed at optimizing the application's code and resources to achieve a lightweight and efficient application.

R8 is a replacement for ProGuard; it is a code optimizer used to reduce the size of Android applications, decrease application startup time, and improve runtime performance. R8 achieves lightweight and efficient applications by analyzing the application's code, removing unused code, optimizing bytecode, compressing resource files, and more.

2. Core Features of R8

2.1. Code Shrinking

R8 reduces the size of the application's bytecode by removing unused code, inlining methods, optimizing loops, and more. This not only reduces the size of the application package but also improves the application's loading speed. R8's code shrinking features include:

  • Removing unused classes and members
  • Inlining short methods
  • Optimizing loops and conditional statements
  • Removing unused parameters

Code Example:

Assume there is an unused class UnusedClass, R8 will automatically detect and remove it during optimization.

// Unused class
public class UnusedClass {
    public void unusedMethod() {
        System.out.println("This method is never used.");
    }
}
Enter fullscreen mode Exit fullscreen mode

2.2. Resource Shrinking

In addition to code shrinking, R8 can also compress images, audio, and other resource files to further reduce the application's size. This is crucial for saving user device storage space and speeding up application startup. Resource shrinking features include:

  • Compressing PNG, JPEG, GIF images
  • Compressing WAV, MP3 audio files
  • Removing unused resource files and directories

Code Example:

Configure R8's resource shrinking options in the build.gradle file:

android {
    buildTypes {
        release {
            minifyEnabled true
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

            // Configure resource shrinking
            shrinkResources true
            zipAlignEnabled true
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

2.3. Code Obfuscation

R8 obfuscates class names, method names, and attribute names to enhance application security and make the decompiled code harder to understand.

Code Example:

Configure obfuscation rules in the proguard-rules.pro file:

# Obfuscate class names
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

# Obfuscate all class names, method names, and attribute names
-all-renames
Enter fullscreen mode Exit fullscreen mode

2.4. Optimizing Loops and Conditional Statements

R8 optimizes the structure of loops and conditional statements to reduce unnecessary branch judgments and loop iterations.

Code Example:

Assume there is a loop that can be optimized:

for (int i = 0; i < array.length; i++) {
    if (array[i] > threshold) {
        System.out.println("Element " + i + " is greater than threshold.");
    }
}
Enter fullscreen mode Exit fullscreen mode

R8 will automatically detect this pattern and attempt to optimize it into a more efficient loop structure.

2.5. Removing Unused Parameters

R8 can remove unused parameters from method signatures, thereby reducing the size of the bytecode.

Code Example:

Assume there is a method with an unused parameter:

public void printSum(int a, int b, int unusedParam) {
    int sum = a + b;
    System.out.println("Sum: " + sum);
}
Enter fullscreen mode Exit fullscreen mode

R8 will automatically remove the unused parameter unusedParam.

2.6. Supporting ProGuard Rules

R8 is fully compatible with ProGuard and can seamlessly replace ProGuard for code obfuscation and optimization.

Code Example:

Add ProGuard rules in the proguard-rules.pro file:

# Keep the name of a specific class
-keep public class com.example.MyClass {
    public void myMethod();
}
Enter fullscreen mode Exit fullscreen mode

2.7. Retaining Debug Information

R8 retains debug information during optimization, allowing developers to effectively debug the optimized code.

Code Example:

Configure the retention of debug information in the proguard-rules.pro file:

-keepattributes SourceFile,LineNumberTable
Enter fullscreen mode Exit fullscreen mode

3. Advantages of R8

3.1. Smaller Size

Applications optimized by R8 are usually smaller in size compared to those optimized by ProGuard, helping to save user device storage space. By removing unused code and resource files, R8 can significantly reduce the application's size, thereby improving download and installation speed. R8 technology helps reduce the size of Android applications through a series of optimization strategies, including:

3.1.1. Removing Unused Code

R8 can identify and remove unused classes, methods, attributes, and fields in the application. These unused codes are not executed during application runtime but increase the application's size. By removing this redundant code, R8 can effectively reduce the bytecode size of the application.

3.1.2. Optimizing Bytecode

R8 optimizes Kotlin and Java bytecode, such as inlining short methods, optimizing loops and conditional statements, and removing unnecessary temporary variables. These optimization measures can reduce the generated bytecode size, thereby reducing the application's size.

3.1.3. Compressing Resource Files

R8 can compress images, audio, and other binary resource files in the application. By using efficient compression algorithms, R8 can reduce the size of resource files without losing quality. Additionally, R8 can remove unused resource files, further reducing the application's size.

3.1.4. Obfuscating Class and Method Names

R8 replaces the application's class names, method names, and attribute names with shorter names to reduce the space they occupy in the bytecode. This obfuscation not only reduces the application's size but also enhances its security, as the decompiled code is harder to understand.

3.1.5. Optimizing Layout and Resource Definitions

R8 can optimize XML layout files by removing unused views and attributes, merging nested layouts, and optimizing resource definitions. These optimization measures can reduce the size of layout files, thereby reducing the application's size.

3.1.6. Supporting ProGuard Rules

R8 is compatible with ProGuard and can seamlessly replace ProGuard for code obfuscation and optimization. Developers can use existing ProGuard rules to further control the application's optimization level and size.

3.1.7. Generating APK and AAB Files

R8 supports generating APK (Android Package) and AAB (Android App Bundle) files. AAB files are a new distribution format that can dynamically download the required resources based on the user's device configuration, thereby reducing the download and installation size.

3.2. Faster Startup

By optimizing code and resource files, R8 can significantly improve the application's startup speed. Optimized code runs more efficiently, helping to reduce device power consumption and improve application responsiveness. This is crucial for enhancing the user experience. R8 technology helps improve the startup speed of Android applications in several ways:

3.2.1. Code Optimization

R8 optimizes the application's code to reduce the time required for startup. These optimization measures include:

  • Removing Unused Code: R8 can identify and remove unused classes, methods, and attributes in the application, reducing the actual loading and execution code volume.
  • Inlining Short Methods: For some short and frequently called methods, R8 will inline them at the call point to reduce the overhead of method calls.
  • Optimizing Loops and Conditional Statements: R8 optimizes the structure of loops and conditional statements to reduce unnecessary branch judgments and loop iterations.

3.2.2. Resource Compression

R8 compresses the application's resource files to reduce the application's size, thereby improving startup speed:

  • Compressing Images and Multimedia Files: R8 can compress PNG, JPEG, GIF images, and WAV, MP3 audio files, reducing their disk space usage and shortening application startup time.
  • Removing Unused Resources: R8 can identify and remove unused resource files and directories in the application, reducing the application's loading time.

3.2.3. Delayed Loading

R8 supports marking certain code and resources for delayed loading, meaning they will be loaded on-demand after the application starts, rather than being loaded all at once during startup. This can significantly reduce memory usage and CPU load during application startup, thereby improving startup speed.

3.2.4. Obfuscating and Optimizing Class Loading

While obfuscating code, R8 also optimizes the class loading order. By reorganizing the class loading order, R8 can reduce the number of class loads and dependency resolution time during application startup.

3.2.5. Reducing Reflection and Dynamic Calls

R8 optimizes code to reduce the use of reflection and dynamic calls. Reflection and dynamic calls are usually slower than direct calls because they need to resolve and find methods at runtime. By reducing these operations, R8 can improve the application's startup speed.

3.2.6. Generating More Efficient Bytecode

R8 generates more compact and efficient bytecode during compilation. This optimized bytecode requires less memory and executes faster, helping to improve the application's startup speed.

3.3. More Efficient Runtime

Optimized code by R8 runs more efficiently, helping to reduce device power consumption and improve application responsiveness. This is particularly important for mobile applications, as battery life and performance are key concerns for users.

3.4. Ease of Use

R8's configuration and usage are similar to ProGuard, making it easy for developers to get started. Additionally, R8 provides detailed documentation and examples to help developers better understand and use R8.

4. How to Use R8

R8 is integrated into the Android Gradle plugin and is enabled by default when building the release version. Here are some basic configuration steps:

4.1. Enabling R8

In the build.gradle file, ensure that minifyEnabled and shrinkResources are set to true:

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

4.2. Configuring ProGuard Rules

Although R8 is compatible with ProGuard rules, you may need to adjust them based on specific circumstances. Add custom rules in the proguard-rules.pro file. For example, to keep certain classes and methods:

-keep class com.example.myapp.MyClass {
    public *;
}
Enter fullscreen mode Exit fullscreen mode

4.3. Debugging and Optimization

After enabling R8, it is recommended to thoroughly test the application to ensure it still works correctly in the optimized version. You can generate an obfuscation mapping file to help with debugging if issues arise:

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // Generate obfuscation mapping file
            mappingFileUploadEnabled true
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

5. Conclusion

R8 is a powerful code shrinking and optimization tool that can significantly enhance the performance of Android applications and reduce their size. By properly configuring and using R8, developers can provide a better user experience without compromising application functionality.

6. Codia AI's products

Codia AI has rich experience in multimodal, image processing, development, and AI.
1.Codia AI Figma to code:HTML, CSS, React, Vue, iOS, Android, Flutter, Tailwind, Web, Native,...

Codia AI Figma to code

2.Codia AI DesignGen: Prompt to UI for Website, Landing Page, Blog

Codia AI DesignGen

3.Codia AI Design: Screenshot to Editable Figma Design

Codia AI Design

4.Codia AI VectorMagic: Image to Full-Color Vector/PNG to SVG

Codia AI VectorMagic

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .