【PKMS】- Settings中应用详情页卸载还原系统应用但数据未清除

2023-11-13

【PKMS】Settings中应用详情页卸载还原系统应用但数据未清除

一、问题描述

最近工作中出现一个问题,系统应用卸载后重装还原发现应用数据还在;
复现操作:
1.系统预置该应用在system/priv-app下,手机里预置的是旧版本的该应用;
2.应用开发同事编了一个新版本的该应用 ,adb install -r该新应用,然后使用该应用添加多条数据;
3.在settings->应用管理->找到该应用进入应用详情;
4.点击actionbar右上角菜单进行卸载还原操作(这里只有重新安装该系统应用之后才会出现这个菜单按钮);
卸载之后系统会重新安装原来系统预置的该应用的版本,即扫描system/priv-app文件夹下安装预置版本的该应用;
预期:该应用还原成出厂版本,且数据清空;
实际:该应用还原成出厂版本,但是之前添加的数据依然还在;

二、问题分析

1. settings中卸载应用的方法

a. 查询settings中调用卸载操作是发出卸载广播:

   // 创建一个新的Intent调起Uninstaller activity去卸载,传入包名,是否卸载所有user
   Uri packageURI = Uri.parse("package:"+packageName);
   Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
   uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers);
   startActivityForResult(uninstallIntent, REQUEST_UNINSTALL);

b. 发出卸载应用包的广播会被packageinstaller接收处理:

/packages/apps/PackageInstaller/src/com/android/packageinstaller/wear/WearPackageInstallerService.java
private void uninstallPackage(Bundle argsBundle) {
        int startId = WearPackageArgs.getStartId(argsBundle);
        final String packageName = WearPackageArgs.getPackageName(argsBundle);
        final PackageManager pm = getPackageManager();
        PowerManager.WakeLock lock = getLock(this.getApplicationContext());
        pm.deletePackage(packageName, new PackageDeleteObserver(lock, startId),
                PackageManager.DELETE_ALL_USERS);
        startPermsServiceForUninstall(packageName);
        Log.i(TAG, "Sent delete request for " + packageName);
    }

c. 即调到PKMS里的公共接口:

public void deletePackage(final String packageName,
           final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
}

PMS中的deletePackageAsUser接口同样最终调用deletePackage()接口:

 @Override
public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int userId,int flags) {
        deletePackage(packageName, new LegacyPackageDeleteObserver(observer).getBinder(), userId,
                flags);
}

2. PackageManagerService卸载系统应用

基于Android 7.1.1源码
客户端调用PackageManagerService的卸载apk的接口:
这里写图片描述
分析:
1. 可以看到PKMS接口函数是提供deleteflag的参数的,在这里可以设置卸载的flag值,flag值定义在frameworks\base\core\java\android\content\pm\PackageManager.java中;
2. 卸载系统应用和非系统引用走的不同分支;
3. 关键在这里,如果卸载的系统应用versioncode比出厂版本的versioncode高的话,这个时候需要清掉数据,将设置flag添加~DELETE_KEEP_DATA标志;也就是说在就算接口函数里设置了DELETE_KEEP_DATA,在对系统应用的卸载会在这里跟据versioncode再重新设置这个flag;
4. 系统应用卸载后需要重新安装该应用的原始版本;
5. 在这里判断flag,是否需要清掉数据;

3. 使用Android studio查看apk的versioncode

应用的version code是在AndroidManifest.xml中定义,将手机里的原始版本apk,pull出来和开发给的新编的应用apk,拖到android studio中查看两者的Androidmanifest.xml
结果发现两者的versioncode都是1
这里写图片描述

也就是说,虽然app开发给的是新版本的apk,但是versioncode依然是1和原始出厂版本是一样的,因此,在卸载时判断非降级因此没有清除应用数据。

三、总结

让该app开发者把version设置为2之后编个新apk在进行如上操作,结果验证ok,降级还原系统应用会清除应用使用数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【PKMS】- Settings中应用详情页卸载还原系统应用但数据未清除 的相关文章

  • 开发前期准备工作

    开发前期准备工作 文章目录 开发前期准备工作 0 代码规范 0 1 强制 0 2 推荐 0 3 参考 dao 跟数据库打交道 service 业务层 人类思维解决 controller 抽象化 0 4 注释规范 0 5 日志规范 0 6 专
  • 欧姆龙NJ1P2 Fins Udp通讯

    NJ1P2 Tcp连接不成功 咨询客服说不支持Fins Tcp 所以改成Udp方式 Udp连接 locateIp IPAddress Parse txtLocateIP Text locatePoint new IPEndPoint loc
  • 使用CMakeList编译报错

    可能出现的一个原因是磁盘空间不足 使用 df h 查看磁盘空间 若磁盘空间已满 清理磁盘 然后再进行编译
  • Gradle project sync failed. Please fix your project and try again.

    在Android Studio中Import Module后 再运行项目 报下列错误 Gradle project sync failed Please fix your project and try again 这是由于build gr
  • node.js学习

    一 基础知识 1 终端 shell命令 dir 列出当前目录下所有路径 表示当前目录 表示上一级目录 md 目录名 新建文件 rd 目录名 删除文件 文件名 直接打开文件 2 环境变量 windows系统中的变量 配置path 当在命令行窗
  • 数字图像处理之二维码图像提取算法(十一)

    check ratio requirement b w b w b 1 1 3 1 1 bool qr checkRatio totalFinderSize 0 for int i 0 i lt 5 i int count stateCou
  • vue项目PC端屏幕分辨率与窗口大小自适应

    效果 mermaid svg O0n9N0Pq5xuLBK3e label font family trebuchet ms verdana arial font family var mermaid font family fill 33
  • java求数组中,某个值连续出现次数最多的数的次数

    这次遇到的问题是 要在一个数组中找到连续出现次数最多的数的次数 下面的数组 我想拿到0的连续出现次数最多的次数 连续出现3次 第一次0连续出现一次 第二次连续出现2次 第三次连续出现6次 我要拿到6次这个东西 int s 0 1 0 0 1
  • 信息物理系统(CPS)之吾之愚见

    信息物理系统 CPS 是这两年比较热门的研究方向 下面我就从定义 结构等2个方面浅谈一下 如有错误之处请多指教 信息物理系统是集成计算 通信与控制于一体的下一代智能系统 通过人机交互接口实现和物理进程的交互 使用网络化空间以远程的 可靠的
  • 利用python处理excel

    本宝宝有个工作中 需要报送个人所得税 其实以前我写过一个集成报送各年金税金vba的小代码 但是因为新接的任务数据量太大 vba可能会假死 即使能处理 也因为最近在自学python 所以想尝试用python 我的思路是 把报税模板复制出来 然
  • verilog中已知系统时钟频率和波特率可知传输一位数据所需周期和边沿检测电路

    设时钟频率为 clk 50MHZ 50 000 000 HZ 波特率为 bound 115200 位 秒 每秒可以传输115200位数据 传输一位数据所需周期数为 T cnt clk bound 50 000 000 115200 其中选择
  • 究竟深度学习在干什么?

    来源 人机与认知实验室 概要 深度学习取得了巨大的成功 这是无容置疑的 对此 我们不必再多说什么 但是 其理论基础仍然有很大的空白 深度学习取得了巨大的成功 这是无容置疑的 对此 我们不必再多说什么 但是 其理论基础仍然有很大的空白 例如
  • 10 种常用的字符串方法

    10 种常用的字符串方法 1 concat 字符串拼接 const str1 12345678 const str2 abcdefgh const str3 console log str1 concat str2 str3 1234567
  • Linux下TCP通信在两个虚拟机上连接失败,使用回环地址正常

    Linux下TCP通信在两个虚拟机上连接失败 情况描述 在一台虚拟机上使用回环地址 127 0 0 1 时一切正常 当部署到两台虚拟机 局域网下同网段 上时出现连接失败的情况 解决办法 首先使用命令nc z v
  • TCP客户端与服务端建立以及测试——缇友的python学习笔记

    一 客户端创建以及测试 书写代码 import socket if name main tcp test socket socket socket socket AF INET socket SOCK STREAM 创建tcp套接字 AF
  • 肠道细菌四大“门派”——拟杆菌门,厚壁菌门,变形菌门,放线菌门

    一般在肠道菌群健康检测报告中 会有主要菌属构成比例 类似下图 图源 谷禾肠道菌群健康检测报告我们可以看到图中列举了拟杆菌门 厚壁菌门 等 很多小伙伴拿到报告之后 对于这些细菌门表示困惑 这些细菌门都代表了什么意思 某个细菌门比例高了会怎么样
  • 微信小程序调用腾讯地图,获取当前位置得到数据有偏差以及不同软件,不同坐标之间的转换Gcoord

    前言 在微信小程序中调用腾讯本家地图后 发现有偏差 而且距离还不小 在找了很多资料后 发现网上的资料很多都是挂羊头卖狗肉 都是坐标轴之间的互转 比如腾讯的坐标和百度坐标之间的转换 还起的名字是解决小程序的偏移问题 被误导了很久 也找了很多资
  • JAVA入门到精通:Path环境变量

    一 环境变量的定义 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数比如临时文件夹位置和系统文件夹位置等 这点有点类似于DOS时期的默认路径当你运行某些程序时除了在当前文件夹中寻找外还会到设置的默认路径中去查找 简单地说这里的
  • wx.login 和 wx.getUserProfile 同时使用问题

    在开发微信小程序时 会先调用wx login 获取 code 以后 调用 wx getUserProfile 获取rawData signature encryptedData iv等信息 到后台进行处理 但是随着4月28日24时后发布的新

随机推荐

  • SprinBoot项目启动报错Exception in thread "main" java.lang.reflect.InvocationTargetException

    错误代码 lottery api start SLF4J Class path contains multiple SLF4J bindings SLF4J Found binding in jar file data javaprogra
  • Linux多线程并发运行原理+代码例程详解

    文章目录 线程创建和退出 原理 代码 结果 线程属性修改 原理 代码 结果 互斥锁 原理 代码 结果 信号量线程控制原理 使用信号量线程互斥 代码 结果 使用信号量线程同步 代码 结果 小结分析 生产者消费者 实验 问题分析 代码 结果分析
  • 不可重复读和可重复读的理解

    image png 1 不可重复读 同一个事务中 id 10行 字段c1 第一次查询 c1 0 id 10行 字段c1 第二次查询 c1 1 因为在第二次查询 另外一个事务修改了c1 1 且事务提交 2 可重复读 同一个事务中 id 10行
  • iOS编程基础-OC(九)-专家级技巧:使用运行时系统API(续)

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第九章 专家级技巧 使用运行时系统API 9 2 使用运行时系统API 接下来仍然是编写一段程序 该程序会使用运行时系统API以动态的方式创建一个类和一个类实例 然后
  • ES7基础篇-04-索引映射操作(_mappering)

    文章目录 1 简介 2 索引库和索引映射一起创建 3 索引库和索引映射分开创建 4 字段映射解释 5 查看映射关系 6 映射属性详解 1 简介 有了索引库 等于有了数据库中的database 接下来就需要索引库中的类型了 也就是数据库中的表
  • 同步复位、异步复位、亚稳态、建立时间、保持时间、恢复时间、清除时间

    同步 异步复位的概念是重要的基础内容 需对其有较清晰的认识 才能在复位电路的设计时得心应手 本文基于前辈分享 结合自己的理解 浅谈亚稳态 复位电路等相关内容 首先需要明确的是 同步 异步名词背后的两个对象是谁 谁和谁同 谁和谁异 复位的目标
  • java自动化测试之开发工具eclipse安装配置

    java自动化测试之开发工具eclipse安装配置 一 eclipse下载 下载地址 http www eclipse org downloads http www eclipse org downloads 打开连接后 显示如下 选择Ec
  • 单片机期末复习

    一 填空题 1 最小系统能够运行起来的必要条件 单片机的最小系统包含 电源电路 晶振电路 复位电路 单片机最小系统供电正常 提拱能量 单片机芯片工作正常 单片机最小系统各元器件连接电路无误 单片机片外晶振 谐振电容正常 单片机复位电路正常
  • 4.3 AI识虫比赛

    文章目录 一 查看环境并准备数据 二 启动训练 三 启动评估 计算精度指标 四 预测单张图片并可视化预测结果 五 提升方案 一 查看环境并准备数据 查看当前挂载的数据集目录 该目录下的变更重启环境后会自动还原 ls home aistudi
  • import cv2

    windows下 环境 Python 3 8 5 可以通过一下指令查看 python version 遇到的坑 1 在程序中 import cv2 无报错 但运行程序没有效果 直接程序退出 直到注释掉该句导入 程序才正常测试 直接在命令行中
  • Java版的数据结构——栈和队列

    目录 1 栈 Stack 1 1 概念 1 2 栈的使用 1 3 栈的模拟实现 1 4 栈的应用场景 1 4 1 改变元素的序列 1 4 2 将递归转化为循环 2 队列 Queue 2 1 概念 2 2 队列的使用 2 3 队列模拟实现 2
  • 4G 网络跟 5G 的区别

    1 5G网络的速度据说保守可以达到4G的10 20倍 下载一些大型文件 例如电影 大型电脑游戏 将会是分分钟的事 2 5G网络将会率先使用云RAN和虚拟RAN这样的新架构 以促进一个更加中心化网络的建立 并通过身处网络边缘的本地化数据中心来
  • 微信小程序 getUserProfile直接进入fail函数,getUserProfile调用失败:fail desc length does not meet the requirements

    问题描述 我刚开始的getUserProfile的desc是这么写的 wx getUserProfile desc 获取你的昵称 头像 地区及性别用于信息注册 success res gt console log res console l
  • c语言中函数的声明和定义

    点击上方蓝字关注我 了解更多咨询 1 函数声明 无需实现该函数的功能 函数声明只是一个空壳 不会有特定的函数实现 2 函数定义 必须实现该函数的功能 要实现函数的实现 include
  • 动作/行为识别调研

    动作识别调研 1 简介 1 1 基本概念 1 2 难点 2 人体动作识别系统 2 1 传统方法 2 1 1 iDT框架 2 2 深度学习方法 2 2 1 Two Stream双流架构 2 2 2 3D卷积架构 2 2 3 CNN LSTM架
  • 【C++】匿名对象

    文章目录 一 基本概念 二 使用场景 三 注意事项 一 基本概念 匿名对象 也叫作临时对象 就是创建时不用取名的对象 它的生命周期只有一行 例子 class A int main 创建匿名对象 A 生命周期只有这一行 下一行就自动调用析构函
  • 如何在 seaborn 中创建三角相关热图?

    在本教程中 我们将学习在 seaborn 中创建三角形相关热图 顾名思义 相关性是一种度量 用于显示变量的相关程度 相关热图是一种表示数值变量之间关系的图 这些图用于了解哪些变量彼此相关以及它们之间的关系强度 而热图是使用不同颜色的数据的二
  • css text-shadow

  • 喜讯

    日前 华院计算因其在AIGC领域的技术突破和创新成果入选数据猿 2023中国AIGC领域最具商业合作价值企业盘点 基于其数智人产品及解决方案 为不同细分场景 行业 领域提供交互式智能终端 虚拟直播平台和智能视频生成平台等产品及服务 凭借其在
  • 【PKMS】- Settings中应用详情页卸载还原系统应用但数据未清除

    PKMS Settings中应用详情页卸载还原系统应用但数据未清除 一 问题描述 最近工作中出现一个问题 系统应用卸载后重装还原发现应用数据还在 复现操作 1 系统预置该应用在system priv app下 手机里预置的是旧版本的该应用