Bird
Raised Fist0
Android Kotlinmobile~5 mins

ProGuard and R8 optimization in Android Kotlin - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the main purpose of ProGuard in Android development?
ProGuard shrinks, optimizes, and obfuscates your app's code to reduce APK size and make reverse engineering harder.
Click to reveal answer
intermediate
How does R8 differ from ProGuard?
R8 combines shrinking, optimization, and obfuscation in one step and is the default code shrinker in Android Studio since version 3.4.
Click to reveal answer
beginner
What is a 'keep rule' in ProGuard or R8?
A keep rule tells the optimizer not to remove or rename certain classes or methods that are needed at runtime.
Click to reveal answer
beginner
Why is obfuscation important in Android apps?
Obfuscation renames classes and methods to unreadable names, making it harder for others to understand or copy your code.
Click to reveal answer
intermediate
When should you disable code shrinking in your Android app?
You might disable shrinking during debugging to speed up build times or if shrinking causes issues with reflection or libraries.
Click to reveal answer
Which tool is the default code shrinker in Android Studio since version 3.4?
AR8
BProGuard
CDexGuard
DLint
What does a 'keep rule' in ProGuard or R8 do?
APrevents removal or renaming of specified code
BCompresses images
CRemoves unused code
DGenerates logs
Which of the following is NOT a benefit of using ProGuard or R8?
AReducing APK size
BImproving app performance by optimizing code
CMaking reverse engineering harder
DAutomatically fixing runtime bugs
Why might you need to add keep rules when using R8?
ATo speed up compilation
BTo prevent removal of code used via reflection
CTo enable multi-threading
DTo increase APK size
What happens if you disable code shrinking in your Android app?
AObfuscation is improved
BApp runs faster
CApp size usually increases
DApp crashes immediately
Explain the roles of ProGuard and R8 in Android app optimization.
Think about how these tools help reduce app size and protect code.
You got /4 concepts.
    Describe why and when you would use keep rules in your Android project.
    Consider cases where code is used indirectly and must not be removed.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of enabling minifyEnabled true in your Android app's release build?
      easy
      A. To automatically generate UI layouts
      B. To increase the app's debug information for easier troubleshooting
      C. To disable ProGuard and R8 optimizations
      D. To shrink and optimize the app code by removing unused parts

      Solution

      1. Step 1: Understand the role of minifyEnabled

        Setting minifyEnabled true activates code shrinking and optimization tools like ProGuard and R8.
      2. Step 2: Identify the effect on app code

        These tools remove unused code and optimize the remaining code to reduce app size and improve performance.
      3. Final Answer:

        To shrink and optimize the app code by removing unused parts -> Option D
      4. Quick Check:

        minifyEnabled true = shrink and optimize [OK]
      Hint: minifyEnabled true means code shrinking is ON [OK]
      Common Mistakes:
      • Thinking it increases debug info instead of reducing code
      • Confusing minifyEnabled with disabling optimizations
      • Assuming it generates UI layouts automatically
      2. Which of the following is the correct way to specify a ProGuard rules file in your build.gradle for release builds?
      easy
      A. proguardFiles 'proguard-rules.txt'
      B. proguardFiles 'proguard-android-optimize.txt', getDefaultProguardFile('proguard-rules.pro')
      C. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
      D. minifyEnabled false

      Solution

      1. Step 1: Recall the standard syntax for ProGuard files

        The correct syntax uses getDefaultProguardFile for the default file and then adds custom rules.
      2. Step 2: Match the correct order and file names

        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' correctly calls getDefaultProguardFile('proguard-android-optimize.txt') and then adds 'proguard-rules.pro'.
      3. Final Answer:

        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' -> Option C
      4. Quick Check:

        Correct ProGuard file syntax = proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' [OK]
      Hint: Default file uses getDefaultProguardFile() [OK]
      Common Mistakes:
      • Swapping file names or forgetting getDefaultProguardFile()
      • Setting minifyEnabled false disables ProGuard
      • Using wrong file extensions like .txt instead of .pro
      3. Given this ProGuard rule:
      -keep class com.example.MyClass { *; }

      What will happen to MyClass during code shrinking?
      medium
      A. It will be kept intact with all its members
      B. It will be removed if unused
      C. Only its public methods will be kept
      D. It will be renamed but removed if unused

      Solution

      1. Step 1: Understand the -keep rule

        The -keep directive tells ProGuard to keep the specified class and its members without removing or renaming them.
      2. Step 2: Analyze the rule syntax

        The rule -keep class com.example.MyClass { *; } means keep the entire class and all its members intact.
      3. Final Answer:

        It will be kept intact with all its members -> Option A
      4. Quick Check:

        -keep class = keep all members [OK]
      Hint: -keep means keep class and members intact [OK]
      Common Mistakes:
      • Thinking -keep removes unused classes
      • Assuming only public methods are kept
      • Confusing renaming with removal
      4. You enabled minifyEnabled true but your app crashes at runtime due to missing classes. What is the most likely cause?
      medium
      A. You set minifyEnabled false by mistake
      B. You forgot to add -keep rules for classes used via reflection
      C. You used the wrong ProGuard file name in build.gradle
      D. You disabled R8 in your project

      Solution

      1. Step 1: Identify the cause of missing classes

        When code shrinking removes classes used only by reflection, runtime crashes occur.
      2. Step 2: Understand the role of -keep rules

        Adding -keep rules for such classes prevents their removal during shrinking.
      3. Final Answer:

        You forgot to add -keep rules for classes used via reflection -> Option B
      4. Quick Check:

        Missing classes after shrinking = missing -keep rules [OK]
      Hint: Add -keep rules for reflection-used classes [OK]
      Common Mistakes:
      • Assuming minifyEnabled false causes missing classes
      • Confusing file name errors with missing classes
      • Thinking disabling R8 causes missing classes
      5. You want to keep all classes in the package com.example.models but allow R8 to rename their members to reduce size. Which ProGuard rule should you use?
      hard
      A. -keepnames class com.example.models.**
      B. -keepclassmembers class com.example.models.** { *; }
      C. -keep class com.example.models.** { *; }
      D. -keepclassmembernames class com.example.models.** { *; }

      Solution

      1. Step 1: Understand the difference between -keep and -keepnames

        -keep prevents removal and renaming; -keepnames prevents renaming but allows removal.
      2. Step 2: Match the requirement

        You want to keep classes but allow member renaming, so -keepnames on classes is correct.
      3. Final Answer:

        -keepnames class com.example.models.** -> Option A
      4. Quick Check:

        Keep classes but rename members = -keepnames [OK]
      Hint: -keepnames keeps class names but allows member renaming [OK]
      Common Mistakes:
      • Using -keep which prevents renaming
      • Confusing -keepclassmembers with -keepnames
      • Assuming -keepclassmembernames keeps classes
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard