Android Silent Install Apk

這次要完成一個能夠自動更新的APP

但是又必須符合以下條件:

  • 不打算放在Google Store
  • 不需要手動認證安裝(避開Installer,你真的要安裝嗎?->確定。這件事)

http://stackoverflow.com/questions/4308473/auto-update-for-private-android-apps

可以參考這張圖知道,分別要做以下幾件事情:

  1. 檢查Apk版本
  2. 下載新的Apk(Target new Apk url)
  3. 安裝(安裝工作交給另外一個APP執行)

直接跳到安裝部分

安裝

這篇Silent install apk programmatically by system app (without root)有提到silent install apk的一些事項:

  1. 加入android.permission.INSTALL_PACKAGES的權限
  2. signed my application using signapk.jar
    這部分很麻煩,沒做
  3. 接著可以用指令pm install /.../app.apk,進行安裝

PS: Updating application 有分別兩種方式

  • use pm install -r /.../app.apk
  • 先下pm uninstall com.mydomain.myapp,但是需要有android.permission.DELETE_PACKAGES的權限

以下是程式碼的部分

<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Silent install with Rootlink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
String filePath = Environment.getExternalStorageDirectory().toString() + "/your_app_directory/your_app_filename.apk";
Process installProcess = null;
int installResult = -1337;

try {
installProcess = Runtime.getRuntime().exec("su -c pm install -r " + filePath);
} catch (IOException e) {
// Handle IOException the way you like.
}

if (installProcess != null) {
try {
installResult = installProcess.waitFor();
} catch(InterruptedException e) {
// Handle InterruptedException the way you like.
}

if (installResult == 0) {
// Success!
} else {
// Failure. :-/
}
} else {
// Failure 2. :-(
}

Troubles

android.permission.INSTALL_PACKAGES

Project -> Clean

Source:

  • 忘了

Silent install

Source:

adb push your_apk_path /system/app/

據說可以获取系统权限

# Method 1
adb remount

# Method 2
#不行的话,
adb shell su                     #之后将文件系统remount为读写权限:
mount -o rw,remount /system     #出于安全考虑,记得完事后remount回只读:
mount -o ro,remount /system

# Method 3
mount -o rw,remount -t ext3 /dev/block/mmcblk1p21 /system

Source: