12

Tôi đang làm việc trên một ứng dụng hệ thống cập nhật itslef bằng cách tải xuống một gói ứng dụng và cài đặt nó bằng cách sử dụng phương thức installPackage() của PackageManager.Sụp đổ trong khi tự cập nhật APK (lớp thành phần không tồn tại)

Tôi nhận được ngoại lệ sau đây:

Fatal Exception: java.lang.IllegalArgumentException: Component class com.myapp.package.receivers.SomeOldReceiver does not exist in com.myapp.package 
      at android.os.Parcel.readException(Parcel.java:1544) 
      at android.os.Parcel.readException(Parcel.java:1493) 
      at android.content.pm.IPackageManager$Stub$Proxy.setComponentEnabledSetting(IPackageManager.java:3420) 
      at android.app.ApplicationPackageManager.setComponentEnabledSetting(ApplicationPackageManager.java:1492) 
      at com.myapp.package.utils.AndroidUtils.enableDisableComponent(SourceFile:113) 
      at ... 

Các "SomeOldReceiver" thành phần không tồn tại trong các gói ứng dụng cập nhật. Có vẻ như mã "cũ" từ APK hiện tại được thực thi (ứng dụng onCreate() của ứng dụng được gọi) cố gắng truy cập vào tệp kê khai "mới" tồn tại trong APK được cập nhật và không thể tìm thấy tệp "cũ" người nhận (điều này thậm chí có thể?).

Ứng dụng của tôi cũng lắng nghe ý định PACAKGE_ADDED & PACKAGE_REMOVED.

Sự cố này xảy ra trên một tỷ lệ phần trăm người dùng tương đối lớn.

Bất kỳ đề xuất hoặc đầu mối nào về lý do lỗi này xảy ra và cách sửa lỗi sẽ được đánh giá cao.

+0

Khi nào bạn có ngoại lệ? khi nào mã 'com.myapp.package.utils.AndroidUtils.enableDisableComponent' chạy? – Blundell

+0

'Sự cố này xảy ra trên phần lớn người dùng.' khiến tôi nghi ngờ đó là do sự không tương thích API xảy ra khi chữ ký installPackage được sửa đổi và/hoặc toàn bộ vùng PackageManager giữa các nền tảng. Nó có thể là giá trị nó để thả các ý tưởng PackageManager và trở về với mục đích? – L33T

+0

Bạn có thể thấy bắt đầu phiên bản Android nào xảy ra sự cố này không? –

Trả lời

0

Có nhiều cách khác nhau làm thế nào để cập nhật APK..Im không chắc chắn bạn đang sử dụng .. Tôi phải đối mặt với vấn đề tương tự .. và nó là do ứng dụng có nhiều trường hợp trong quá trình cập nhật .. bạn có thể làm cho ứng dụng như trường hợp duy nhất hoặc chỉ cần chắc chắn rằng không có trường hợp cũ chạy. Tôi hy vọng điều đó có thể hữu ích.

+0

làm cách nào để làm cho một ứng dụng chạy dưới dạng một cá thể? –

+0

trong tệp kê khai android: launchMode = "singleInstance" cho hoạt động chính của bạn –

+0

Tôi không nghĩ rằng thiết lập chế độ khởi chạy cho một hoạt động sẽ ảnh hưởng đến nhiều ứng dụng so với cá thể đơn lẻ, nó chỉ ảnh hưởng đến hoạt động. một trong hai cách - cho cách nói: ứng dụng của tôi bắt đầu và cập nhật chính nó mà không cần bất kỳ hoạt động nào từng là trình khởi chạy –

0

Since JELLY_BEAN version: Gọi tới PackageManager.setComponentEnabledSetting giờ sẽ ném IllegalArgumentException nếu tên lớp thành phần nhất định không tồn tại trong tệp kê khai của ứng dụng.

Điều này giải thích tại sao sự cố này xảy ra trên phần lớn người dùng.

0

Xin lỗi, tôi không thể xác nhận liệu đây có phải là sự giúp đỡ nào vì bản thân tôi chưa tự kiểm tra hay không.

Có thể bạn có thể thử tắt "SomeOldReceiver" (hoặc bất kỳ thành phần nào khác có thể được kích hoạt bằng cách cài đặt gói mới) bằng cách gọi tới setComponentEnabledSetting() trước khi gọi installPackage()? Một cách hợp lý, điều này có thể yêu cầu bạn tạo ra một phiên bản tạm thời của ứng dụng của bạn (thêm setComponentEnabledSetting() cuộc gọi trước installPackage() và vẫn phải có "SomeOldReceiver" trong tệp kê khai của nó) để cập nhật phiên bản cũ trước tiên. Sau đó, bạn có thể cập nhật phiên bản này lên phiên bản cập nhật thực của bạn với "SomeOldReceiver" đã bị xóa.

Các vấn đề liên quan