Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ProGuard
Search
Edward Dale
August 31, 2017
Technology
550
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ProGuard
An introduction to how ProGuard works.
Edward Dale
August 31, 2017
More Decks by Edward Dale
See All by Edward Dale
Write your own ProGuard
scompt
1
260
Screenshot your Entire App with Screengrab and Firebase
scompt
0
520
Screenshot your Entire App
scompt
1
2.1k
Reactive In-App Billing on Android
scompt
2
360
Fitness Motion Recognition with Android Wear
scompt
1
520
Android Apps with Mortar and Flow
scompt
7
1.7k
Functional Reactive Programming in the Mobile World
scompt
2
390
Other Decks in Technology
See All in Technology
IoTとは〜? 数字で見るSORACOM UG【SORACOM UG Explorer 2026】
soracom
PRO
0
180
AX時代の自治体支援リソース再配分と役割分担の再構成:戦略とロードマップ(概要)
sishi2026
0
200
AI AgentによるEmbedded SREの取り組み
tgidgd
1
340
SLOを阻む不安
sraku2159
0
220
AIで選択肢が広がった組織設計の理想と現実
konifar
16
7.7k
増え続けるプロダクトの品質をどう担保するか。ProductSpecとTypeScriptによる取り組み
joere
3
390
業務でAWSをあまり使っていない私が、AWSへのモチベを保つ方法
smt7174
0
150
Maestro MCPとClaude Code Skillsによる自律的なE2Eテスト支援
asmz
0
420
Flutter Widget Previewerで始めるUIプレビューとVRTの自動化
sakusaku3939
0
210
Active Directory と Entra ID のむむむな関係
murachiakira
PRO
3
1.5k
Claude Codeで作ったアプリを安全に公開する/Built with Claude Japan 2026
yoshidashingo
0
160
AIエージェント統制はAPIから——押さえるべき5つの要素
nagix
0
120
Featured
See All Featured
Ethics towards AI in product and experience design
skipperchong
2
460
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
970
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
920
How to Talk to Developers About Accessibility
jct
2
610
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
600
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
400
Balancing Empowerment & Direction
lara
6
1.4k
The browser strikes back
jonoalderson
0
1.9k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
550
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
60k
Transcript
ProGuard Edward Dale @scompt Freeletics https://www.freeletics.com August 31, 2017 ©
Edward Dale, 2017 1
Agenda • Overview • Steps • Problems • Future ©
Edward Dale, 2017 2
Purpose ProGuard is the most popular optimizer for Java bytecode.
It makes your Java and Android applications up to 90% smaller and up to 20% faster. ProGuard also provides minimal protection against reverse engineering by obfuscating the names of classes, fields and methods. — https://www.guardsquare.com/en/proguard © Edward Dale, 2017 3
Purpose ProGuard is the most popular optimizer for Java bytecode.
It makes your Java and Android applications up to 90% smaller and up to 20% faster. ProGuard also provides minimal protection against reverse engineering by obfuscating the names of classes, fields and methods. — https://www.guardsquare.com/en/proguard © Edward Dale, 2017 4
Highlights 1 • ProGuard is a command-line tool with an
optional graphical user interface. • ProGuard is easy to configure. A few intuitive command line options or a simple configuration file is all it takes. All available options are detailed in the user manual. 1 https://www.guardsquare.com/en/proguard © Edward Dale, 2017 5
Highlights 1 (continued) • ProGuard is fast. It processes small
Android applications and entire run-time libraries in seconds. • ProGuard is the default tool in development environments like Oracle’s Wireless Toolkit, NetBeans, EclipseME, Intel’s TXE SDK and Google’s Android SDK. 1 https://www.guardsquare.com/en/proguard © Edward Dale, 2017 6
Highlights (annotated) • ProGuard is easy to configure. A few
intuitive command line options or a simple configuration file is all it takes. All available options are detailed in the user manual. • ProGuard is fast. It processes small Android applications and entire run- time libraries in seconds. © Edward Dale, 2017 7
Steps start shrink end optimize obfuscate preverify © Edward Dale,
2017 8
Shrink Step • Enabled by default • Disabled with -dontshrink
• Removes all classes, methods, resources not reachable from from an entry point (seeds) • Dynamically referenced classes/methods need to be "kept" using -keep or -keepclasseswithmembers © Edward Dale, 2017 9
Example Class Diagram LoginActivity UserManager UserApi FeedActivity FeedApi OldUserManager OldUserApi
© Edward Dale, 2017 10
After Shrinking • No seeds LoginActivity UserManager UserApi FeedActivity FeedApi
OldUserManager OldUserApi © Edward Dale, 2017 11
After Shrinking • -keep MainActivity • -keep SecondActivity LoginActivity UserManager
UserApi FeedActivity FeedApi OldUserManager OldUserApi © Edward Dale, 2017 12
After Shrinking • -keep public class * extends android.app.Activity LoginActivity
UserManager UserApi FeedActivity FeedApi OldUserManager OldUserApi © Edward Dale, 2017 13
Keep Options -keep Specifies classes and class members (fields and
methods) to be preserved as entry points to your code. -keepclassmembers Specifies class members to be preserved, if their classes are preserved as well. -keepclasseswithmembers Specifies classes and class members to be preserved, on the condition that all of the specified class members are present. © Edward Dale, 2017 14
Optimize Step • Enabled by default • Disabled with -dontoptimize
• Performs lots of different bytecode-level optimizations to the code © Edward Dale, 2017 15
Optimize Step • -optimizationpasses declares how many times to optimize/shrink
• Freeletics does 5 passes © Edward Dale, 2017 16
Optimize Step • -optimizations can be used to disable specific
optimizations • Freeletics disables optimizations that cause problems on Android • More information in $ANDROID_HOME/tools/proguard/ proguard-android-optimize.txt © Edward Dale, 2017 17
Example Optimizations 2 • Marks methods as final, whenever possible.
• Removes unused method parameters. • Propagates the values of method parameters from method invocations to the invoked methods. • Propagates the values of method return values from methods to their invocations. • Inlines short methods. • Inlines methods that are only called once. 2 https://www.guardsquare.com/en/proguard/manual/optimizations © Edward Dale, 2017 18
Obfuscate Step • Enabled by default • Disabled with -dontobfuscate
• Classes and class members receive new short random names, except for the ones listed by the various -keep options • Internal attributes that are useful for debugging are removed © Edward Dale, 2017 19
After Obfuscation LoginActivity A B FeedActivity C OldUserManager OldUserApi ©
Edward Dale, 2017 20
Preverification Step • Enabled by default • Disabled with -dontpreverify
• When loading class files, the class loader performs some sophisticated verification of the byte code. • Unnecessary on Android © Edward Dale, 2017 21
Problems © Edward Dale, 2017 22
Problem 1 Class is unintentionally removed/obfuscated Symptom: Runtime crash java.lang.NoClassDefFoundError:
Failed resolution of: Lcom/freeletics/LoginActivity; © Edward Dale, 2017 23
Problem 1 Class is unintentionally removed/obfuscated Symptom: Runtime crash java.lang.NoClassDefFoundError:
Failed resolution of: Lcom/freeletics/LoginActivity; Solution: Ensure class is kept -keep com.freeletics.LoginActivity © Edward Dale, 2017 24
Problem 2 Code references a class not available Symptom:: Build
failure Warning: rx.internal.util.unsafe.ConcurrentCircularArrayQueue: can't find referenced class sun.misc.Unsafe ... Warning: there were 47 unresolved references to classes or interfaces. © Edward Dale, 2017 25
Problem 2 Code references a class not available Symptom:: Build
failure Warning: rx.internal.util.unsafe.ConcurrentCircularArrayQueue: can't find referenced class sun.misc.Unsafe ... Warning: there were 47 unresolved references to classes or interfaces. Solution: Don't warn about classes unavailable on Android -dontwarn sun.misc.Unsafe © Edward Dale, 2017 26
Problem 3 Adding a new library breaks build Symptom: Build
failure © Edward Dale, 2017 27
Problem 3 Adding a new library breaks build Symptom: Build
failure Solution: Google Should only happen with non-Android-specific libraries. Android-specific Libraries can add a ProGuard configuration that should be used. © Edward Dale, 2017 28
The Future we are also working on R8, which is
a Proguard replacement for whole program minification and optimization3 — James Lau, Product Manager 3 https://android-developers.googleblog.com/2017/08/next-generation-dex-compiler-now-in.html © Edward Dale, 2017 29
The Future • D8 is a dexer that converts java
byte code to dex code. • R8 is a java program shrinking and minification tool that converts java byte code to optimized dex code. • R8 is a Proguard replacement for whole-program optimization, shrinking and minification. R8 uses the Proguard keep rule format for specifying the entry points for an application. © Edward Dale, 2017 30
Questions? Edward Dale @scompt Freeletics https://www.freeletics.com © Edward Dale, 2017
31
Citations • http://knowyourmeme.com/memes/yao-ming-face-bitch- please © Edward Dale, 2017 32