Tại sao tôi cần xóa bộ nhớ cache Dalvik?


46

Khi tôi cập nhật ROM tùy chỉnh, luôn có một hướng dẫn để xóa bộ nhớ cache Dalvik . Tôi không thấy một lý do tại sao điều này là cần thiết.

Xem logcat trong khi hệ thống khởi động, tôi có thể thấy rõ rằng nếu một ứng dụng thay đổi, dextệp của nó bị vô hiệu hóa và sau đó được tạo lại. Tuy nhiên, khi tôi đề cập đến bất cứ nơi nào tôi gặp phải sự im lặng. Như thể thậm chí một số nhà phát triển ROM không biết điều này và họ chỉ làm điều này bởi vì những người khác làm.

Vì vậy, các câu hỏi:

  • Có phiên bản Android nào mà các tệp Dalvik không bị vô hiệu trong quá trình khởi động không?
  • Có bất kỳ lợi thế nào khi tự làm việc này không, thay vì để hệ thống thực hiện công việc mà nó phải làm?

Một câu trả lời lý tưởng sẽ bao gồm các tham chiếu đến mã có liên quan, vì vậy tôi sẽ có một tài liệu tham khảo vào lần tiếp theo.

Câu trả lời:


43

Để trả lời câu hỏi của bạn:

  • Tôi không biết về bất kỳ phiên bản Android nào mà Dalvik không bị vô hiệu khi khởi động. Có lẽ phiên bản ban đầu 1.0 có điều đó, tôi thực sự không biết, đã trải qua Eclair, Froyo, Gingerbread, Ice Cream Sandwich. Bạn cần nhìn vào cây nguồn và khởi động lại nó thành CupCake hoặc Donut (lần lượt là 1,5 và 1,6)

  • Lý do chi tiết :)

Lý do Wipe Cache phải được sử dụng là vì tất cả các apks, bao gồm cả apks hệ thống, đều có tệp dex được đính kèm, khi ROM được khởi động lần đầu tiên, Dalvik của Android sẽ đi qua từng apks đó và giải nén tệp dex từ nó và đặt nó vào bộ đệm trong /data/dalvik-cacheđó tăng tốc độ thực thi ứng dụng.

Hầu hết các ROM đều có apks là odex 'ed, bộ đệm được gói vào chính apk dưới dạng tệp bên ngoài.

Rất nhiều bộ điều biến ROM tùy chỉnh sẽ có các apks deodex 'd, nghĩa là tệp dex được thay thế và đóng gói lại để giúp chủ đề / sửa đổi apk dễ dàng hơn.

Khi bạn flash ROM tùy chỉnh và không xóa bộ nhớ cache, apk của ROM tùy chỉnh mới hơn sẽ có tệp dex khác được đính kèm và khi Dalvik đi qua chúng, nó sẽ thấy tệp dex được lưu trong bộ nhớ cache hiện có trong thư mục và bỏ qua nó, sau đó khi bạn chạy ứng dụng, bạn được đảm bảo một lực lượng đóng hoặc ANR (Ứng dụng không phản hồi).

Bạn sẽ không mất dữ liệu mỗi lần, nếu sử dụng ClockWorkMod Recovery và Wipe Data được chọn, thì có, tất cả các cài đặt liên quan đến ứng dụng sẽ bị xóa sạch - hãy nhìn vào /data/app.

Vì vậy, bạn có thể xóa bộ nhớ cache nhưng không xóa dữ liệu , những gì được thực hiện một cách hiệu quả, được đặt trong các ứng dụng mới hơn, trong đó nó có các cài đặt được giữ lại. Đây là một tình huống khá phổ biến với các cơn ác mộng CyanogenMod khi bản dựng ROM không ổn định / thử nghiệm được flash và các cài đặt được giữ lại bằng xóa bộ nhớ cache. Số dặm sẽ thay đổi tùy thuộc vào ứng dụng nào được tải xuống từ thị trường (cài đặt có thể đã thay đổi theo phiên bản có thể bị lỗi).

Để có kết quả tốt nhất, sẽ là khôn ngoan khi thực hiện cả Xóa dữ liệuXóa bộ nhớ cache để đảm bảo tính toàn vẹn và không có lỗi chương trình trong chính ứng dụng.

Vâng, điều đó có nghĩa là thời gian khởi động sẽ chậm hơn nhưng thời điểm ban đầu lại tắt. Sau đó nó sẽ khởi động nhanh hơn. Thực sự, tóm lại, việc xóa bộ nhớ cache thông qua CWM thực sự giúp tăng tốc và đảm bảo không có dư lượng từ phiên bản trước có thể được xử lý (Bây giờ ở giai đoạn này, tôi nhận ra câu hỏi của bạn vì vậy công bằng, thực sự không thấy Android không thực hiện việc vô hiệu hóa bộ đệm khi khởi động khi flash ROM mới ..)

Sử dụng nguồn Luke một cách nghiêm túc! :CƯỜI MỞ MIỆNG

frameworks/base/core/java/com/android/internal/os/ZygoteInit.javalà mã khởi động cho mỗi apk apk. Nó tương tác với mã C gốc được tìm thấy trong dalvikcây thư mục chứa các hướng dẫn chipset cụ thể để diễn giải mã byte trong apk sang tập lệnh CPU gốc. ARMv6 gần như là một phiên bản hack của ARMv5 (vốn là chipset gốc trong các phiên bản Android cũ trước Eclair), vì vậy bạn sẽ không thấy ARMv6 trong nguồn AOSP từ google. CyanogenMod sẽ có ARMv6 trong nguồn của họ.


Vì lợi ích của cuộc thảo luận này, hãy giả sử rằng chúng ta đang nói về một phiên bản CM7 chính thức. Hãy để tôi bắt đầu bằng cách nói rằng tôi chưa bao giờ, xóa bộ nhớ cache dalvik của tôi và chưa bao giờ gặp sự cố sẽ được giải quyết bằng cách làm như vậy. Bởi vì nó không bị lỗi, không có cách nào có thể có nhiều tệp (o) dex, và do đó, khi khởi động, tệp cũ được thay thế bằng tệp mới được tạo. Ồ và nếu nó thực sự là một vấn đề lớn tại sao các nhà phát triển không thêm điều này vào tập lệnh cập nhật? Tôi sẽ kiểm tra nguồn, cảm ơn.
RR

1
Bạn thực sự có thể đưa nó vào tập lệnh cập nhật, nhưng điều đó có thể khiến người khác bực mình khi nhấp nháy vì "Ôi trời, tôi đã mất cài đặt / dữ liệu của mình" và CM có thể không muốn bị đốt cháy bởi các câu hỏi / câu trả lời như trong " Tại sao bạn xóa bộ nhớ cache của tôi khi flash một bản phát hành mới của CM? " - có lẽ nó thuộc trách nhiệm của CM nên đã đưa tùy chọn đó cho người dùng cuối? Và đặt nó lại cho họ để nếu họ flash mà không lau, và rên rỉ trên các diễn đàn một lá "Hey ứng dụng của tôi bị sập", CM có thể quay lại và nói "Bạn đã lau chưa?"
t0mm13b

Tôi không có ý data/datanhưng data\dalvik-cache. Có thể chỉ là những người hệ thống.
RR

1
ROM AOSP Stock bị lỗi, CM đã sửa đổi hệ thống xây dựng để sử dụng deodex .... chỉ cần nói;)
t0mm13b

2
Cảm ơn câu trả lời chi tiết t0mm13b. Chỉ để tôi rõ ràng ... Có vẻ như câu trả lời đơn giản cho câu hỏi được đăng là "Bạn không. Nó bị xóa theo mặc định khi khởi động." Chính xác?
GollyJer
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.