普通网友 2023-11-05 17:42 采纳率: 0%
浏览 17

android 应用内部 下载安装apk 安装时提示: 恶意安装来源

问题:自己编写了一个android的APP,里面有一个“下载并安装” 其它APP的功能。

操作步骤 :
在华为鸿蒙系统上,下载完对应的APK后(剪映),进行安装时提示,无法继续安装,请问如何解决?

1、已经关闭了:纯净模式

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-05 20:07
    关注

    【相关推荐】



    • 你可以看下这个问题的回答https://ask.csdn.net/questions/736470
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:安卓开发:魅族手机安装apk安装包提示安装失败、更新包不兼容问题的解决方法
    • 您还可以看一下 霍常亮老师的教你30分钟将网站封装成原生态APP课程中的 制作安卓证书,生成APK文件小节, 巩固相关知识点
    • 除此之外, 这篇博客: android 系统中将一个apk应用打入死牢==》禁止在android系统中安装某一个apk应用中的 需求 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      有时候我们在维护开发一个android 系统的时候,不想要我们这个系统去安装某一个公司的apk,只要是已安装,就会安装失败。我们可以这样做:

      在PMS中:

      frameworks / base/services/core/java/com/android/server/pm/PackageManagerService.java
      
       /*
               * Invoke remote method to get package information and install
               * location values. Override install location based on default
               * policy if needed and then create install arguments based
               * on the install location.
               */
              public void handleStartCopy() throws RemoteException {
                  int ret = PackageManager.INSTALL_SUCCEEDED;
      
                  // If we're already staged, we've firmly committed to an install location
                  if (origin.staged) {
                      if (origin.file != null) {
                          installFlags |= PackageManager.INSTALL_INTERNAL;
                          installFlags &= ~PackageManager.INSTALL_EXTERNAL;
                      } else {
                          throw new IllegalStateException("Invalid stage location");
                      }
                  }
      
                  final boolean onSd = (installFlags & PackageManager.INSTALL_EXTERNAL) != 0;
                  final boolean onInt = (installFlags & PackageManager.INSTALL_INTERNAL) != 0;
                  final boolean ephemeral = (installFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
                  PackageInfoLite pkgLite = null;
      
                  if (onInt && onSd) {
                      // Check if both bits are set.
                      Slog.w(TAG, "Conflicting flags specified for installing on both internal and external");
                      ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
                  } else if (onSd && ephemeral) {
                      Slog.w(TAG,  "Conflicting flags specified for installing ephemeral on external");
                      ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
                  } else {
                      pkgLite = mContainerService.getMinimalPackageInfo(origin.resolvedPath, installFlags,
                              packageAbiOverride);
      
                      if (DEBUG_INSTANT && ephemeral) {
                          Slog.v(TAG, "pkgLite for install: " + pkgLite);
                      }
      
                      /*
                       * If we have too little free space, try to free cache
                       * before giving up.
                       */
                      if (!origin.staged && pkgLite.recommendedInstallLocation
                              == PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE) {
                          // TODO: focus freeing disk space on the target device
                          final StorageManager storage = StorageManager.from(mContext);
                          final long lowThreshold = storage.getStorageLowBytes(
                                  Environment.getDataDirectory());
      
                          final long sizeBytes = mContainerService.calculateInstalledSize(
                                  origin.resolvedPath, packageAbiOverride);
      
                          try {
                              mInstaller.freeCache(null, sizeBytes + lowThreshold, 0, 0);
                              pkgLite = mContainerService.getMinimalPackageInfo(origin.resolvedPath,
                                      installFlags, packageAbiOverride);
                          } catch (InstallerException e) {
                              Slog.w(TAG, "Failed to free cache", e);
                          }
      
                          /*
                           * The cache free must have deleted the file we
                           * downloaded to install.
                           *
                           * TODO: fix the "freeCache" call to not delete
                           *       the file we care about.
                           */
                          if (pkgLite.recommendedInstallLocation
                                  == PackageHelper.RECOMMEND_FAILED_INVALID_URI) {
                              pkgLite.recommendedInstallLocation
                                  = PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE;
                          }
                      }
                  }
      			if(条件成立){
      		ret =PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;    //1
      	}
                  if (ret == PackageManager.INSTALL_SUCCEEDED) {
                      int loc = pkgLite.recommendedInstallLocation;
                      if (loc == PackageHelper.RECOMMEND_FAILED_INVALID_LOCATION) {
                          ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
                      } else if (loc == PackageHelper.RECOMMEND_FAILED_ALREADY_EXISTS) {
                          ret = PackageManager.INSTALL_FAILED_ALREADY_EXISTS;
                      } else if (loc == PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE) {
                          ret = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
                      } else if (loc == PackageHelper.RECOMMEND_FAILED_INVALID_APK) {
                          ret = PackageManager.INSTALL_FAILED_INVALID_APK;
                      } else if (loc == PackageHelper.RECOMMEND_FAILED_INVALID_URI) {
                          ret = PackageManager.INSTALL_FAILED_INVALID_URI;
                      } else if (loc == PackageHelper.RECOMMEND_MEDIA_UNAVAILABLE) {
                          ret = PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE;
                      } else {
                          // Override with defaults if needed.
                          loc = installLocationPolicy(pkgLite);
                          if (loc == PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE) {
                              ret = PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE;
                          } else if (!onSd && !onInt) {
                              // Override install location with flags
                              if (loc == PackageHelper.RECOMMEND_INSTALL_EXTERNAL) {
                                  // Set the flag to install on external media.
                                  installFlags |= PackageManager.INSTALL_EXTERNAL;
                                  installFlags &= ~PackageManager.INSTALL_INTERNAL;
                              } else if (loc == PackageHelper.RECOMMEND_INSTALL_EPHEMERAL) {
                                  if (DEBUG_INSTANT) {
                                      Slog.v(TAG, "...setting INSTALL_EPHEMERAL install flag");
                                  }
                                  installFlags |= PackageManager.INSTALL_INSTANT_APP;
                                  installFlags &= ~(PackageManager.INSTALL_EXTERNAL
                                          |PackageManager.INSTALL_INTERNAL);
                              } else {
                                  // Make sure the flag for installing on external
                                  // media is unset
                                  installFlags |= PackageManager.INSTALL_INTERNAL;
                                  installFlags &= ~PackageManager.INSTALL_EXTERNAL;
                              }
                          }
                      }
                  }
      
                  final InstallArgs args = createInstallArgs(this);
                  mArgs = args;
      
                  if (ret == PackageManager.INSTALL_SUCCEEDED) {
                      // TODO: http://b/22976637
                      // Apps installed for "all" users use the device owner to verify the app
                      UserHandle verifierUser = getUser();
                      if (verifierUser == UserHandle.ALL) {
                          verifierUser = UserHandle.SYSTEM;
                      }
      
                      /*
                       * Determine if we have any installed package verifiers. If we
                       * do, then we'll defer to them to verify the packages.
                       */
                      final int requiredUid = mRequiredVerifierPackage == null ? -1
                              : getPackageUid(mRequiredVerifierPackage, MATCH_DEBUG_TRIAGED_MISSING,
                                      verifierUser.getIdentifier());
                      final int installerUid =
                              verificationInfo == null ? -1 : verificationInfo.installerUid;
                      if (!origin.existing && requiredUid != -1
                              && isVerificationEnabled(
                                      verifierUser.getIdentifier(), installFlags, installerUid)) {
                          final Intent verification = new Intent(
                                  Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
                          verification.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
                          verification.setDataAndType(Uri.fromFile(new File(origin.resolvedPath)),
                                  PACKAGE_MIME_TYPE);
                          verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
      
                          // Query all live verifiers based on current user state
                          final List<ResolveInfo> receivers = queryIntentReceiversInternal(verification,
                                  PACKAGE_MIME_TYPE, 0, verifierUser.getIdentifier(),
                                  false /*allowDynamicSplits*/);
      
                          if (DEBUG_VERIFY) {
                              Slog.d(TAG, "Found " + receivers.size() + " verifiers for intent "
                                      + verification.toString() + " with " + pkgLite.verifiers.length
                                      + " optional verifiers");
                          }
      
                          final int verificationId = mPendingVerificationToken++;
      
                          verification.putExtra(PackageManager.EXTRA_VERIFICATION_ID, verificationId);
      
                          verification.putExtra(PackageManager.EXTRA_VERIFICATION_INSTALLER_PACKAGE,
                                  installerPackageName);
      
                          verification.putExtra(PackageManager.EXTRA_VERIFICATION_INSTALL_FLAGS,
                                  installFlags);
      
                          verification.putExtra(PackageManager.EXTRA_VERIFICATION_PACKAGE_NAME,
                                  pkgLite.packageName);
      
                          verification.putExtra(PackageManager.EXTRA_VERIFICATION_VERSION_CODE,
                                  pkgLite.versionCode);
      
                          verification.putExtra(PackageManager.EXTRA_VERIFICATION_LONG_VERSION_CODE,
                                  pkgLite.getLongVersionCode());
      
                          if (verificationInfo != null) {
                              if (verificationInfo.originatingUri != null) {
                                  verification.putExtra(Intent.EXTRA_ORIGINATING_URI,
                                          verificationInfo.originatingUri);
                              }
                              if (verificationInfo.referrer != null) {
                                  verification.putExtra(Intent.EXTRA_REFERRER,
                                          verificationInfo.referrer);
                              }
                              if (verificationInfo.originatingUid >= 0) {
                                  verification.putExtra(Intent.EXTRA_ORIGINATING_UID,
                                          verificationInfo.originatingUid);
                              }
                              if (verificationInfo.installerUid >= 0) {
                                  verification.putExtra(PackageManager.EXTRA_VERIFICATION_INSTALLER_UID,
                                          verificationInfo.installerUid);
                              }
                          }
      
                          final PackageVerificationState verificationState = new PackageVerificationState(
                                  requiredUid, args);
      
                          mPendingVerification.append(verificationId, verificationState);
      
                          final List<ComponentName> sufficientVerifiers = matchVerifiers(pkgLite,
                                  receivers, verificationState);
      
                          DeviceIdleController.LocalService idleController = getDeviceIdleController();
                          final long idleDuration = getVerificationTimeout();
      
                          /*
                           * If any sufficient verifiers were listed in the package
                           * manifest, attempt to ask them.
                           */
                          if (sufficientVerifiers != null) {
                              final int N = sufficientVerifiers.size();
                              if (N == 0) {
                                  Slog.i(TAG, "Additional verifiers required, but none installed.");
                                  ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;
                              } else {
                                  for (int i = 0; i < N; i++) {
                                      final ComponentName verifierComponent = sufficientVerifiers.get(i);
                                      idleController.addPowerSaveTempWhitelistApp(Process.myUid(),
                                              verifierComponent.getPackageName(), idleDuration,
                                              verifierUser.getIdentifier(), false, "package verifier");
      
                                      final Intent sufficientIntent = new Intent(verification);
                                      sufficientIntent.setComponent(verifierComponent);
                                      mContext.sendBroadcastAsUser(sufficientIntent, verifierUser);
                                  }
                              }
                          }
      
                          final ComponentName requiredVerifierComponent = matchComponentForVerifier(
                                  mRequiredVerifierPackage, receivers);
                          if (ret == PackageManager.INSTALL_SUCCEEDED
                                  && mRequiredVerifierPackage != null) {
                              Trace.asyncTraceBegin(
                                      TRACE_TAG_PACKAGE_MANAGER, "verification", verificationId);
                              /*
                               * Send the intent to the required verification agent,
                               * but only start the verification timeout after the
                               * target BroadcastReceivers have run.
                               */
                              verification.setComponent(requiredVerifierComponent);
                              idleController.addPowerSaveTempWhitelistApp(Process.myUid(),
                                      mRequiredVerifierPackage, idleDuration,
                                      verifierUser.getIdentifier(), false, "package verifier");
                              mContext.sendOrderedBroadcastAsUser(verification, verifierUser,
                                      android.Manifest.permission.PACKAGE_VERIFICATION_AGENT,
                                      new BroadcastReceiver() {
                                          @Override
                                          public void onReceive(Context context, Intent intent) {
                                              final Message msg = mHandler
                                                      .obtainMessage(CHECK_PENDING_VERIFICATION);
                                              msg.arg1 = verificationId;
                                              mHandler.sendMessageDelayed(msg, getVerificationTimeout());
                                          }
                                      }, null, 0, null, null);
      
                              /*
                               * We don't want the copy to proceed until verification
                               * succeeds, so null out this field.
                               */
                              mArgs = null;
                          }
                      } else {
                          /*
                           * No package verification is enabled, so immediately start
                           * the remote call to initiate copy using temporary file.
                           */
                          ret = args.copyApk(mContainerService, true);
                      }
                  }
      
                  mRet = ret;
              }
      

      在1处,可以直接根据条件将安装结果置为fail。这样就不会安装成功了。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月5日

悬赏问题

  • ¥300 寻抓云闪付tn组成网页付款链接
  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题