Android、ProGuard 和 keepclasseswithmembernames

2023-11-27

Android 应用程序 ProGuard 配置中的一个常见模式是保留自定义View类,因为它们可能仅从布局 XML 而不是应用程序代码中引用。

因此,在创建项目时,ADT 会将这些规则添加到项目的 proguard.cfg 中:

-keepclasseswithmembernames class * {
   public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
   public <init>(android.content.Context, android.util.AttributeSet, int);
}

我想这里的想法是说,每当一个类定义一个可以由布局膨胀器调用的构造函数时,就保留它。然而,根据 ProGuard 文档,keepclasseswithmembernames限定符是简写keepclasseswithmembers and allowshrinking,如果我理解正确的话,这意味着:允许删除这些类,但如果保留它们,请不要混淆其成员名称(可能是为了不破坏 XML 属性名称和类设置器之间的绑定)。

但这是否意味着这些类仍将在收缩阶段被删除(allowshrinking = true),除非在代码中直接引用它们?事实上,这就是我们在应用程序中使用的自定义小部件所发生的情况,我可以通过将规则设置为来解决这个问题keepclasseswithmembers因为这将完全保留匹配的类(值得注意的是,这是官方的ProGuard Android 示例也是如此)。

我是否误读了 ProGuard 文档,或者这是 ADT 项目向导中的错误?


事实上,Android SDK(至少到版本 11)中的配置并不完全正确。

The 安卓配置ProGuard 文档中正确指定“-keepclasseswithmembers”,而不是“-keepclasseswithmembernames”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android、ProGuard 和 keepclasseswithmembernames 的相关文章

随机推荐

  • 触摸后关闭弹出窗口

    我在我的里面创建了一个弹出窗口MainViewController当使用某个按钮触摸时UIPopoverPresentationController并像 WWDC 2014 中所示那样设置它的委托 方法如下 MainViewControll
  • C 和 C++ 中带有 const 限定符的数组指针

    考虑以下程序 int main int array 9 const int p2 9 array 它在 C 中编译得很好 参见现场演示here 但在 C 中编译失败 默认情况下 GCC 会给出以下警告 参见现场演示here prog c I
  • Scala REPL:如何查找函数类型?

    在 Scala REPL 中可以找到值类型 scala gt val x 1 x Int 1 scala gt t x Int 然而 Scala REPL 不显示函数的类型信息 scala gt def inc x Int x 1 inc
  • SQLiteDatabase多线程锁定模式

    我使用此类来管理与底层 SQLiteDatabase 的连接 public class BasicDataSource protected DatabaseHandler dbHelper protected volatile SQLite
  • 使用 PyObjC 与 Mountain Lion 的通知中心合作

    我正在尝试从 python 脚本向 Mountain Lion 发送通知 并对通知的点击做出反应 发送通知现在可以完美地找到 但我无法让 Lion 在单击时回调我的脚本 这就是我所做的 我实现了一个通知类 该类实例的唯一目的是通过调用来提供
  • 在分段实时 MP4 流中发送定期元数据?

    正如主题所建议的 我想知道是否可以在分段 MP4 直播流中定期发送有关流内容的元数据 我使用以下命令 1 来获取碎片 MP4 ffmpeg i rtsp admin email protected c v copy an movflags
  • 在Python中播放WAV文件

    我尝试用 PyGame 来播放这样的 WAV 文件 import pygame pygame init pygame mixer music load mysound wav pygame mixer music play pygame e
  • 从头开始重写 iOS 应用程序“无法更改应用程序的可执行权限。”

    我在商店中有一个应用程序 我想开始 从头开始 重写整个应用程序 当我尝试在已包含旧应用程序的设备 iPhone 4 上构建并执行新应用程序时 我收到错误 无法更改应用程序的可执行权限 如果我在模拟器上运行新的可执行文件或删除设备上的当前应用
  • Android TableRow - 如何动态添加视图到某个位置?

    我正在动态构建 TableLayout 我需要 TableRow 在某些列位置有间隙 例如 我需要行在 3 和 5 位置上有 ImageView 下一行在 1 2 4 位置上有 ImageView 我尝试使用 TableRow row1 n
  • 通过 const 引用或通过值传递 int ,有什么区别吗? [复制]

    这个问题在这里已经有答案了 当我传递像这样的基元时int and double对于函数 通过 const 引用传递它们还是通过值传递它们更好 假设我不更改变量的值 int getValueFromArray int index return
  • 无法使用 RestSharp 发送 cookie

    我一直在尝试使用几种不同的方法在 Windows Phone 上访问基于 REST 的 API 但我似乎在使用所有这些方法将 cookie 附加到请求时遇到了问题 我已经尝试过WebClient方法 现在似乎已标记为 SecurityCri
  • 替换字符串中的 {x} 标记

    我们有一个模板 URL 例如 http api example com sale auth user xxxxx auth pass xxxxx networkid networkid category b2c country IT pag
  • 如果我不 join() python 线程会发生什么?

    我有一个疑问 我见过开发人员编写类似以下代码的示例 import threading def do something return true t threading Thread target do something t start t
  • 按创建日期对列表 进行排序 C#

    使用 MSDN 上的这个例子 using System Collections Generic using System IO namespace CollectionTest public class ListSort static vo
  • 在 Google Apps 脚本中调整图像大小

    我有一张图片 我想调整它的大小 应用程序脚本代码 var fileId idImage var img DriveApp getFileById fileId getBlob newFile getBody insertImage 0 im
  • localStorage 在 IOS-6 Safari 中无法访问

    我无法在 Safari 带有 IOS 6 的 iPad 中访问 localStorage 例如 以下代码在 Windows 的所有浏览器和 带有 iOS 5 的 iPad 上运行良好 但在 iOS 6 中则不然 localStorage s
  • 对球形体积内均匀分布的随机点进行采样

    我希望能够生成落在球形体积内的粒子位置的随机均匀样本 下图 由http nojhan free fr metah 显示了我正在寻找的内容 这是球体的切片 显示点的均匀分布 这就是我目前得到的 您可以看到 由于球坐标和笛卡尔坐标之间的转换 中
  • Java 与 Scala 泛型和装箱的互操作性问题

    假设我有这个 Scala 特征 trait UnitThingy def x Unit 提供 Java 实现非常简单 import scala runtime BoxedUnit public class JUnitThingy imple
  • 我怎样才能改变ios sdk?

    我想更改我的 iOS SDK 我有 ios 5 和 xcode 4 2 但由于我的应用程序 我必须将其降低到 iOS 4 2 SDK 在developer apple com 中 xcode 4 1 与iOS 5 一起使用 因此它不可用 如
  • Android、ProGuard 和 keepclasseswithmembernames

    Android 应用程序 ProGuard 配置中的一个常见模式是保留自定义View类 因为它们可能仅从布局 XML 而不是应用程序代码中引用 因此 在创建项目时 ADT 会将这些规则添加到项目的 proguard cfg 中 keepcl