新しいAndroidバージョンでは、最初の再起動時にどのようなアプリの最適化が行われますか?


28

Nexus SでAndroidアイスクリームサンドイッチ4.0.4への公式OTA Googleアップデートを携帯電話会社のVodafone ITから受け取りました。アップデート後に初めて自動的に再起動すると、システムはインストール済みアプリ。Android 4.0以降では、最初の再起動時にどのような最適化が行われますか?

回答:


40

grepCodePackageManagerServiceクラスを掘り下げます(警告:このクラスファイルは非常に大きいため、ブラウザがレンダリングするときにかなりの量を処理する場合があります)。最適化メッセージは次のコンテキストで表示されます。

public void performBootDexOpt() {
    ArrayList<PackageParser.Package> pkgs = null;
    synchronized (mPackages) {
        if (mDeferredDexOpt.size() > 0) {
            pkgs = new ArrayList<PackageParser.Package>(mDeferredDexOpt);
            mDeferredDexOpt.clear();
        }
    }
    if (pkgs != null) {
        for (int i=0; i<pkgs.size(); i++) {
            if (!isFirstBoot()) {
                try {
                    ActivityManagerNative.getDefault().showBootMessage(
                            mContext.getResources().getString(
                                    com.android.internal.R.string.android_upgrading_apk,
                                    i+1, pkgs.size()), true);
                } catch (RemoteException e) {
                }
            }
            PackageParser.Package p = pkgs.get(i);
            synchronized (mInstallLock) {
                if (!p.mDidDexOpt) {
                    performDexOptLI(p, false, false);
                }
            }
        }
    }
}


ここで、値はcom.android.internal.R.string.android_upgrading_apk「アプリケーションの最適化」という文字列です。素人の言葉では、デバイス上の各アプリケーションをループし、呼び出して画面上のメッセージを更新してから、アプリケーションをshowBootMessage()呼び出しperformDexOptLI()ます。当然のことながら、次の質問は「何をしperformDexOptLI()ますか?」です。さて、これは次のようなものです。

private int performDexOptLI(PackageParser.Package pkg, boolean forceDex, boolean defer) {
    boolean performed = false;
    if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0) {
        String path = pkg.mScanPath;
        int ret = 0;
        try {
            if (forceDex || dalvik.system.DexFile.isDexOptNeeded(path)) {
                if (!forceDex && defer) {
                    mDeferredDexOpt.add(pkg);
                    return DEX_OPT_DEFERRED;
                } else {
                    Log.i(TAG, "Running dexopt on: " + pkg.applicationInfo.packageName);
                    ret = mInstaller.dexopt(path, pkg.applicationInfo.uid,
                            !isForwardLocked(pkg));
                    pkg.mDidDexOpt = true;
                    performed = true;
                }
            }
        } catch (...) {
           //I've trimmed out a bunch of exception handling here, it basically just writes to
           //the log and sets the return value
        }
    }

    return performed ? DEX_OPT_PERFORMED : DEX_OPT_SKIPPED;
}

したがって、これは、dexoptそれを必要とするすべてのアプリケーションでユーティリティを呼び出します。に関する簡単なドキュメントを見つけることは困難ですがdexoptここでは概要を説明しています。それは、ジャストインタイム(JIT)コンパイラーによって使用されて、デバイス上のアプリのパフォーマンスを向上させる最適化された.dexファイルを作成し、VMキャッシュに出力するということだけです。.dexファイルをキャッシュに保存する理由は、そうしないとアプリを実行するたびに再抽出する必要があるためです(.apkは単なるアーカイブであり、実行可能ファイルではありません!)。したがって、それら/data/dalvik-cacheを再利用するためにディレクトリに保持することは理にかなってdexoptおり、最初の抽出中にいくつかの最適化を実行します。


TL; DR(または非プログラマーの要約、私は推測する):Dalvikキャッシュを再構築しています。


それは実際、システムがインストールされたすべてのアプリを通過したときに私が見たメッセージです。すばらしい回答をありがとう。
パオロアモロソ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.