ทำไมฉันต้องเช็ดแคช Dalvik?


46

เมื่อฉันการปรับปรุงรอมที่กำหนดเองที่มีเสมอการเรียนการสอนที่จะเช็ดแคช Dalvik ฉันไม่เห็นเหตุผลว่าทำไมสิ่งนี้จึงจำเป็น

การดู logcat ในขณะที่ระบบกำลังบูทฉันสามารถเห็นได้อย่างชัดเจนว่าหากแอพเปลี่ยนdexไฟล์ของมันจะไม่ถูกต้องจากนั้นทำการสร้างใหม่ แต่ถึงกระนั้นเมื่อฉันพูดถึงสิ่งนี้ทุกที่ที่ฉันได้พบกับความเงียบ ราวกับว่าไม่มีนักพัฒนา ROM บางคนที่รู้เรื่องนี้และพวกเขาก็ทำเช่นนี้เพราะทุกคนทำได้

ดังนั้นคำถาม:

  • มีรุ่น Android ที่ไฟล์ Dalvik ไม่ถูกต้องระหว่างการบูทหรือไม่?
  • มีข้อได้เปรียบอะไรบ้างในการทำสิ่งนี้ด้วยตัวเองแทนที่จะปล่อยให้ระบบทำงานตามที่ควรจะทำ?

คำตอบที่เหมาะสมที่สุดคือการอ้างอิงถึงรหัสที่เกี่ยวข้องดังนั้นฉันจะมีการอ้างอิงในครั้งต่อไป

คำตอบ:


43

เพื่อตอบคำถามของคุณ:

  • ฉันไม่ทราบว่า Android เวอร์ชั่นใดที่ Dalvik ไม่ถูกต้องเมื่อบู๊ต บางทีเวอร์ชันเริ่มต้น 1.0 มีสิ่งนั้นฉันไม่รู้จริง ๆ ได้ผ่าน Eclair, Froyo, Gingerbread, Ice Cream Sandwich แล้ว คุณต้องมองเข้าไปในแผนผังต้นกำเนิดและทำการ rebase กลับไปที่ CupCake หรือ Donut (1.5 และ 1.6 ตามลำดับ)

  • เหตุผลอย่างละเอียด :)

เหตุผลที่ต้องใช้Wipe Cacheนั้นเป็นเพราะ apks ทั้งหมดรวมถึง system apks มีไฟล์dexติดอยู่เมื่อ ROM ถูกบูทขึ้นเป็นครั้งแรก Dalvik ของ Android จะผ่านแต่ละ apks เหล่านั้นและแยก ไฟล์ dex จากมันและวางไว้ในแคช/data/dalvik-cacheจึงเร่งการดำเนินการของแอปเอง

ROM ส่วนใหญ่มี apks ที่เป็นodexแคชจะถูกรวมเข้าไปใน apk ของตัวเองเป็นไฟล์ภายนอก

ตัวดัดแปลง ROM ที่กำหนดเองจำนวนมากจะมีapod deodex 'd ซึ่งหมายความว่าไฟล์ dex จะถูกแทนที่และบรรจุใหม่เพื่อให้ง่ายต่อการปรับธีม / ดัดแปลง apk

เมื่อคุณแฟลช ROM ที่กำหนดเองและไม่ได้ล้างแคช apk ของ ROM ที่กำหนดเองที่ใหม่กว่าจะมีไฟล์dex ที่แตกต่างกันแนบมาและเมื่อ Dalvik ผ่านไฟล์เหล่านั้นมันจะเห็นไฟล์ dex แคชที่มีอยู่ในไดเรกทอรีและ ข้ามไปจากนั้นเมื่อคุณเรียกใช้แอปคุณจะมั่นใจได้ว่ามีแรงใกล้เคียงหรือ ANR (แอปพลิเคชันไม่ตอบสนอง)

คุณยังไม่ได้สูญเสียข้อมูลต่อ se ถ้าใช้การกู้คืน ClockworkMod และเช็ดให้ข้อมูลที่ถูกเลือกแล้วใช่การตั้งค่าทั้งหมดที่เกี่ยวข้องกับการปพลิเคชันที่มีการเช็ดหมดจด - /data/appมองใน

ดังนั้นคุณสามารถล้างแคชได้ แต่ไม่ใช่เช็ดข้อมูลสิ่งที่ทำอย่างมีประสิทธิภาพนั้นจะถูก slotted ใน apks ที่ใหม่กว่าซึ่งมีการตั้งค่าไว้ นี่เป็นสถานการณ์ที่พบได้ทั่วไปกับ CyanogenMod nightlies ที่การสร้าง ROM ที่ไม่เสถียร / การทดสอบถูกกระพริบและการตั้งค่าที่เก็บไว้ด้วยการล้างแคช ระยะทางจะแตกต่างกันไปขึ้นอยู่กับแอพที่ดาวน์โหลดจากตลาด

เพื่อผลลัพธ์ที่ดีที่สุดคุณควรดำเนินการทั้งWipe DataและWipe Cacheเพื่อรับรองความถูกต้องและไม่มีข้อผิดพลาดของโปรแกรมภายในแอป

ใช่นั่นหมายความว่าเวลาบูตจะช้าลง แต่จะเริ่มต้นทันที หลังจากนั้นมันก็จะทำการบูทได้เร็วขึ้น สรุปสั้น ๆ การล้างแคชตัวเองผ่าน CWM จริง ๆ แล้วช่วยเพิ่มความเร็วและมั่นใจว่าไม่มีสารตกค้างจากรุ่นก่อนหน้าในสถานที่ซึ่งสามารถ munged ใน (ตอนนี้ในขั้นตอนนี้กำลังตระหนักถึงคำถามของคุณดังนั้นในความเป็นธรรมทั้งหมด เห็น Android ไม่ทำการแคชของตัวเองเมื่อบู๊ตเมื่อกระพริบ ROM ใหม่ .. )

ใช้แหล่งที่มาของลุคอย่างจริงจัง! : D

frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaคือรหัสการบูตสำหรับ apk runtime แต่ละตัว มันทำปฏิกิริยากับรหัส C ดั้งเดิมที่พบในdalvikแผนผังไดเรกทอรีซึ่งมีคำสั่งชิปเซ็ตเฉพาะเพื่อตีความ bytecode ภายใน apk ไปยังชุดคำสั่ง CPU ดั้งเดิม ARMv6 นั้นเป็น ARMv5 ที่แฮ็ก (ซึ่งเป็นชิปเซ็ตดั้งเดิมใน Android รุ่นเก่าก่อน Eclair) ดังนั้นคุณจะไม่เห็น ARMv6 ในซอร์ส AOSP จาก google CyanogenMod จะมี ARMv6 ในแหล่งที่มา


เพื่อประโยชน์ของการสนทนานี้สมมติว่าเรากำลังพูดถึงการเปิดตัว CM7 อย่างเป็นทางการ ให้ฉันเริ่มด้วยการบอกว่าฉันไม่เคยเช็ดแคช Dalvik ของฉันและไม่เคยประสบปัญหาที่จะแก้ไขได้ด้วยการทำเช่นนั้น เนื่องจากมันไม่ได้อยู่ในกลุ่ม odexed จึงไม่มีทางที่จะมีหลายไฟล์ (o) dex อยู่และในการบู๊ตไฟล์เก่าจะถูกแทนที่ด้วยไฟล์ที่สร้างขึ้นใหม่ โอ้และถ้าเป็นเรื่องใหญ่ทำไมนักพัฒนาไม่เพิ่มสิ่งนี้ลงในสคริปต์ตัวอัปเดต ฉันจะตรวจสอบแหล่งที่มาขอบคุณ
RR

1
คุณสามารถใส่ลงไปในสคริปต์ updater ได้อย่างชัดเจน แต่นั่นสามารถฉี่คนอื่น ๆ ออกมาเมื่อกระพริบเพราะ "โอ้อึฉันสูญเสียการตั้งค่า / ข้อมูลของฉัน" และ CM อาจไม่ต้องการถูกเผาด้วยเปลวไฟคำถาม / คำตอบเหมือนใน " เหตุใดคุณจึงล้างแคชเมื่อกระพริบ CM รุ่นใหม่ " - บางทีมันอาจเป็นความรับผิดชอบของ CM ดังนั้นจึงให้ทางเลือกแก่ผู้ใช้ปลายทาง? และนำมันกลับมาให้พวกเขาเพื่อที่ว่าถ้าพวกเขากระพริบโดยไม่ต้องเช็ดและสะอื้นบนฟอรั่มว่า "เฮ้แอปของฉันพังแล้ว" CM สามารถหันกลับมาแล้วพูดว่า
t0mm13b

ผมไม่ได้หมายถึงแต่data/data data\dalvik-cacheอาจเป็นเพียงแค่ระบบ
RR

1
ROM AOSP ของสต็อคเป็น odexed CM ได้ปรับเปลี่ยนระบบการสร้างเพื่อใช้ deodex .... เพียงแค่พูดว่า;)
t0mm13b

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