在Android中的堆内存中是否始终可以使用strings.xml的所有字符串?

时间:2016-10-25 07:10:16

标签: android string

假设在apk中我们在strings.xml中有1000个字符串。

因此,当我们在设备上运行此应用程序时,所有字符串始终在堆内存中可用。或者当我们调用Context的getString()方法加载字符串时,它们会加载到内存中。

运行时是否所有字符串都在堆中?

1 个答案:

答案 0 :(得分:7)

这是一个很好的问题。我们可以通过研究Android源代码来尝试找到答案。

getString()的所有来电都被转到android.content.res.AssetManager内的following method

/**
 * Retrieve the string value associated with a particular resource
 * identifier for the current configuration / skin.
 */
/*package*/ final CharSequence getResourceText(int ident) {
    synchronized (this) {
        TypedValue tmpValue = mValue;
        int block = loadResourceValue(ident, (short) 0, tmpValue, true);
        if (block >= 0) {
            if (tmpValue.type == TypedValue.TYPE_STRING) {
                return mStringBlocks[block].get(tmpValue.data);
            }
            return tmpValue.coerceToString();
        }
    }
    return null;
}

loadResourceValue是一个原生函数,可以在android_util_AssetManager.cpp

中找到

本机方法在类getResource() here内调用ResTable

ResTable的构造函数调用addInternal() here,它会读取应用中每个包ID的资源。该表稍后用于执行资源查找。

所以要回答你的问题,是的,所有字符串(实际上所有资源)都是从文件系统中解析出来的,并加载到本机堆中的查找表中。