为啥 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.
如果清单中没有提到类,它会被剥离。
很高兴知道为什么。
【问题讨论】:
你检查过<path-to-your-sdk>/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 'name' key attribute on element activity at AndroidMan