为啥 proguard 处理 AndroidManifest.xml

Posted

技术标签:

【中文标题】为啥 proguard 处理 AndroidManifest.xml【英文标题】:Why proguard processes AndroidManifest.xml为什么 proguard 处理 AndroidManifest.xml 【发布时间】:2013-10-11 09:43:41 【问题描述】:

我看到一些无法解释的 Proguard 行为。

AFAIK proguard 不关注 android manifest。此外,在我的 proguard.cfg 中,我没有提到 BroadcastReceiver 相关的类。所以我认为应该去掉那些。

但是我在 bin/proguard.txt 中看到了一些奇怪的东西:

# view AndroidManifest.xml #generated:784
-keep class com.fiksu.asotracking.InstallTracking  <init>(...); 

并且该类(BroadcastReceiver 的后代)不会被剥离。理性对我没有任何意义:

[proguard] com.fiksu.asotracking.InstallTracking
[proguard]   is kept by a directive in the configuration.

如果清单中没有提到类,它会被剥离。

很高兴知道为什么。

【问题讨论】:

你检查过&lt;path-to-your-sdk&gt;/tools/proguard/proguard-android.txt。这通常包含阻止 Proguard 完全破坏您的应用程序的声明。 是的,据我了解,它不包含任何与 BroadcastReceivers 或清单相关的内容,或者我的解释有误。 sdk 定义通常包含如下内容:-keep public class * extends android.content.BroadcastReceiver,可防止接收器被破坏。 【参考方案1】:

构建过程运行工具aapt自动创建配置文件bin/proguard.txt,基于AndroidManifest.xml和其他xml文件。然后构建过程将配置文件传递给 ProGuard。所以ProGuard本身确实不考虑AndroidManifest.xml,但是aapt+ProGuard会考虑。

【讨论】:

谢谢,埃里克!这是否也意味着我们不再需要手动为广播接收器、服务等添加“保留”指令了? @Stipa 没错。 SDK 中的默认配置应提供所有通用设置,aapt 应创建所有应用程序特定配置(应用程序特定反射除外)。

以上是关于为啥 proguard 处理 AndroidManifest.xml的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用“minifyEnabled true”时 Proguard 不起作用?

为啥 Butterknife @Bind 在发布版本中失败(在 proguard 之后)

为啥我在使用 Proguard 时会从 Play Services lib 获得 ClassNotFoundException?

为啥我的 Xamarin.Android 项目不能在启用 Proguard 的情况下构建:“java.exe”退出代码 1

Missing &#39;name&#39; key attribute on element activity at AndroidMan

在处理 Proguard、MultiDex、测试和产品风味时,啥是好的策略?