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
540
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
250
Screenshot your Entire App with Screengrab and Firebase
scompt
0
510
Screenshot your Entire App
scompt
1
2k
Reactive In-App Billing on Android
scompt
2
350
Fitness Motion Recognition with Android Wear
scompt
1
510
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
What the customer really needed
kawaguti
PRO
3
200
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
220
range over func 2年間の軌跡 Issue #56413 はGoのエコシステムをどう変えたか
ryujicre8ive
0
190
現場で役立つ技術負債の効果的な返済方法
masuda220
PRO
9
4.3k
AI時代、データエンジニアが一番おもろい
genshun9
0
640
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
160
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
140
Claude Codeを「使うほど育つ」AI秘書にするノウハウ
minorun365
PRO
31
26k
2026-09-11 【Snowflake World Tour Tokyo 2026】Snowflakeを起点に、AI Agentが自律稼働し続ける未来へ / Driving AI Agents with Snowflake
civitaspo
0
660
登壇の自信を奪う3匹のオバケ / 3 Ghosts That Rob You of Your Confidence in Public Speaking
pauli
9
980
事業課題から技術的負債に向き合う
sansantech
PRO
2
1.9k
「守り」で活用するオンデバイスLLM 〜写ってはいけないを総力戦で防ぐ〜 / iOSDC Japan 2026
nakamuuu
0
170
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
New Earth Scene 8
popppiees
4
2.6k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
540
Statistics for Hackers
jakevdp
799
230k
Crafting Experiences
bethany
1
340
Skip the Path - Find Your Career Trail
mkilby
1
230
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
280
Product Roadmaps are Hard
iamctodd
55
13k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
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