Androidアプリをサイレントインストール・アップデートする

主に業務アプリなどで使用される、ユーザーが難しい操作をすることなく、
Androidアプリを自動アップデートするための機能を実装する方法を解説します。

検証環境

  • Android 11 AOSP
  • DeviceOwner権限を付与済

サイレントインストールのサンプルコード

PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();

PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
params.setAppPackageName(context.getPackageName());

PackageInstaller.Session session;
InputStream in;
OutputStream out;
try {
    int sessionId = packageInstaller.createSession(params);
    session = packageInstaller.openSession(sessionId);

    File apkFile = new File(filePath);
    in = Files.newInputStream(apkFile.toPath());
    out = session.openWrite("INSTALL", 0, -1);
    int total = 0;
    byte[] buffer = new byte[65536];
    int c;
    while ((c = in.read(buffer)) != -1) {
        total += c;
        out.write(buffer, 0, c);
    }
    session.fsync(out);

    if (out != null) {
        out.close();
    }
    in.close();
    session.close();

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, sessionId,
        new Intent(context, MainActivity.class), PendingIntent.FLAG_MUTABLE);
    session.commit(pendingIntent.getIntentSender());
}
catch (Exception e) {
    Log.d(TAG, e.getMessage());
}

公式のリファレンスにも記載がありますが、アプリに以下のいずれかの権限がない場合は、
インストールの過程で、ユーザーによる操作が必要となる場合があります。

  • the device owner
  • the affiliated profile owner

参考)https://developer.android.com/reference/android/content/pm/PackageInstaller