Чому мені потрібно стерти кеш Dalvik?


46

Коли я оновлюю користувальницький ROM, завжди є інструкція протирати кеш Dalvik . Я не бачу причини, чому це обов'язково.

Переглядаючи logcat під час завантаження системи, я чітко бачу, що якщо додаток зміниться, його dexфайл буде недійсним та регенеровано. Та все ж, коли я згадую про це де завгодно, я зустрічаюся з тишею. Як ніби навіть деякі розробники ПЗУ про це не знають, і роблять це лише тому, що це роблять усі інші.

Отже, питання:

  • Чи була версія Android, де файли Dalvik не були визнані недійсними під час завантаження?
  • Чи є якась перевага робити це самостійно, замість того, щоб дозволити системі виконувати роботу, яку вона повинна робити?

Ідеальна відповідь включала б посилання на відповідний код, тому я мав би посилання наступного разу, коли це з’явиться.

Відповіді:


43

Щоб відповісти на ваші запитання:

  • Я не знаю жодної версії Android, де Dalvik не був визнаний недійсним під час завантаження. Можливо, в початковій версії 1.0 було те, що я справді не знаю, пройшли Eclair, Froyo, Gingerbread, Sandwich Ice Cream. Вам потрібно заглянути в початкове дерево і відновити його назад до CupCake або Donut (1,5 і 1,6 відповідно)

  • Детальна причина :)

Причина, яку повинен використовувати кеш Wipe, полягає в тому, що всі apks, включаючи системні apks, мають до нього доданий файл dex , коли ROM вперше завантажується, Далвік Android проходить кожну з цих програм і витягує файл dex з нього і помістити його в кеш, /data/dalvik-cacheтим самим прискоривши виконання самого додатка.

Більшість ПЗУ мають apks, які є odex 'ed, кеш вбудовується у сам apk як зовнішній файл.

Багато модних мод- дисків мали б ті apks deodex 'd, тобто файл dex замінюється та перепаковується, щоб полегшити тематизацію / зміну apk.

Коли ви прошиваєте користувальницький ROM та не стираєте кеш, нові нові користувацькі apk- файли будуть додані до нього інший файл dex , і коли Dalvik проходить через них, він бачить наявний кешований файл dex, знайдений у каталозі, і пропускає його, тоді, коли ви запускаєте додаток, ви гарантовано будете закрити або ANR (додаток не відповідає).

Ви самі не втрачаєте дані, якщо використовується ClockWorkMod Recovery і вибрано Wipe Data , то так, всі налаштування, що стосуються програм, видаляються чисто - загляньте /data/app.

Таким чином, ви можете протерти кеш, але не витерти дані , що зроблено ефективно, розміщено в новіших програмах на місцях, у яких збережені налаштування. Це був досить розповсюджений сценарій з CyanogenMod nightlies, коли нестабільна / тестувальна збірка ПЗУ спалахує, а налаштування зберігаються за допомогою кешу. Пробіг буде змінюватися залежно від того, які програми завантажуються з ринку (налаштування змінилися б за версією bump цілком ймовірно).

Для найкращих результатів було б розумно виконати дані Wipe Data і Wipe Cache, щоб забезпечити цілісність та відсутність програмних помилок у самій програмі.

Так, це означатиме, що час завантаження буде повільнішим, але його початковий вихідний момент. Після цього завантаження було б швидше. Дійсно кажучи, явно витираючи кеш-пам'ять через CWM насправді допомагає прискорити його та забезпечити відсутність залишків від попередньої версії на місці, який міг би потрапити в систему (Зараз на цьому етапі я усвідомлюю ваше запитання так, чесно кажучи, насправді насправді не було бачив, що Android під час завантаження нового ПЗУ не виконує вимкнення кеш-пам'яті.

Використовуйте джерело Лука серйозно! : D

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java- це завантажувальний код для кожної версії APK. Він взаємодіє з нативним кодом C, знайденим у dalvikдереві каталогів, який містить конкретні інструкції набору мікросхем для інтерпретації байт-коду в наборі інструкцій apk to native CPU. ARMv6 - це майже зламана версія ARMv5 (яка була оригінальним чіпсетом у старих версіях Android до Eclair), тому ARMv6 у Google AOSP-джерелі від Google не побачиш. CyanogenMod матиме цей ARMv6 у своєму джерелі.


Заради цієї дискусії припустимо, що ми говоримо про офіційний реліз CM7. Почніть з того, що я ніколи і ніколи не стирав кеш далвіків і ніколи не відчував проблем, які можна було б вирішити цим шляхом. Оскільки це не одаксе, не може бути присутнім декілька (o) файлів dex, і, таким чином, під час завантаження старий файл замінюється новоствореним. О, і якщо це дійсно велика справа, чому розробники не додають це до сценарію оновлення? Я перевірю джерело, дякую.
RR

1
Ви насправді можете явно помістити це в сценарій оновлення, але це може змусити оточуючих при спалахуванні, оскільки "О дерьмо, я втратив свої налаштування / дані", і CM, ймовірно, не хотів опікуватися полум'ями питань / відповідей, як у " Чому ви витирали мій кеш, коли миготів новий реліз CM? " - можливо, це зводиться до відповідальності CM, тому він надав таку можливість кінцевому користувачеві? І повернувши їх назад, щоб, якщо вони спалахнули без стирання, і скуголити на форумах: "Ей, мій додаток виходить з ладу", КМ може обернутися і сказати: "Ви витерли?"
t0mm13b

Я не мав на увазі, data/dataале data\dalvik-cache. Можливо, лише системні.
RR

1
Запаси AOSP ROM є доповненими, CM змінили систему складання, щоб використовувати deodex .... просто кажучи;)
t0mm13b

2
Дякуємо за детальну відповідь t0mm13b. Просто я зрозумів ... Здається, проста відповідь на поставлене запитання - "Ви цього не робите. За час завантаження це стирається за замовчуванням". Правильно?
GollyJer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.