华为应用市场静默安装

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

直接上代码,位置在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);
        }
    }
相关推荐
云博客-资源宝3 小时前
Android Manifest 权限描述大全
android·开发语言·php
xzkyd outpaper3 小时前
Android DataBinding 与 MVVM
android·计算机八股
zzq19964 小时前
Android 14.0 framework默认将三按钮的导航栏修改为手势导航。
android
我睡醒再说4 小时前
HarmonyOS5 音乐播放器app(一):歌曲展示与收藏功能(附代码)
华为·信息可视化·harmonyos·arkts·应用开发
ii_best4 小时前
[按键精灵安卓/ios脚本插件开发] 遍历获取LuaAuxLib函数库命令辅助工具
android·ios
GeniuswongAir4 小时前
准备开始适配高德Flutter的鸿蒙版了
华为·harmonyos
峥嵘life5 小时前
Android Java语言转Kotlin语言学习指导实用攻略
android·java·kotlin
安 当 加 密6 小时前
通过Radius认证服务器实现飞塔/华为防火墙二次认证:原理、实践与安全价值解析
服务器·安全·华为
Listennnn6 小时前
HarmonyOS 6 + 盘古大模型5.5
华为·harmonyos
bubiyoushang8886 小时前
Kotlin中快速实现MVI架构
android·开发语言·kotlin