2016-10-25 6 views
8

apkにstrings.xmlの1000個の文字列があるとします。strings.xmlのすべての文字列は、Androidのヒープメモリで常に使用できますか?

私たちがこのアプリケーションをその時点でデバイス上で実行すると、すべての文字列は常にヒープメモリで利用できます。または、文字列をロードするためにContextのメソッドgetString()を呼び出すと、それらはメモリにロードされます。

実行時にすべての文字列がヒープに含まれていますか?

+2

アンドロイドコンパイルはRファイルを生成します。このファイルには文字列IDが含まれています。これらはすべてJava定数です。 AssetManagerとStringBlock souceコードが役に立つかもしれない – shuabing

+0

[Androidでは、翻訳されない文字列に文字列リソースを使用する理由はありますか?](http://stackoverflow.com/questions/32587336/)文字列のためのリソースを使用する理由がありますか? –

+0

http://stackoverflow.com/a/16433112/185022 –

答えて

4

これは大きな質問です。 Androidのソースコードを勉強して答えを見つけることができます。 getString()

すべてのコールはandroid.content.res.AssetManagerfollowing 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がネイティブ関数であり、クラスResTablehereandroid_util_AssetManager.cpp

ネイティブメソッドの呼び出しgetResource()で見つけることができます。

ResTableのコンストラクタは、アプリ内の各パッケージIDのリソースを読み取るaddInternal()hereを呼び出します。この表は後でリソースのルックアップを実行するために使用されます。

あなたの質問に答えるために、はい、すべての文字列(と実際にはすべてのリソース)がファイルシステムから解析され、ネイティブヒープ内のルックアップテーブルにロードされます。

関連する問題