2013-02-27 29 views
11

Tôi đã được yêu cầu viết một ứng dụng đơn giản nhỏ cho một sản phẩm dựa trên Android. Thiết bị đi kèm với hai hình ảnh hệ thống Android với các tính năng khác nhau. Ứng dụng tôi đang viết chỉ là bằng chứng về khái niệm khi bạn nhấp vào nút, nó sử dụng Hệ thống khôi phục để thay thế hệ điều hành hiện tại bằng một trong các hình ảnh.Phát triển Android RecoverySystem.installPackage() không thể ghi vào/cache/recovery/lệnh permission bị từ chối

Thiết bị được bắt nguồn từ và ứng dụng chạy dưới dạng ứng dụng hệ thống.

tôi sử dụng

RecoverySystem.installPackage(context, packageFile); 

(see here for reference) để thay thế cho hệ điều hành với một trong những hình ảnh. Điều này sẽ khởi động lại hệ thống và khởi tạo hệ thống khôi phục để cài đặt hình ảnh.

Sự cố mà tôi gặp phải là cuộc gọi này không thành công do phương pháp RecoverySystem.installPackage dường như không thể truy cập tệp/cache/recovery/lệnh. Tôi đoán nó cố gắng viết một số lệnh cho hệ thống phục hồi được thực thi khi khởi động lại, nhưng không thành công. Đây là ngoại lệ tôi nhận được:

02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): java.io.FileNotFoundException: /cache/recovery/command: open failed: EACCES (Permission denied) 
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at libcore.io.IoBridge.open(IoBridge.java:416) 
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at java.io.FileOutputStream.<init>(FileOutputStream.java:88) 
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at java.io.FileOutputStream.<init>(FileOutputStream.java:73) 
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at java.io.FileWriter.<init>(FileWriter.java:42) 
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at android.os.RecoverySystem.bootCommand(RecoverySystem.java:381) 
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): at android.os.RecoverySystem.installPackage(RecoverySystem.java:330) 

Vì vậy, tôi giả định rằng tôi không có quyền truy cập thích hợp vào tệp này. Mặc dù đây là sự cho phép mà tôi đã đặt trong tệp kê khai của mình:

<uses-permission android:name="android.permission.REBOOT" /> 
<uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" /> 
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" /> 

Tôi biết tôi cần sự cho phép REBOOT cho số RecoverySystem. Tuy nhiên, tôi không biết liệu hai người kia có liên quan hay không. Tôi thậm chí không biết nếu tôi cần một số sự cho phép khác để tạo/ghi vào các tập tin trong phân vùng/cache.

Có ai biết tôi có thể bỏ lỡ điều gì không?


UPDATE:

Vâng, có vẻ như tôi figured it out. Các quyền đã được ngay sau khi tất cả. Mọi thứ đã đúng.

Khi tôi đang thiết lập ứng dụng dưới dạng ứng dụng hệ thống bằng cách di chuyển tệp APK vào/system/app, tôi chưa đặt tất cả các quyền. Khi tôi chạy mã mới nhất trên thiết bị của mình, nó đã cài đặt nó trong/data/app và nhận ra nó là bản cập nhật cho ứng dụng hệ thống. Do đó, chỉ các quyền của ứng dụng hệ thống ban đầu mới được nhận dạng.

Sau khi tôi thiết lập lại mã mới nhất của mình để chạy từ/hệ thống/ứng dụng trực tiếp, nó hoạt động.

Bây giờ vấn đề duy nhất tôi có là khi nó khởi động lại nó không cài đặt hình ảnh và tôi kết thúc với một robot màu xanh lá cây chết với một dấu chấm than. Tôi sẽ tiếp tục điều tra.

Tôi hy vọng bài đăng này sẽ giúp mọi người có cùng một vấn đề. Tôi cũng sẽ vui lòng trả lời bất kỳ câu hỏi nào.

+0

Tôi đã làm tương tự và tôi có thể ru n Nâng cấp FOTA. Nhưng vấn đề của tôi là, ứng dụng mà tôi tạo ra có nhãn là platform_app và ứng dụng được sử dụng bởi google để nâng cấp nằm trong untrusted_app. Có cách nào để làm cho ứng dụng của tôi như untrusted_app với quyền truy cập bộ nhớ đệm trên còn nguyên vẹn, bởi vì các quyền này chỉ được cung cấp cho các ứng dụng hệ thống mà tôi đoán là –

+0

@PankajKushwaha Hi pankaj tôi cũng đang cố triển khai FOTA trong aap của tôi theo chương trình. Các [link] (http://shriduttkothari.blogspot.in/2013/08/fota-in-android-mechanism.html) tôi tìm thấy một số sol nhưng tôi không thể hiểu làm thế nào để tiến xa hơn với điều này. – user3207655

+0

Tôi sẽ cho bạn biết quy trình cơ bản mà tôi đã theo dõi- 1) chạy thực hiện otapackage. Cho phép đặt tên là update.zip 2) sao chép tệp zip trong /cache/recovery/update.zip 3) viết lệnh sau "--update_package =/cache/update.zip" trong/cache/recovery/command 4) Khởi động lại thiết bị ở chế độ khôi phục. 5) Thiết bị sẽ tự động được nâng cấp. Bạn có thể tìm thấy mã mẫu trong /frameworks/base/core/java/android/os/RecoverySystem.java Ứng dụng tôi sử dụng là ứng dụng sytem (được ký bằng khóa nền tảng) –

Trả lời

0

Tôi gặp vấn đề với bạn khi tạo ứng dụng OtaUpdate tùy chỉnh trong android 5.0.2 và tôi đã giải quyết nó. Tôi sẽ chia sẻ với bạn với 2 bước bên dưới:

  1. Thêm android: sharedUserId = "com.google.uid.shared" trong AndroidManifest.xml
  2. Đẩy apk của bạn vào hệ thống/ứng dụng hoặc hệ thống/priv ứng dụng

Đối android 4.1.2:

  1. Thêm android: sharedUserId = "android.uid.system" trong AndroidManifest.xml
  2. Đẩy apk của bạn vào hệ thống/ứng dụng
+0

> Thêm android: sharedUserId = "com .google.uid.shared "trong AndroidManifest.xml Điều này sẽ tạo ra sự cố nếu bạn đã cài đặt ứng dụng Google. Chỉ cần đảm bảo rằng ứng dụng nằm trong hệ thống/ứng dụng riêng tư và bạn sẽ ổn. – Aldrian

2

Trước khi ứng dụng của tôi đã được cài đặt trong/system/app tôi đã nhận được dưới đây er ror:

07-20 10:52:46.512  933-951/? W/RecoverySystem﹕ !!! REBOOTING TO INSTALL /storage/emulated/legacy/Download/Update.zip !!! 
07-20 10:52:46.512  933-951/? W/System.err﹕ java.io.FileNotFoundException: /cache/recovery/command: open failed: EACCES (Permission denied) 
07-20 10:52:46.512  933-951/? W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:409) 
07-20 10:52:46.512  933-951/? W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:88) 
07-20 10:52:46.512  933-951/? W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:73) 
07-20 10:52:46.512  933-951/? W/System.err﹕ at java.io.FileWriter.<init>(FileWriter.java:42) 
07-20 10:52:46.512  933-951/? W/System.err﹕ at android.os.RecoverySystem.bootCommand(RecoverySystem.java:389) 
07-20 10:52:46.522  933-951/? W/System.err﹕ at android.os.RecoverySystem.installPackage(RecoverySystem.java:337) 

Tôi đã thử tất cả các quyền được yêu cầu nhưng tôi không thể tiếp tục.

Vì vậy, kể từ khi tôi đang sử dụng API ở trên 4.2, tôi đã cố gắng đặt ứng dụng của mình vào /system/priv-app và nó đã hoạt động đối với tôi.

0

Đối với Android 5.1.0

  1. Thêm android:sharedUserId="android.uid.system" trong AndroidManifest.xml
  2. Đẩy apk của bạn để system/priv-app
  3. và sau đó

    adb root 
    adb shell setenforce 0 
    
Các vấn đề liên quan