2016-06-09 38 views
2

我一直在嘗試在android中製作一個自定義ROM。所以,我已經能夠成功地在Nexus 4中進行更改和閃存。但我的主要目標是爲我的ROM提供Ota更新。現在我可以用update.zip使用adb sideload更新設備,現在我希望它可以通過系統應用程序自動完成。爲此,我製作了一個系統應用程序,可以從我的服務器上下載update.zip。 我已經通過這個環節去無任何進展: Android development RecoverySystem.installPackage() cannot write to /cache/recovery/command permission deniedAOSP太田更新

我已經使用的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。所以,當adb需要時我有su。在adb shell中,當我嘗試在su後創建cache/recovery/command時,它允許我創建文件。但通過應用程序,它不允許我在cache/recovery/中創建文件,即使其系統應用程序。我不希望用戶只是爲了安裝一個更新而爲根。仍然有同樣的問題。

回答

0

請注意,new File("/data/update.zip");默認情況下不會創建新文件,它只保留文件名字符串。檢查methods to create a file

如果您確定/data/update.zip文件存在,請在運行RecoverySystem.installPackage之前手動創建/cache/recovery/command

+0

是的,我檢查了更新.zip存在。在我甚至嘗試通過app手動創建'/ cache/recovery/command'之前。但是創建文件會給出相同的權限被拒絕的錯誤。 –

0

在logcat上執行grep'denied'來檢查selinux是否阻止您的應用在執行RecoverySystem.installPackage時訪問緩存。或者,由於您擁有su訪問權限,因此在執行RecoverySystem.installPackage之前,請通過adb setenforce 0臨時關閉selinux。

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; 

然後重建,你不應該再有這個錯誤:)