假设在apk中我们在strings.xml中有1000个字符串。
因此,当我们在设备上运行此应用程序时,所有字符串始终在堆内存中可用。或者当我们调用Context的getString()
方法加载字符串时,它们会加载到内存中。
运行时是否所有字符串都在堆中?
答案 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的资源。该表稍后用于执行资源查找。
所以要回答你的问题,是的,所有字符串(实际上所有资源)都是从文件系统中解析出来的,并加载到本机堆中的查找表中。