Các phiên bản Android mới hơn được thực hiện trong lần khởi động lại đầu tiên là gì?


28

Tôi đã nhận được từ nhà cung cấp điện thoại của mình, Vodafone IT, bản cập nhật OTA chính thức của Google lên Android Ice Cream Sandwich 4.0.4 trên Nexus S. Khi tự động khởi động lại lần đầu tiên sau khi cập nhật, hệ thống hiển thị thông báo cho biết rằng nó đang tối ưu hóa cài đặt ứng dụng. Android 4.0+ thực hiện loại tối ưu hóa nào trong lần khởi động lại đầu tiên?

Câu trả lời:


40

Đi sâu vào lớp PackageManagerService trên grepCode (cảnh báo: tệp lớp này rất lớn, trình duyệt của bạn có thể tạo ra một chút công bằng khi hiển thị nó), thông báo tối ưu hóa được hiển thị trong ngữ cảnh sau:

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);
                }
            }
        }
    }
}


Ở đây giá trị của com.android.internal.R.string.android_upgrading_apklà chuỗi "Tối ưu hóa ứng dụng". Theo thuật ngữ của giáo dân, nó lặp qua từng ứng dụng trên thiết bị, cập nhật tin nhắn trên màn hình bằng cách gọi showBootMessage()và sau đó gọi performDexOptLI()trên ứng dụng. Vì vậy, một cách tự nhiên, câu hỏi tiếp theo là "Làm gì performDexOptLI()?" Vâng, đây là những gì trông giống như:

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;
}

Vì vậy, điều này gọi dexopttiện ích trên tất cả các ứng dụng cần nó. Thật khó để tìm thấy bất kỳ tài liệu đơn giản nào liên quan dexopt, nhưng có một cái nhìn tổng quan cấp cao ở đây . Có thể nói, nó đang được trình biên dịch Just In Time (JIT) sử dụng để tạo các tệp .dex được tối ưu hóa giúp cải thiện hiệu suất của các ứng dụng trên thiết bị của bạn và nó đưa chúng vào bộ đệm VM. Lý do nó lưu trữ các tệp .dex trong bộ đệm là vì nếu không, nó sẽ phải giải nén lại bất cứ khi nào bạn muốn chạy ứng dụng (.apk chỉ là một tệp lưu trữ, nó không phải là tệp thực thi!). Vì vậy, thật hợp lý khi chỉ giữ chúng trong /data/dalvik-cachethư mục để sử dụng lại chúng và dexoptthực hiện một số tối ưu hóa trong quá trình trích xuất ban đầu trong khi đó.


TL; DR (hoặc tóm tắt không phải lập trình viên, tôi đoán vậy): Nó đang xây dựng lại bộ đệm Dalvik.


Đó thực sự là thông điệp tôi thấy khi hệ thống đi qua tất cả các ứng dụng đã cài đặt. Cảm ơn câu trả lời tuyệt vời.
Paolo Amoroso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.