apkにstrings.xmlの1000個の文字列があるとします。strings.xmlのすべての文字列は、Androidのヒープメモリで常に使用できますか?
私たちがこのアプリケーションをその時点でデバイス上で実行すると、すべての文字列は常にヒープメモリで利用できます。または、文字列をロードするためにContextのメソッドgetString()
を呼び出すと、それらはメモリにロードされます。
実行時にすべての文字列がヒープに含まれていますか?
apkにstrings.xmlの1000個の文字列があるとします。strings.xmlのすべての文字列は、Androidのヒープメモリで常に使用できますか?
私たちがこのアプリケーションをその時点でデバイス上で実行すると、すべての文字列は常にヒープメモリで利用できます。または、文字列をロードするためにContextのメソッドgetString()
を呼び出すと、それらはメモリにロードされます。
実行時にすべての文字列がヒープに含まれていますか?
これは大きな質問です。 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
がネイティブ関数であり、クラスResTable
here内android_util_AssetManager.cpp
ネイティブメソッドの呼び出しgetResource()
で見つけることができます。
ResTable
のコンストラクタは、アプリ内の各パッケージIDのリソースを読み取るaddInternal()
hereを呼び出します。この表は後でリソースのルックアップを実行するために使用されます。
あなたの質問に答えるために、はい、すべての文字列(と実際にはすべてのリソース)がファイルシステムから解析され、ネイティブヒープ内のルックアップテーブルにロードされます。
アンドロイドコンパイルはRファイルを生成します。このファイルには文字列IDが含まれています。これらはすべてJava定数です。 AssetManagerとStringBlock souceコードが役に立つかもしれない – shuabing
[Androidでは、翻訳されない文字列に文字列リソースを使用する理由はありますか?](http://stackoverflow.com/questions/32587336/)文字列のためのリソースを使用する理由がありますか? –
http://stackoverflow.com/a/16433112/185022 –