Android ProGuard

本文探讨了使用ProGuard工具优化Android应用程序APK的方法及其带来的优势与挑战。通过不同的配置级别对比,展示了如何平衡APK大小缩减与应用稳定性。

优化(Optimizing)应用程序APK通常是Android应用开发的最后一步。Google推荐使用ProGuard开源工具来优化APK。这篇文章我们将探索使用ProGuard的优势、问题以及给出一个优化你的APK的合适的配置文件。

优势
  减少Apk的大小
  提升Apk的性能
  混淆

缺陷
  潜在的错误配置
  需要更多的测试
  调试中堆栈跟踪难以阅读混淆后的方法名
  其实最大的缺陷是当ProGuard配置错误或许将直接导致你的App崩溃。

Android ProGuard配置
  有很多中方法来配置ProGuard的优化工具。Google在新创建的Android项目的根目录下也提供了一个默认的配置文件"proguard.cfg"。然而,由于引进了Fragment API 和 the onClick XML attribute,该配置文件已经过时了。由于该默认的配置文件重新命名public method names,一些Java反射(java reflection)或许不能工作,程序会抛出"method/class not found"异常。
  我们已经更新了配置,以适应新的Fragment类(和兼容版本),并测试了几种具有不同级别的优化配置。下面的表单将展示使用不同级别的优化配置优化某App的结果。

ConfigurationNotesAPK Size (kb)Size %
No OptimizationOriginal APK.323100%
SafestRemove no classes and only rename private methods.26682.4%
RecommendedRemove unused classes and only rename private methods.20563.5%
RiskyRemove unused classes and rename most public/protected methods.20362.8%

注意: Size 减少(reduction) % 变量依赖于你项目结构等因素
"Safest"配置将我们的Apk大小减少了大约17%,然而"Recommended"配置将Apk的大小减少了36%。"Risky"配置仅仅比"Recommended"配置减少了0.7%。因此,重命名public and protected methods 不能保证其风险,而且维护开销增大。

推荐配置(Recommended Configuration)

 1 -optimizationpasses 5
 2 -dontusemixedcaseclassnames
 3 -dontskipnonpubliclibraryclasses
 4 -dontpreverify
 5 -verbose
 6 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
 7 
 8 -keep public class * extends android.app.Activity
 9 -keep public class * extends android.app.Application
10 -keep public class * extends android.app.Service
11 -keep public class * extends android.content.BroadcastReceiver
12 -keep public class * extends android.content.ContentProvider
13 -keep public class * extends android.app.backup.BackupAgentHelper
14 -keep public class * extends android.preference.Preference
15 -keep public class com.android.vending.licensing.ILicensingService
16 
17 #keep all classes that might be used in XML layouts
18 -keep public class * extends android.view.View
19 -keep public class * extends android.app.Fragment
20 -keep public class * extends android.support.v4.Fragment
21 
22 #keep all public and protected methods that could be used by java reflection
23 -keepclassmembernames class * {
24      public protected <methods>;
25 }
26 
27 -keepclasseswithmembernames class * {
28      native <methods>;
29 }
30 
31 -keepclasseswithmembernames class * {
32      public <init>(android.content.Context, android.util.AttributeSet);
33 }
34 
35 -keepclasseswithmembernames class * {
36      public <init>(android.content.Context, android.util.AttributeSet, int);
37 }
38 
39 -keepclassmembers enum * {
40      public static **[] values();
41      public static ** valueOf(java.lang.String);
42 }
43 
44 -keep class * implements android.os.Parcelable {
45    public static final android.os.Parcelable$Creator *;
46 }
47 
48 -dontwarn **CompatHoneycomb
49 -dontwarn org.htmlcleaner.*

17-20行:我们需要keep可能在XML布局(layout)文件中使用到的class,这些类包括自定义的View和Fragment。
23-26行:我们需要keep public/protected方法,以避免在XML文件中指定的onClick方法抛错

外文连接:http://blog.androidquery.com/2011/06/android-optimization-with-proper.html

转载于:https://www.cnblogs.com/youngC/archive/2013/05/02/3054809.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值