【Android】系統App靜默更新

【Android】系統App靜默更新

純粹紀錄一下怕以後忘記,在開發系統App的時候,有時候會需要遠端更新App版本,這時候就可以發揮系統App的優勢,直接拿系統權限下Command把Apk蓋過去做升級的動作,下面勢力:

String libs = "LD_LIBRARY_PATH=/vendor/lib:/system/lib ";
String[] commands = new String[]{
	libs + "mount -o rw,remount /",
    libs + "chmod 666 /system/app/{AppName}/{ApkName}.apk",
    libs + "rm /system/app/{AppName}/{ApkName}.apk",
    libs + "cp -rf " + {NewApkPath}/{ApkName}.apk /system/app/{AppName}/",
    libs + "chmod 644 /system/app/{AppName}/{ApkName}.apk",
    libs + "chmod 755 /system/app/{AppName}/",
    libs + "mount -o ro,remount /",
    "/system/bin/reboot",
};
                        
Process p = Runtime.getRuntime().exec("su");
InputStream es = p.getErrorStream();
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for( String command : commands ) {
	Log.i(TAG, command);
    os.writeBytes(command + "\n");
}
os.writeBytes("exit\n");
os.flush();

int read;
byte[] buffer = new byte[4096];
String output = new String();
while ((read = es.read(buffer)) > 0) {
	output += new String(buffer, 0, read);
}
p.waitFor();
Log.d(TAG, output.trim() + " (" + p.exitValue() + ")");

其實作法很簡單:

  1. 讓系統資料夾取得讀寫的權限
  2. 修改要更換的Apk權限,讓他可以被修改
  3. 將舊版的Apk檔案刪除
  4. 複製新版的Apk進/system/app/{AppName}/資料夾底下
  5. 把Apk的權限恢復
  6. 恢復/system/app/{AppName}/的權限
  7. 恢復系統資料夾只讀權限
  8. 重新開機

基本上這樣就完成了,但前提是裝置要先取得root權限,後面就只是執行這些 Command 跟印出結果而已。

Linux檔案權限

既然都提到修改權限當然要來了解一下前面那三碼的數字代表什麼意思。當我們在Linux底下輸入 ls -al 指令的時候,會列出當前資料夾裡面的所有檔案、資料夾及他們的權限,會長的像下面這樣:

drwxr-xr-x   6 root  admin   192  2  7 05:22 Users
c

這一行包含了檔案的屬性、連結數、檔案擁有者、檔案所屬群組、檔案容量、修改時間及名稱,下面我們著重來看前面的檔案屬性:

drwxr-xr-x

這裡的第一個字元,代表的是這個檔案的類別:

  • -:代表這是一個檔案
  • d:代表這是一個資料夾
  • l:代表這是一個連結檔
  • b:代表這是一個可供儲存的設備
  • c:代表這是一個序列埠設備,像是滑鼠鍵盤之類的

後面的九個字元則代表了三個一組的三組權限,這每一組裡都包含了rwx,可讀、可寫、可執行的權限,若為 - 則代表沒有該權限:

  • 第一組代表的是檔案擁有者的權限
  • 第二組代表的是檔案群組所有的權限
  • 第三組則代表其他人的權限

而上面提到的三組屬性,也可以用數字表達,r會用4代表、w會用2代表、x是1,把三個數字加總就代表一組權限,換句話說rwx的權限就可以用 4+2+1=7 來代表,所以上面 command 所提到的權限 755 跟 644 就分別代表著 rwxr-xr-x 及 rx-r--r-- 的權限。

參考資料:http://www2.lssh.tp.edu.tw/~hlf/class-1/linux/file_permission.htm