Ота Обновление в AOSP

Я пытался сделать Custom ROM в Android. Итак, мне удалось внести изменения и успешно прошить в Nexus 4. Но моя главная цель - предоставить Ota обновления для моего ROM. Сейчас я могу обновить устройство с помощью update.zip, используя adb sideload, и теперь я хочу, чтобы это делалось автоматически через системное приложение. Для этого я создал системное приложение, которое может загрузить файл update.zip с моего сервера. Я прошел по этой ссылке без какого-либо прогресса: разработка Android RecoverySystem.installPackage() не может записать в /cache/recovery/ разрешение на команду отклонено

Я использовал следующий код в 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" />

Кстати, моя ветка сборки Android-5.1.1_r19

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

3 ответа

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

Добавьте следующее в файл external / sepolicy / system_app.te:

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

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

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

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

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

Другие вопросы по тегам