【问题标题】:android.view.InflateException (Error inflating class) only on productionandroid.view.InflateException(错误膨胀类)仅在生产中
【发布时间】:2014-01-09 10:05:02
【问题描述】:

我的应用程序使用了一些第 3 方 CustomView,我没有将它正确地添加到项目中。 我所做的是,我将项目文件下载为 *.java 并将它们手动添加到包 com.blabla.utils.CustomView 下的项目中(这就是我在使用此类的 *.xml 文件中定义它的方式)。 当我在多个设备上调试/测试应用程序时(使用 USB 电缆,并将签名的 apk 发送给测试人员),一切似乎都很好。 但是当我将应用程序上传到生产环境时,我突然遇到了异常

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.*.*}: android.view.InflateException: Binary XML file line #55: Error inflating class com.*.*.CustomView

现在,我意识到我的问题是,我没有正确添加项目, 我需要将库作为现有项目添加到我的工作区中,并将该项目链接到我的主项目。 我将 *.xml 文件中的 com.blabla.utils.CustomView 更改为 com.theoriginaldeveloper.package。 它确实解决了上传新 APK 的问题。

但我的问题是,为什么我在调试应用程序时没有收到此消息? 我怎么能确定这样可以避免生产中的此类异常? 我在这里错过了什么?

(注意:我确实使用我在测试和使用 Eclipse 时使用的相同密钥库对 APK 进行了签名)。

谢谢。

【问题讨论】:

    标签: android exception crash production-environment production


    【解决方案1】:

    很可能,您的发布版本已经运行,并且混淆器会破坏类名,而调试版本没有被混淆。

    Android 应用通常使用 ProGuard 作为混淆器/优化器。

    为什么它使用原始类名是因为库项目有一个 proguard 配置文件,其中包含不混淆特定类的规则,因为它们需要从 XML 布局中动态引用。当您更改包名称时,混淆器规则与新的包名称不匹配。

    具体来说,在项目目录中查找proguard-project.txt,并在其中的规则中查找

    -keep public class foo.somepackage.SomeClassName
    

    并确保在您更改包或类名称时更新规则。

    【讨论】:

    • 据我了解,他还签署并导出了一个包,他将其安装为 3rd 方应用程序而没有问题。您认为应用程序在 Play 商店上发布时,ProGuard 混淆会受到影响吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多