Android资源数量有哪些限制?

Android资源数量有哪些限制?

问题描述:

我们的应用程序中有一个有数千个小数据文件,我们目前将其打包为资产。如果我们可以将它们打包为原始资源,它将有助于我们的代码。我试图找出应用程序可以为每种类型提供的资源数量的限制,但是我没有找到任何关于此的文档。有谁知道Android资源数量有多少限制?Android资源数量有哪些限制?

经过大量实验后,您似乎可以为每种资源类型拥有多达16位的资源(65,536资源)。 (可能还有一些位保留给将来使用,这会减少最大资源数量,但我找不到这方面的任何证据。)如果有人能够提供权威答案,这将是一件好事,但一年后,放弃。

EDIT(请参阅comment below by @B T):根据另一个线程中的this answer by hackbod,似乎确实有16位可用,所以可以有多达65,535个任何类型的资源(不是65,536,因为零不是可用)。另请注意,此限制仅适用于单个配置的资源数量(区域设置,像素密度等)。不同配置的资源变体共享相同的资源ID并且不参与计数。因此,实际上您可以拥有任意类型(例如,布局或字符串)的65,535个资源,而不是任何一种配置。

+0

aapt对每个应用程序的每种资源类型施加了16位限制。 apklib资源添加到应用程序的资源声明总数中。 –

+0

@JamesWald - 谢谢。我认为它不能超过16位,但我不确定我们是否少了一点。你能指出任何文件吗? –

+2

我不得不挖掘aapt源代码,因为它没有记录。资源值的最重要的8位表示包ID。接下来最重要的8位表示资源类型。这留下了16位来寻址资源。请参阅https://android.googlesource.com/platform/frameworks/base.git/+/android-4.4_r1.1/tools/aapt/ResourceTable.h中的makeResId()。另外,https://android.googlesource.com/platform/frameworks/base.git/+/android-4.4_r1.1/tools/aapt/ResourceTable.cpp中的第3817行将包ID设置为127,给我们一个基础值为0x7f000000。 –

没有关于这方面的明确文件,我知道这两者中的任何一个,但是可以合理地假设Android开发者已经根据他们的建议适当地设计了Android。他们建议您将字符串和绘图放入资源中,以便为不同的区域设置,屏幕大小,屏幕密度和方向提供不同的字符串和绘图。这些可能性的绝对数量表明,他们希望应用程序包含数千种资源,并且您将提供几千个小型原始资源。

+0

这里的问题是,您不能将单个字符串的不同语言环境,屏幕大小等作为单独的资源进行计数。它们实际上重叠并使用相同的资源ID值。我所关心的非常简单:每种资源类型有多少位资源ID可用?许多位被保留来标识资源类型本身,所以它肯定不是32位。通过浏览一些R.java文件,似乎它对于任何一种资源类型都是至多16位。如果我们有那么多,我们可以解决,但更少,我们可能会遇到问题。 –

+0

这是一个很好的观点。也许最好的方法就是尝试。您可以编写一个快速应用程序来生成文件,可能是1.txt,2.txt,最多可配置的数字可能与文件内容的编号相同。然后执行相同的操作,生成一些简单的java来读取Android中的资源,如果失败,可能会抛出异常或其他东西。你甚至可以直接生成一个JUnit测试。 – kabuko

考虑到自动类R和在API中使用的资源值我会假设在Integer.MAX_INTEGER周围的字符串,可绘制和布局ID每个。

+0

没有办法是正确的。 R中的每个int值至少有一半保留给各种标志(对于资源类型,无论是系统还是用户标识,谁知道还有什么)。就像我在另一条评论中所说的那样,对人口稠密的R的偶然观察表明,至多有16位可用于区分任何一种类型的资源。 –