【问题标题】:Android resources not found on some devices在某些设备上找不到 Android 资源
【发布时间】:2011-10-01 11:29:25
【问题描述】:

我们有一个应用程序(字符串数量适中),我们将其翻译成 27 多种语言。我们对应用程序进行了 2 次构建。这 2 个版本仅在包的名称上有所不同。所以基本上我们首先使用包名构建我们的应用程序,比如说com.android.sad.app,然后是另一个包名com.android.even.sadder.app。 我们有机会在各种 Android 设备上测试我们的应用程序,我们发现在一些设备上,如 Samsung ACESamsung Galaxy SLG Optimus 2x 我们的应用程序无法加载/读取资源,因此即使应用程序图标也未显示,并且当应用程序启动时它会因android.content.res.Resources.NotFoundException 而崩溃。在其他设备上一切正常。

我们发现,如果我们减少应用程序资源中的字符串总量,我们的应用程序可以在上述设备上成功运行。但是,我们认为这不是我们问题的真正解决方案,因为可以在相关设备上运行具有完整资源字符串的调试版本。

所以我的问题是有人知道什么可能导致这种非常奇怪的行为吗?

【问题讨论】:

    标签: android resources build device


    【解决方案1】:

    经过反复试验,我们发现问题出在 apk 包本身。在我们的构建过程中,我们会在构建完成后但在签署和对齐 apk 文件之前将一些 文件 添加到我们的应用程序 apk。最初,我们使用自己的工具(用 Java 编写,因此使用 Zip 的 Java 实现)提取和重新打包 apk

    我们注意到,在使用我们的工具重新打包 apk 后,我们能够将 apk 的大小减小到Android build 创建的原始 apk。 我们发现这个重新包装是我们问题的原因!

    正如我们的实验表明,如果重新打包的 apk 小于 ~1.6 Mb,则所有设备都可以读取并使用新打包的重新打包 em> apk。但是,如果 apk 的大小超过 ~1.6 Mb,则本文中提到的设备(和模拟器)无法正确读取或使用应用程序 apk

    我一直在寻找有关 apk 文件格式(本质上是 jar)的一些规范,但我没有发现任何可以解释这种非常奇怪的行为的东西。那么有人可以澄清为什么会发生这种奇怪的行为以及确切的原因是什么?

    注意:从现在开始,我们将使用 Android aapt 工具将我们的文件插入到包中,而不是我们一直使用的工具和所有设备都可以读取最终的 apk

    【讨论】:

      【解决方案2】:

      我会在这里做很多假设,但我会投入与字符串数量相关的资金。您的所有字符串都会消耗内存,并且这些目标设备可能没有足够的内存可供您的应用程序使用。至于您的包名称差异,当然较短的将比较长的消耗更少的字节。

      我建议您减少使用的字符串数量,看看是否能解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多