2017-03-16 61 views
4

我正在努力提高对使用ProGuard进行Android构建的理解。我不太确定究竟要保留什么(不混淆)以及混淆什么。ProGuard - 如何正确使用Android?要保留哪些类和库?

夫妇的库都在我的应用程序中使用,其中一些下面列出

com.android.support:appcompat 
com.android.support:design 
io.reactivex:rxandroid 
io.reactivex:rxjava 
com.jakewharton.rxbinding 
com.trello:rxlifecycle 

问题1:

我应该混淆上述图书馆?他们已经是开源..它会不会是明智的,让所有支持库使用ProGuard规则:

keep class android.support.** { *; }

类似的方式,我可以用io.reactivex和jakewharton库做

问题2

除了支持和外部库之外,我还有针对此应用程序编写的应用程序特定类。可以保留AndroidManifest.xml中提及的类名,特别是它们的公共成员,并让其余代码混淆。

让我知道如果我错过了某些东西或者我的理解不正确。只是重复一遍这不是一个问题,如何在技术上做到这一点,但更多的是在什么包括和什么排除混淆/优化/缩小..更具体的原因背后....肯定它会在咖啡测试之后建立。

回答

2

问题1:我应该混淆上面的库吗?

是的。如果您添加了-keep <library>规则,那么整个库将包含在您的APK中,这会使其膨胀并导致问题,例如使您的应用超出64k方法限制并需要Multidex。使用库提供的ProGuard规则总是一个好主意。您通常可以在库源代码或网站(如https://github.com/krschultz/android-proguard-snippets)中找到.pro文件。

问题2:可以保留AndroidManifest.xml中提到的类名,特别是它们的公共成员,并让其余代码混淆。

Android插件已经为你做了。该插件扫描所有需要保留名称的类(例如,Activities,Services,BroadcastReceivers,Views等),并且不会对其进行混淆。这包括您在AndroidManifest.xml中声明的所有内容。

+0

谢谢,我忽略了ProGuard的缩小选项..同意我们可以参考相关网站的相应ProGuard配置..但Google Specific Libraries如何.i.e。 com.android.support:appcompat在那里我们可以找到那些配置..关于你的答案为特定于应用的代码的问题2 ...你的意思是..我们不应该提供任何设置..对于我们自己的代码..?在这种情况下..在AndroidManifest中提到的应用程序特定的代码总是打开进行反编译..? – Girish

+0

某些库,即'com.android.support:appcompat',不需要显式规则就可以与ProGuard一起使用,因为Android Plugin指定的默认配置已经捕获所有边界案例(例如Views,Fragments),而其他库(如'rxjava')可能需要明确的规则。它因案例而异,最好的办法是查看每个库的文档以获取有关ProGuard规则的章节。 –

+0

关于“我们自己的代码”,Android插件中的默认配置已经指定了许多将应用于您的应用程序的规则。通过启用“缩小”,ProGuard将尽可能地进行混淆处理。但是你对AndroidManifest是正确的..某些类/方法/字段不能被有效地混淆(例如'Activity.onCreate(Bundle)'将永远被调用,因为它是在外部调用的),所以你所做的一个动作是移动尽可能多尽可能将你的活动/片段/视图中的代码编入单独的帮助对象,然后让ProGuard对它们进行模糊处理:) –

相关问题