android-使用设备策略控制器在后台升级应用

android-使用设备策略控制器在后台升级应用,第1张

概述我有一个工作正常的DPC应用程序,它是设备所有者.我已经在两个不同的Android6.0.1设备上进行了尝试,以排除任何设备/制造商问题.我使用了adbshelldpmset-device-ownercom.example.dpc/.DpcDeviceAdminReceiver来使我的DPC应用成为所有者.成为所有者后,它可以正确地将COSU权

我有一个工作正常的DPC应用程序,它是设备所有者.我已经在两个不同的Android 6.0.1设备上进行了尝试,以排除任何设备/制造商问题.

我使用了adb shell dpm set-device-owner com.example.dpc / .DpcDeviceadminReceiver来使我的DPC应用成为所有者.成为所有者后,它可以正确地将COSU权限授予另一个应用程序,这使我确信这已经起作用.该命令返回了响应:

Success: Device owner set to package com.example.dpcActive admin set to component {com.examplem.dpc/com.example.dpc.DpcDeviceadminReceiver}

我想使用此应用程序来安装和升级另一个应用程序,而无需用户干预(就像Google Play一样).

我正在使用以下概念验证代码:

voID upgrade() {    String apkfile@R_419_6889@ = "app_deBUG_2_0_0";    PackageManager packagemanger = getPackageManager();    PackageInstaller packageInstaller = packagemanger.getPackageInstaller();    PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(            PackageInstaller.SessionParams.MODE_FulL_INSTALL);    params.setAppPackage@R_419_6889@("com.example.dummy");    try {        Log.e(TAG, "apkfile@R_419_6889@ " + apkfile@R_419_6889@);        inputStream ins = getResources().openRawResource(                getResources().getIDentifIEr(apkfile@R_419_6889@,                        "raw", getPackage@R_419_6889@()));        int sessionID = packageInstaller.createSession(params);        PackageInstaller.Session session = packageInstaller.openSession(sessionID);        OutputStream out = session.openWrite(apkfile@R_419_6889@, 0, -1);        final int bufsize = 4096;        byte[] bytes = new byte[bufsize];        int len = 1; // any value > 0        int tot = 0;        while (len > 0) {            len = ins.read(bytes, 0, bufsize);            Log.d(TAG, "len: " + len);            if (len < 1) break;            out.write(bytes, 0, len);            tot += len;            Log.d(TAG, "copIEd: " + tot);        }        ins.close();        session.fsync(out);        out.close();        Log.e(TAG, "about to commit ");        session.commit(PendingIntent.getbroadcast(this, sessionID,                new Intent("com.example.dpc.intent.UPDATE"), 0).getIntentSender());        Log.e(TAG, "committed ");    } catch (IOException e) {        Log.e(TAG, "Error installing package " + apkfile@R_419_6889@, e);    }}

使用上面的代码和变体,我收到一个com.example.dpc.intent.UPDATE意图,其中包含错误:

Intent {     act=com.example.dpc.intent.UPDATE     flg=0x10     cmp=com.example.dpc/.DpcUpdateReceiver     bqHint=4     (has extras) }Bundle[    androID.content.pm.extra.STATUS=4,     androID.content.pm.extra.PACKAGE_@R_419_6889@=com.example.dummy,    androID.content.pm.extra.SESSION_ID=1055214117,     androID.content.pm.extra.LEGACY_STATUS=-15,     androID.content.pm.extra.STATUS_MESSAGE=INSTALL_Failed_TEST_ONLY: installPackageli]

Logcat正确报告正在流式传输到session.openWrite流中的apk的大小.

我已经看过了:

> gradle版本-我正在使用AndroID Studio和Gradle v3.0.0,而不是不稳定版本.
>从res / raw apk文件复制的字节数:1418604是正确的.
>清单-没有testOnly属性. https://developer.android.com/guide/topics/manifest/application-element.html#testOnly

我究竟做错了什么?

解决方法:

错误是来自frameworks / base / services / core / java / com / androID / server / pm / PackageManagerService.java中的以下AndroID 6.0.1代码造成的.

if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_TEST_ONLY) != 0) {    if ((installFlags & PackageManager.INSTALL_ALLOW_TEST) == 0) {        res.setError(INSTALL_Failed_TEST_ONLY, "installPackageli");        return;    }}

我检查了要安装的应用程序,发现已设置FLAG_TEST_ONLY位. Why is Android Studio 3.0.0 setting FLAG_TEST_ONLY on APKs?

总结

以上是内存溢出为你收集整理的android-使用设备策略控制器后台升级应用全部内容,希望文章能够帮你解决android-使用设备策略控制器在后台升级应用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1095280.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存