华为应用市场静默安装

avatar
作者
猴君
阅读量:2

最近有个需求,领导要求华为应用市场实现静默安装。反编译华为应用市场后发现只要加个权限就可以实现。

直接上代码,位置在aosp的PermissionManagerService中

frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java

	private void restorePermissionState(@NonNull AndroidPackage pkg, boolean replace,             @Nullable String packageOfInterest, @Nullable PermissionCallback callback) {  		synchronized (mLock) {             ArraySet<String> newImplicitPermissions = new ArraySet<>();              final int N = pkg.getRequestedPermissions().size();             for (int i = 0; i < N; i++) {                                  --- 省略代码 ---                                  final String perm = bp.getName();                 boolean allowedSig = false;                 int grant = GRANT_DENIED;                  // Keep track of app op permissions.                 if (bp.isAppOp()) {                     mSettings.addAppOpPackage(perm, pkg.getPackageName());                 }                  if (bp.isNormal()) {                     // For all apps normal permissions are install time ones.                     grant = GRANT_INSTALL;                 } else if (bp.isRuntime()) {                     if (origPermissions.hasInstallPermission(bp.getName())                             || upgradedActivityRecognitionPermission != null) {                         // Before Q we represented some runtime permissions as install permissions,                         // in Q we cannot do this anymore. Hence upgrade them all.                         grant = GRANT_UPGRADE;                     } else {                         // For modern apps keep runtime permissions unchanged.                         grant = GRANT_RUNTIME;                     }                     if(!origPermissions.hasRequestedPermission(bp.getName())){                         if(ps.isSystem() || SystemProperties.getInt("ro.permission.changed",0) == 1){                             grant = GRANT_INSTALL;                         }                     }                 } else if (bp.isSignature()) {                     // For all apps signature permissions are install time ones.                     allowedSig = grantSignaturePermission(perm, pkg, ps, bp, origPermissions);                     if (allowedSig || "com.huawei.appmarket".equals(pkg.getPackageName())) {                         grant = GRANT_INSTALL;                     }                  }                  if(Manifest.permission.INSTALL_PACKAGES.equals(perm) && bp.isSignature()){                     if(SystemProperties.getInt("persist.byte.os.static.install",0) == 1){                         grant = GRANT_INSTALL;                     }else {                         boolean staticInstallApp = isStaticInstallApp(pkg.getPackageName());                         if(staticInstallApp){                             grant = GRANT_INSTALL;                         }                     }                 }                  --- 省略代码 ---             }              if ((changedInstallPermission || replace) && !ps.areInstallPermissionsFixed() &&                     !ps.isSystem() || ps.getPkgState().isUpdatedSystemApp()) {                 // This is the first that we have heard about this package, so the                 // permissions we have now selected are fixed until explicitly                 // changed.                 ps.setInstallPermissionsFixed(true);             }              updatedUserIds = revokePermissionsNoLongerImplicitLocked(permissionsState, pkg,                     updatedUserIds);             updatedUserIds = setInitialGrantForNewImplicitPermissionsLocked(origPermissions,                     permissionsState, pkg, newImplicitPermissions, updatedUserIds);             updatedUserIds = checkIfLegacyStorageOpsNeedToBeUpdated(pkg, replace, updatedUserIds);         }          // Persist the runtime permissions state for users with changes. If permissions         // were revoked because no app in the shared user declares them we have to         // write synchronously to avoid losing runtime permissions state.         if (callback != null) {             callback.onPermissionUpdated(updatedUserIds, runtimePermissionsRevoked);         }          for (int userId : updatedUserIds) {             notifyRuntimePermissionStateChanged(pkg.getPackageName(), userId);         }     }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!