• Android 安装APK、更新apk、隐藏(hide)apk、解除隐藏(unhide)apk 所对应的广播log


    Android版本:Android R(11)

    一、用户安装的apk发生更新

    public void registerReceiver(Context context) {
            Slog.d("PMSdddd", "systemReady1");
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_PACKAGE_ADDED);
            filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
            filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
            filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
            filter.addDataScheme("package");
            BroadcastReceiver packgeMonitorReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    final String action = intent.getAction();
                    final String packageName =
    intent.getData().getSchemeSpecificPart();
                    final boolean replacing =
    intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
                    final boolean dataRemoved =
    intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false);
    
                    Slog.d("PMSdddd", "action: " + action + " packageName:"
    + packageName + "  replacing:" + replacing
                            + "  dataRemoved:" + dataRemoved);
                }
            };
            context.registerReceiver(packgeMonitorReceiver, filter);
        }

    adb install apk

    Line 52701: 02-01 21:26:23.213  1727  1727 D PMSdddd : action: android.intent.action.PACKAGE_ADDED  packageName:com.adobe.reader  replacing:false  dataRemoved:false

    adb shell pm hide apk

    Line 53895: 02-01 21:28:22.043  1727  1727 D PMSdddd : action: android.intent.action.PACKAGE_REMOVED  packageName:com.adobe.reader  replacing:false  dataRemoved:false

    adb install -r apk

    Line 54477: 02-01 21:29:41.550  1727  1727 D PMSdddd : action: android.intent.action.PACKAGE_REMOVED  packageName:com.adobe.reader  replacing:true  dataRemoved:false
    
    
    Line 54512: 02-01 21:29:41.648  1727  1727 D PMSdddd : action: android.intent.action.PACKAGE_ADDED  packageName:com.adobe.reader  replacing:true  dataRemoved:false

     adb shell pm unhide apk

    Line 55640: 02-01 21:32:25.651  1727  1727 D PMSdddd : action: android.intent.action.PACKAGE_ADDED  packageName:com.adobe.reader  replacing:false  dataRemoved:false

    Line 61310: 02-01 21:52:36.395  1727  1727 D PMSdddd : action: android.intent.action.PACKAGE_REMOVED  packageName:com.adobe.reader  replacing:false  dataRemoved:true

    总结:

    • hide命令:系统会发送广播 android.intent.action.PACKAGE_REMOVED,data数据并不会删除
    • unhide命令:系统会发送广播android.intent.action.PACKAGE_ADDED,data数据不会删除
    • 更新apk时:

    系统先发送广播 android.intent.action.PACKAGE_REMOVED,intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) 获取的值为true

    系统随后发送广播android.intent.action.PACKAGE_ADDED,intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) 获取的值也为true

    • 卸载apk时:

     系统发送广播 android.intent.action.PACKAGE_REMOVED,intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false)获取的值为true

    二、系统apk(位于:system/app 目录)发生更新

    adb push apk system/app 

    再恢复出厂设置

    Line 8118: 02-02 02:55:59.428  1130  1130 D PMSdddd : action: android.intent.action.PACKAGE_REMOVED  packageName:com.example.ddd  replacing:true  dataRemoved:false
    
    
    Line 8134: 02-02 02:55:59.501  1130  1130 D PMSdddd : action: android.intent.action.PACKAGE_ADDED  packageName:com.example.ddd  replacing:true  dataRemoved:false
    
    
    Line 8281: 02-02 02:55:59.903  1130  1130 D PMSdddd : action: android.intent.action.PACKAGE_REPLACED  packageName:com.example.ddd  replacing:true  dataRemoved:false

    更新后的apk安装在 data/app目录:

        Line 8550: 02-02 05:12:10.806  1132  1228 I PackageManager: Update system package com.example.ddd code path from /system/operator/app/AndroidDemoV1.0.apk to /data/app/~~IYd549AfrGeHUc-lWfY8kg==/com.example.ddd-o9yTi7O1l3Cm3EhqTvf2Rw==; Retain data and using new
        Line 8550: 02-02 05:12:10.806  1132  1228 I PackageManager: Update system package com.example.ddd code path from /system/operator/app/AndroidDemoV1.0.apk to /data/app/~~IYd549AfrGeHUc-lWfY8kg==/com.example.ddd-o9yTi7O1l3Cm3EhqTvf2Rw==; Retain data and using new
        Line 8551: 02-02 05:12:10.808  1132  1228 I PackageManager: Update system package com.example.ddd resource path from /system/operator/app/AndroidDemoV1.0.apk to /data/app/~~IYd549AfrGeHUc-lWfY8kg==/com.example.ddd-o9yTi7O1l3Cm3EhqTvf2Rw==; Retain data and using new
        Line 8551: 02-02 05:12:10.808  1132  1228 I PackageManager: Update system package com.example.ddd resource path from /system/operator/app/AndroidDemoV1.0.apk to /data/app/~~IYd549AfrGeHUc-lWfY8kg==/com.example.ddd-o9yTi7O1l3Cm3EhqTvf2Rw==; Retain data and using new

    总结:

    系统apk发生更新时,系统依次发送广播:action: android.intent.action.PACKAGE_REMOVED、action: android.intent.action.PACKAGE_ADDED、action: android.intent.action.PACKAGE_REPLACED

    且 intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) 获取的值为true


    Android 监听多用户切换,隐藏和禁用指定Apk

    IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_USER_SWITCHED);
            filter.addAction(Intent.ACTION_USER_ADDED);
            BroadcastReceiver mUserSwitchedReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    final String action = intent.getAction();
                    final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
                    if (userId == UserHandle.USER_NULL) {
                        Slog.e("PMSdddd", "received an invalid EXTRA_USER_HANDLE");
                        return;
                    }
                    if (Intent.ACTION_USER_SWITCHED.equals(action) && userId > 0) {
                        Slog.d("PMSdddd", "User switched to userId " + userId);
                        AsyncTask.execute(new Runnable() {
                            @Override
                            public void run() {
                                Slog.d("PMSdddd", "install start11");
                                Sbbbbbbbbbbb.hideOtherBrandAppWhenUserSwitched();
                            }
                        });
                    } else if (Intent.ACTION_USER_ADDED.equals(action) && userId > 0) {
                        Slog.d("PMSdddd", "Added User  userId " + userId);
                        AsyncTask.execute(new Runnable() {
                            @Override
                            public void run() {
                                Slog.d("PMSdddd", "install start11");
    Sbbbbbbbbbbb
    .hideOtherBrandAppWhenUserSwitched(); } }); } } }; mContext.registerReceiver(mUserSwitchedReceiver, filter);

    是否隐藏和禁用apk

    /**
         * only hide app but don't delete user data
         *
         * @param pkgName
         */
        private void hide(String pkgName) {
            final PackageManager pm = mContext.getPackageManager();
            int userId = ActivityManager.getCurrentUser();
            pm.setApplicationHiddenSettingAsUser(pkgName, true, new UserHandle(userId));
            disableApplication(pkgName);
        }
    
        private void unhide(String pkgName) {
            final PackageManager pm = mContext.getPackageManager();
            int userId = ActivityManager.getCurrentUser();
            pm.setApplicationHiddenSettingAsUser(pkgName, false, new UserHandle(userId));
            enableApplication(pkgName);
        }
    
        private void disableApplication(String pkgName) {
            final PackageManager pm = mContext.getPackageManager();
            try {
                int state = pm.getApplicationEnabledSetting(pkgName);
                Slog.d(TAG, "disableApplication state: " + state + " pkgName:" + pkgName);
                if (state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED)
                    return;
                pm.setApplicationEnabledSetting(pkgName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
            } catch (IllegalArgumentException exeption) {
                Slog.w(TAG, "disableApplication error:" + exeption.getMessage());
            }
        }
    
        private void enableApplication(String pkgName) {
            final PackageManager pm = mContext.getPackageManager();
            try {
                int state = pm.getApplicationEnabledSetting(pkgName);
                Slog.d(TAG, "enableApplication state: " + state + " pkgName:" + pkgName);
                if (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED)
                    return;
                pm.setApplicationEnabledSetting(pkgName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
            } catch (IllegalArgumentException exeption) {
                Slog.w(TAG, "enableApplication error:" + exeption.getMessage());
            }
        }


    隐藏的apk或disable的apk,信息保存在 /data/system/users/0/package-restrictions.xml 文件内

    <pkg name="com.google.android.apps.maps" ceDataInode="4439" enabled="3" enabledCaller="com.android.settings" domainVerificationStatus="2" app-link-generation="4">
    
    <pkg name="com.google.android.apps.maps" ceDataInode="4439" enabled="2" enabledCaller="android" domainVerificationStatus="2" app-link-generation="4">
    <pkg name="com.amazon.appmanager" ceDataInode="4472" hidden="true" enabled="2" enabledCaller="android" />

    <pkg name="com.google.android.apps.maps" ceDataInode="4439" enabled="3" enabledCaller="com.android.settings" domainVerificationStatus="2" app-link-generation="4">

    apk被hide后,保存的信息:hidden="true"

    apk被disable后,根据 setApplicationEnabledSetting 传入的常量参数不同,enabled= 的值就会不同,如下介绍:

    public static final int COMPONENT_ENABLED_STATE_DISABLED = 2;  // disable应用时,若传入此参数,则应用在桌面没有图标,且在设置界面、应用程序列表里面也没有图标 (应用完全隐藏了)

    public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // disable应用时,若传入此参数,则应用在桌面没有图标,但是在设置界面、应用程序列表里面有图标 (只是桌面图标隐藏了,设置里面仍可以看到图标,用户可以再次enable此应用)

    另外:adb shell pm disable-user  应用包名: 相当于传入的参数是 COMPONENT_ENABLED_STATE_DISABLED。

  • 相关阅读:
    OI 知识总览 算法篇 之 动态规划
    LeetCode 16.3Sum Closest
    LeetCode 1.Two sum
    leetCode 15. 3Sum
    leetCode 54. Spiral Matrix
    mybatis(视频)
    mybatis
    spring笔记
    Spring(一)
    Spring(二)
  • 原文地址:https://www.cnblogs.com/onelikeone/p/14359237.html
Copyright © 2020-2023  润新知