Android设备管理员应用程序(Kiosk模式)的OTA更新

19
我可以通过NFC使我的应用程序成为设备所有者应用程序,如此处所述。现在我想通过空中更新我的应用程序,但我找不到一种无需root的方法。
谷歌提供了许多企业开发应用程序的选项,如此处所述,但没有提供通过OTA更新应用程序的方法。
正在寻找解决方案。

Evolve(https://github.com/VivekPanyam/Evolve)可能会有所帮助。 - Prayag Verma
我已经看到了,但是无法使用它,而且它还处于alpha阶段,可能会导致我们的应用程序崩溃。它似乎在运行时更改代码,所以看起来有点复杂。 - Shubham
@Shubham,你解决了这个问题吗? - Maragues
@Maragues 两年前,如果不进行root操作,我就无法做到这一点。 - Shubham
@Shubham 非常感谢,这就是我所想的。不幸的是,我的客户仍然有很多4.4.2设备 :( - Maragues
5个回答

4
这只是我的猜测,因为我从未尝试过使用包安装程序API:
你可以尝试为你的设备所有者应用程序设置一个安装程序包(使用“PackageManager.setInstallerPackageName()”)。这个安装程序包需要是一个单独签名的APK,与设备所有者APK相同。
getPackageManager().setInstallerPackage("<device.owner.package.name>", "<installer.package.name>");

从您的安装程序APK中,您可以使用PackageInstaller来准备升级:
PackageInstaller pi = getPackageManager().getPackageInstaller();
int sessId = pi.createSession(new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL));
PackageInstaller.Session session = pi.openSession(sessId);
OutputStream out = session.openWrite("app");
// .. write updated APK file to out
session.fsync(out);
session.commit(...);
session.close();

我不确定这是否会悄悄安装您的更新(或者是否按照我预期的方式完全有效)。

@Shubham 如果你尝试了这种方法,如果它按照我的预期工作,我会非常高兴听到反馈(或者如果你遇到了什么问题)。 - Michael Roland
我无法尝试您的答案,但对Package Installer进行了更多研究,发现要提交会话,我们将需要root权限。我很快还会尝试这个,并给您反馈。https://dev59.com/O18d5IYBdhLWcg3wYhaX - Shubham

1
你可以使用Play Store为你的应用提供更新:
  1. 通过NFC为设备所有者应用程序进行配送,就像您已经做的那样。

  2. 在Play商店上提供更新版本(相同的软件包名称、相同的签名、更高的版本号)的设备所有者应用程序。

  3. 在您的设备上的Play商店应用程序中,搜索您的应用程序的Play商店版本并安装更新。

  4. 在Play商店中激活设备所有者应用程序的自动更新(在应用程序的Play商店页面上,点击菜单(三个点),并激活自动更新的复选框)。

虽然这需要一些配置工作,但设备应该会自动接收未来的更新。


1
谢谢你的回答。我也想到了同样的事情,但那需要在设备上设置一个Gmail帐户,而我正在避免这样做,因为该应用程序是为KIOSK模式设计的。 - Shubham

1
创建一个服务来检查后台更新。如果有更新,则下载apk文件并将其写入类似sdcard的某个位置。等待几秒钟以完全刷新写入。然后调用以下代码安装您的新apk。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
startActivity(intent);

"

fileName 是您在SD卡上新apk文件的路径。

"

我想要默默地进行这个操作。你的方法无法静默安装apk。这将打开安装界面,还需要在设置中检查“允许来自未知来源的安装”。 - Shubham

0

我偶然发现了这个问题,并想补充一下评论中链接的答案已经得到扩展,只要您的应用程序是设备所有者,就可以静默安装该应用程序:

https://dev59.com/O18d5IYBdhLWcg3wYhaX#37153867

以下是Android 6.0及以上版本中的相关部分: 一旦您的应用程序获取设备所有者权限,我们就可以在没有任何用户干预的情况下进行静默安装、卸载和更新。

public static boolean installPackage(Context context, InputStream in, String packageName) throws IOException {
    PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
        PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    params.setAppPackageName(packageName);
    // set params
    int sessionId = packageInstaller.createSession(params);
    PackageInstaller.Session session = packageInstaller.openSession(sessionId);
    OutputStream out = session.openWrite("COSU", 0, -1);
    byte[] buffer = new byte[65536];
    int c;
    while ((c = in.read(buffer)) != -1) {
        out.write(buffer, 0, c);
    }
    session.fsync(out);
    in.close();
    out.close();

    session.commit(createIntentSender(context, sessionId));
    return true;
}



private static IntentSender createIntentSender(Context context, int sessionId) {
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
             context, sessionId, new Intent(ACTION_INSTALL_COMPLETE), 0);
    return pendingIntent.getIntentSender();
}

卸载:

String appPackage = "com.your.app.package";
Intent intent = new Intent(getActivity(), getActivity().getClass());
PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0);
PackageInstaller mPackageInstaller = getActivity().getPackageManager().getPackageInstaller();
mPackageInstaller.uninstall(appPackage, sender.getIntentSender());

最后但并非不重要的链接: https://github.com/android/platform_frameworks_base/blob/marshmallow-release/services/core/java/com/android/server/pm/PackageInstallerSession.java


0

我猜你可能想成为EMM/MDM合作伙伴应用程序-它类似于设备所有者应用程序,但具有增强的特权和API。通常像三星/HTC这样的OEM会为MDM合作伙伴应用程序提供隐藏的API以升级应用程序。我不确定Android for Work是否也提供此API。

例如:OEM提供了一个名为updatePackage(String packageName)的API,可以由设备上的MDM客户端使用来更新包。您可以使用此API来更新设备所有者应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接