การเพิ่มประสิทธิภาพแอปประเภทใดที่ Android รุ่นใหม่กว่าทำในการรีบูตครั้งแรก


28

ฉันได้รับจากผู้ให้บริการโทรศัพท์ของฉัน Vodafone IT การอัปเดต OTA Google อย่างเป็นทางการเป็น Android Ice Cream Sandwich 4.0.4 ใน Nexus S ของฉันเมื่อรีบูตอัตโนมัติเป็นครั้งแรกหลังจากการอัปเดตระบบจะแสดงการแจ้งเตือนว่าเป็นการเพิ่มประสิทธิภาพ แอพที่ติดตั้ง การเพิ่มประสิทธิภาพแบบใดที่ Android 4.0+ ทำในการรีบูตครั้งแรก

คำตอบ:


40

เมื่อขุดเข้าไปในคลาส PackageManagerService บน grepCode (คำเตือน: ไฟล์คลาสนี้มีขนาดใหญ่เบราว์เซอร์ของคุณอาจจะใช้งานได้ดีเมื่อทำการแสดงผล) ข้อความการปรับให้เหมาะสมจะแสดงในบริบทต่อไปนี้:

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แต่มีภาพรวมระดับสูงที่นี่ พอจะพูดได้ว่ามันถูกใช้โดยคอมไพเลอร์ Just In Time (JIT) เพื่อสร้างไฟล์. dex ที่ได้รับการปรับปรุงซึ่งช่วยปรับปรุงประสิทธิภาพของแอพในอุปกรณ์ของคุณและมันจะส่งออกไปยังแคช VM เหตุผลที่เก็บไฟล์. dex ไว้ในแคชเป็นเพราะมิฉะนั้นจะต้องแตกไฟล์ใหม่ทุกครั้งที่คุณต้องการเรียกใช้แอพ (.apk เป็นเพียงไฟล์เก็บถาวรเท่านั้นไม่ใช่ไฟล์ที่เรียกใช้งานได้!) ดังนั้นจึงเหมาะสมที่จะเก็บไว้ใน/data/dalvik-cacheไดเรกทอรีเพื่อนำมาใช้ใหม่และdexoptดำเนินการปรับให้เหมาะสมบางอย่างในระหว่างการแยกเริ่มต้นในขณะที่อยู่ในนั้น


TL; DR (หรือบทสรุปที่ไม่ใช่โปรแกรมเมอร์, ฉันเดา): กำลังสร้างแคช Dalvik ขึ้นใหม่


นั่นคือข้อความที่ฉันเห็นเมื่อระบบผ่านแอพที่ติดตั้งทั้งหมด ขอบคุณสำหรับคำตอบที่ดี
เปาโล Amoroso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.