최신 Android 버전은 처음 재부팅 할 때 어떤 종류의 앱 최적화를 수행합니까?


28

Nexus S의 Android Ice Cream Sandwich 4.0.4에 대한 공식 OTA Google 업데이트 인 Vodafone IT (전화 사업자)로부터 수신 한 후 업데이트 후 처음으로 자동 재부팅하면 시스템이 최적화되었다는 알림을 표시했습니다. 설치된 앱. 처음 재부팅 할 때 Android 4.0 이상이 어떤 종류의 최적화를 수행합니까?

답변:


40

grepCode 에서 PackageManagerService 클래스를 파고 (경고 :이 클래스 파일이 커서 브라우저가 렌더링 할 때 약간의 비트가 발생할 수 있음) 최적화 메시지가 다음 컨텍스트에 표시됩니다.

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"최적화 응용 프로그램"문자열입니다. layman의 용어로, 장치의 각 응용 프로그램을 반복하고 호출하여 화면의 메시지를 업데이트 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 (Just In Time) 컴파일러가 장치의 앱 성능을 개선하는 데 도움이되는 최적화 된 .dex 파일을 생성하여 VM 캐시로 출력하는 것으로 충분합니다. 캐시에 .dex 파일을 저장하는 이유는 그렇지 않으면 앱을 실행할 때마다 파일을 다시 추출 해야하기 때문입니다 (.apk는 아카이브 일 뿐이며 실행 파일이 아닙니다!). 따라서 /data/dalvik-cache다시 사용하기 위해 디렉토리에 보관하고 dexopt초기 추출 중에 일부 최적화를 수행하는 것이 좋습니다.


TL; DR (또는 프로그래머가 아닌 요약), Dalvik 캐시를 다시 작성하고 있습니다.


그것은 실제로 시스템이 설치된 모든 앱을 통과했을 때 본 메시지입니다. 큰 답변 주셔서 감사합니다.
Paolo Amoroso
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.