繁体   English   中英

AOSP中的Ota更新

[英]Ota Update in AOSP

我一直试图在android中制作自定义ROM。 因此,到目前为止,我已经能够进行更改并成功在Nexus 4中闪烁。 但是我的主要目的是向我的ROM提供Ota更新。 现在,我可以使用adb sideload用update.zip更新设备,现在,我希望通过系统应用程序自动完成该设备。 为此,我制作了一个系统应用程序,可以从我的服务器下载update.zip。 我通过此链接没有任何进展: Android开发RecoverySystem.installPackage()无法写入/ cache / recovery / command权限被拒绝

我已在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

我感到困惑的是,下载时我能够访问数据目录(普通应用程序无法访问),但我无法访问/ cache。

我应该如何进行处理,以便在访问/ cache时不会获得对系统应用程序的拒绝?

我的清单文件是:

    <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构建。 所以,我在需要时在adb中有su。 在adb shell中,当我尝试在su之后创建cache/recovery/command ,它允许我创建文件。 但是通过应用程序,即使我使用系统应用程序,也不允许我在cache/recovery/创建文件。 我不希望用户仅安装ota更新而将手机扎根。 仍然有同样的问题。

尽管您以系统用户的身份拥有对缓存文件系统的读取访问权限,但是您仍需要更改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;

然后重新构建,您不应该再次出现此错误:)

请注意, new File("/data/update.zip"); 默认情况下不会创建新文件,只会保留文件名字符串。 检查创建文件的方法

如果确定/data/update.zip文件存在,请尝试在运行RecoverySystem.installPackage之前手动创建/cache/recovery/command

在logcat上执行grep'denied',以检查selinux在执行RecoverySystem.installPackage时是否阻止您的应用程序访问缓存。 或者,由于您具有su访问权限,因此请在执行RecoverySystem.installPackage之前通过adb setenforce 0暂时关闭selinux。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM