Dalvikキャッシュを消去する必要があるのはなぜですか?


46

カスタムROMを更新するときは、常にDalvikキャッシュを消去する指示があります。これが必ずしも必要な理由はわかりません。

システムの起動中にlogcatを見ると、アプリが変更された場合、そのdexファイルが無効化されてから再生成されることがはっきりとわかります。それでも、私がどこでもこれについて言及するとき、私は沈黙に会います。一部のROM開発者でさえこれを認識しており、他の誰もが知っているのでこれをしているだけです。

質問:

  • 起動中にDalvikファイルが無効化されていないAndroidバージョンはありましたか?
  • システムに本来の動作を任せる代わりに、これを自分で行うことに利点はありますか?

理想的な答えには、関連するコードへの参照が含まれるので、次回の参照時に参照が必要になります。

回答:


43

質問に答えるには:

  • 起動時にDalvikが無効化されなかったAndroidバージョンを認識していません。たぶん、初期バージョン1.0には、Eclair、Froyo、Gingerbread、Ice Cream Sandwichを経たことがあります。ソースツリーを調べ、それをCupCakeまたはDonutにリベースする必要があります(それぞれ1.5および1.6)

  • 詳細な理由:)

ワイプキャッシュを使用する必要がある理由は、システムapkを含むすべてのapkにdexファイルが添付されているためです。ROMを初めて起動すると、AndroidのDalvikがそれらのapkを1つずつ調べて抽出します。そこからdexファイルを取得してキャッシュに/data/dalvik-cache配置することで、アプリ自体の実行を高速化します。

ほとんどのROMがあるのAPK持っODEX「編を、キャッシュは外部ファイルとしてAPK自体にバンドルされています。

多くのカスタムROMモデラーは、これらのapkをdeodex 'dします。つまり、dexファイルは、apkをテーマ化/変更しやすくするために置き換えられ、再パッケージ化されます。

カスタムROMをフラッシュし、キャッシュを消去しなかった場合、新しいカスタムROMのapkには異なるdexファイルが添付され、Dalvikがそれらを通過すると、ディレクトリにある既存のキャッシュされたdexファイルが表示されます。それをスキップし、アプリを実行すると、強制終了またはANR(アプリケーションが応答しません)が保証されます。

ClockWorkMod Recoveryを使用し、Wipe Dataが選択されている場合、データ自体は失われません。はい、アプリに関連するすべての設定がきれいに消去され/data/appます-を見てください。

したがって、キャッシュワイプすることはできますが、データをワイプすることはできません。効果的に行われることは、設定が保持されている新しいapkに挿入されます。これはCyanogenModナイトリーでは非常に一般的なシナリオで、不安定な/テスト用のROMビルドがフラッシュされ、キャッシュワイプで設定が保持されます。走行距離は、市場からダウンロードされたアプリによって異なります(設定はバージョンバンプによって変更される可能性が高い)。

最良の結果を得るためには、両方を実行するのが賢明だろうデータを消去し、キャッシュを拭き、アプリ自体の中で整合性なしプログラムエラーを確実にするために。

はい、起動時間は遅くなりますが、最初の1回オフの瞬間になります。その後、起動が速くなります。簡単に言えば、CWMを介してキャッシュ自体を明示的に消去することで、実際にキャッシュを高速化し、変更される可能性のある以前のバージョンの残留物がないことを確認できます新しいROMをフラッシュするときに、Androidが起動時にキャッシュ自体の無効化を実行しないのを見ました。)

ソースのルークを真剣に使用してください!:D

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java各apkランタイムの起動コードです。dalvikapk内のバイトコードをネイティブCPU命令セットに解釈する特定のチップセット命令を含むディレクトリツリーにあるネイティブCコードと対話します。ARMv6は、ハッキングされたARMv5(Eclair以前の古いAndroidバージョンの元のチップセットでした)のほとんどであるため、GoogleのAOSPソースにARMv6は表示されません。CyanogenModのソースにはそのARMv6が含まれます。


この議論のために、CM7の公式リリースについて話していると仮定しましょう。ダルビックのキャッシュを一度も消去したことはなく、そうすることで解決される問題を経験したことは一度もないということから始めましょう。これはodexされていないため、複数の(o)dexファイルが存在することはできないため、ブート時に古いファイルは新しく生成されたファイルに置き換えられます。ああ、それが本当に大したことなら、なぜ開発者はこれをアップデータースクリプトに追加しないのですか?ソースを確認します、ありがとう。
RR

1
実際に明示的にアップデータスクリプトに入れることはできますが、フラッシュするときに他の人を怒らせる可能性があります。「ああ、私は設定/データを失った」とCMはおそらく「 CMの新しいリリースをフラッシュするときにキャッシュを消去したのはなぜですか?」-たぶん、CMの責任に委ねられているので、そのオプションをエンドユーザーに与えましたか?そして、それを元に戻して、ワイプせずにフラッシュし、フォーラムで「私のアプリがクラッシュしている」と叫んだ場合、CMは振り向いて「ワイプしましたか?」と言うことができます。
t0mm13b

意味しなかったdata/dataけどdata\dalvik-cache。おそらくシステムのものだけ。
RR

1
ストックAOSP ROMはオデックス化されており、CMはdeodexを使用するようにビルドシステムを変更しました....ちょうど言う;)
t0mm13b

2
詳細な回答t0mm13bをありがとう。わかりました。投稿された質問に対する簡単な答えは、「あなたはしません。起動時にデフォルトで消去されます」ということです。正しい?
GollyJer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.