2016-06-09 2 views
2

Я пытался создать пользовательский диск в Android. Так что, далеко я смог сделать изменения и вспыхнуть в Nexus 4 успешно. Но моя главная цель - предоставить обновления Ota для моего ПЗУ. Сейчас я могу обновить устройство с помощью update.zip с помощью adb sideload, и теперь я хочу, чтобы это было сделано автоматически через системное приложение. Для этого я сделал системное приложение, которое может загрузить update.zip с моего сервера. Я прошел через эту ссылку без какого-либо прогресса: Android development RecoverySystem.installPackage() cannot write to /cache/recovery/command permission deniedOta Обновление в AOSP

я использовал следующий код в AsyncTask для установки обновления:

File update = new File("/data/update.zip"); 
    try { 
     RecoverySystem.installPackage(mContext, update); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Но я получаю следующее сообщение об ошибке:

W/RecoverySystem(3900): !!! REBOOTING TO INSTALL /data/update.zip !!! 
    W/System.err(3900): java.io.FileNotFoundException: /cache/recovery/command: open failed: ENOENT (No such file or directory) 
    W/System.err(3900): at libcore.io.IoBridge.open(IoBridge.java:456) 
    W/System.err(3900): at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 
    W/System.err(3900): at java.io.FileOutputStream.<init>(FileOutputStream.java:72) 
    W/System.err(3900): at java.io.FileWriter.<init>(FileWriter.java:42) 
    W/System.err(3900): at android.os.RecoverySystem.bootCommand(RecoverySystem.java:454) 
    W/com.test.ota(3966): type=1400 audit(0.0:8): avc: denied { write } for comm=4173796E635461736B202331 name="/" dev="mmcblk0p22" ino=2 scontext=u:r:system_app:s0 tcontext=u:object_r:cache_file:s0 tclass=dir 

Вещь, с которой я запутался, я могу получить доступ к каталогу данных (который недоступен для обычных приложений) при загрузке, но я не могу получить доступ к кешу.

Как я могу продолжить, чтобы я не получил доступ к системному приложению при доступе/кеше?

Мой манифест файл:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
android:sharedUserId="android.uid.system" 
xmlns:tools="http://schemas.android.com/tools" 
package="com.test.ota"> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission 
    android:name="android.permission.ACCESS_CACHE_FILESYSTEM" 
    tools:ignore="ProtectedPermissions"/> 
<uses-permission 
    android:name="android.permission.DELETE_CACHE_FILES" 
    tools:ignore="ProtectedPermissions"/> 
<uses-permission 
    android:name="android.permission.REBOOT" 
    tools:ignore="ProtectedPermissions" /> 
<uses-permission android:name="android.permission.RECOVERY" /> 

Btw, моя сборка ветвь андроида-5.1.1_r19

Update 1: Я построен с использованием full_mako-userdebug. Итак, у меня есть su при необходимости в adb. В оболочке adb, когда я пытаюсь создать cache/recovery/command после su, он позволяет мне создать файл. Но через приложение он не позволяет мне создавать файл в cache/recovery/, хотя его системное приложение. Я не хочу, чтобы пользователь подключал телефон только для установки обновления ota. Тем не менее такая же проблема.

ответ

0

Обратите внимание: new File("/data/update.zip"); по умолчанию не создает новый файл, он сохраняет только строку с именем файла. Проверьте methods to create a file.

Если вы уверены, что файл существует /data/update.zip, попробуйте создать /cache/recovery/command перед запуском RecoverySystem.installPackage.

+0

Да, я проверил это обновление .zip существует. Прежде чем я даже попытался сделать '/ cache/recovery/command' вручную через приложение. Но создание файла дает то же разрешение, что и ошибка. –

0

Сделайте grep из 'denied' на logcat, чтобы проверить, предотвращает ли selinux доступ вашего приложения к кешу при выполнении RecoverySystem.installPackage. Кроме того, поскольку у вас есть доступ к суду, временно отключите selinux через adb setenforce 0 до выполнения RecoverySystem.installPackage.

5

Хотя у вас есть доступ к файловой системе кеша в качестве системного пользователя, вам нужно изменить Linux SEPolicy, чтобы предоставить пользователю права на запись в файл/cache.

Добавьте следующие строки в файл внешний/sepolicy/system_app.te:

allow system_app cache_file:dir create_dir_perms; 
allow system_app cache_file:file create_file_perms; 

Затем восстановить, и вы не должны иметь эту ошибку еще раз :)

Смежные вопросы