版本信息:
Android 4.4.2

一、与AppOpsService因缘

自己整了个系统服务,然后在系统服务中通过Settings设置属性值、读写系统数据库:

private boolean setStaticIpInfo(int index, String value) {boolean ret = false;try {ret = System.putString(mContext.getContentResolver(), mSettingNames[index], value);return true;} catch (Exception e) {e.printStackTrace();ret = false;}return ret;
}

结果,老给报错误:

Package android does not belong to 10023

对应错误出处:

AppOpsManager.java (frameworks\base\core\java\android\app)
public void checkPackage(int uid, String packageName) {try {if (mService.checkPackage(uid, packageName) != MODE_ALLOWED) {throw new SecurityException("Package " + packageName + " does not belong to " + uid);}}
}
Bad call: specified package android under uid 10023 but it is really 1000

对应错误出处:

AppOpsService.java (frameworks\base\services\java\com\android\server)
private Ops getOpsLocked(int uid, String packageName, boolean edit) {if (pkgUid != uid) {// Oops!  The package name is not valid for the uid they are calling// under.  Abort.Slog.w(TAG, "Bad call: specified package " + packageName+ " under uid " + uid + " but it is really " + pkgUid);return null;}
}

二、为什么报这些错误

AppOpsService是一个系统服务,从版本4..4.2(Added in API level 19)之后引进(据说),用来对系统权限进行检测,以运行/禁止某种操作。
“AppOpsManager是一个访问AppOpsService服务的类,同时有 Java 和 C 的实现,为了应对某些 native code 的服务,比如说 Camera。”
要想使用AppOpsService功能,就需要在权限检测的地方添加这部分代码,比如:
对于以上的错误,Settings在put数据之前,就添加了AppOpsService功能:

SettingsProvider.java (frameworks\base\packages\settingsprovider\src\com\android\providers\settings)
@Override
public Bundle call(String method, String request, Bundle args) {// Framework can't do automatic permission checking for calls, so we need// to do it here.if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.WRITE_SETTINGS)!= PackageManager.PERMISSION_GRANTED) {throw new SecurityException(String.format("Permission denial: writing to settings requires %1$s",android.Manifest.permission.WRITE_SETTINGS));}// Also need to take care of app op.if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SETTINGS, Binder.getCallingUid(),getCallingPackage()) != AppOpsManager.MODE_ALLOWED) {return null;}final ContentValues values = new ContentValues();values.put(Settings.NameValueTable.NAME, request);values.put(Settings.NameValueTable.VALUE, newValue);
}

可知,在更改数据前,先进行常规的WRITE_SETTINGS检查,然后利用AppOpsService进行进一步检查。

三、问题解决

由于特殊情况,直接把AppOpsService服务注释掉了。
但是,对于API版本6.0(API level 23)及以上,可以参考:
https://developer.android.com/reference/android/provider/Settings.System.html#canWrite%28android.content.Context%2

Android AppOpsService服务实践贴相关推荐

  1. 微软云平台媒体服务实践系列 2- 使用动态封装为iOS, Android , Windows 等多平台提供视频点播(VoD)方案...

    文章微软云平台媒体服务实践系列 1- 使用静态封装为iOS, Android 设备实现点播(VoD)方案  介绍了如何针对少数iOS, Android 客户端的场景,出于节约成本的目的使用媒体服务的静 ...

  2. Android软件安全开发实践(下)

    Android软件安全开发实践(下) Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网 ...

  3. android 首页接口设计方案,Android开发最佳实践——1.接口设计

    Android开发最佳实践--1.接口设计 一个项目刚开始的时候,最需要确认的就是接口设计了:数据如何传递,使用什么格式什么协议乃至如何保证安全性.如果一个项目的接口设计不合理--比如没有考虑到安全性 ...

  4. 51信用卡 Android 架构演进实践

    本文首发于51NB技术公众号,原文链接 51信用卡Android架构演进实践 随着业务的快速扩张,原本小作坊式的单个工程的开发模式越来与不能满足实际需求.早在两年多以前,51信用卡管家就向下沉淀出了单 ...

  5. [教程] Android PHP 最佳实践视频教程

    这几个月实在太忙了,一直没有时间关顾博客,不过好在日前花费了不少心血的视频教程<Android+PHP最佳实践>已经在华章教育和China-Pub上线了,在这里给大家简短的推荐一下吧:本系 ...

  6. 58 同城 Android 端 HTTPS 实践之旅

    自 WWDC 2016 苹果传递出从 2017 年 1 月起强制启用应用程序安全传输协议(App Transport Security)的信号,各大厂均开始了 HTTPS 化的征程.虽然目前苹果将此计 ...

  7. Android软件安全开发实践(上)

    文/肖梓航 Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三 ...

  8. 微服务实践之通信(OpenFeign)详解-SpringCloud(2021.0.x)-6

    [版权申明] 非商业目的注明出处可自由转载 出自:shusheng007 首发于:shusheng007.top 文章目录 概述 OpenFeign简介 基本使用 新建provider与consume ...

  9. Android AR开发实践之一:AR介绍

    Android AR开发实践之一:AR介绍 一.什么是AR 二.AR的发展历程 三.AR的应用场景 四.AR技术面临的主要问题 五.AR平台简介 一.什么是AR AR(Augmented Realit ...

最新文章

  1. 常见的shell实例
  2. 【小白的CFD之旅】13 敲门实例【续3】
  3. JNDI 笔记(一) 概述
  4. Java知识点:条件编译
  5. 145. 超市【小根堆 贪心】
  6. 【转】知道这20个正则表达式,能让你少写1,000行代码
  7. Eclipse 如何修改默认工作空间和切换工作空间(Workspace)
  8. [css] 清除浮动的方式有哪些及优缺点?
  9. SQL 死锁分析(转贴)
  10. python怎么退出全屏_wxPython:退出全屏
  11. node-webkit中使用sqlite3(MAC平台)
  12. 华为数通部门软开9.16凉经
  13. office365彻底卸载教程
  14. 如何隐藏Android模拟器的虚拟按键
  15. Elastic:配置 Elasticsearch 服务器 logs
  16. Silverlight教程第五部分:用 ListBox 和 DataBinding 显示列表数据 (木野狐译)
  17. PTA 天梯赛L1 7-3 跳一跳 (15 分) C语言AC题解【仅供分享】
  18. 如何用ChatGPT做会议总结?
  19. robocode调试技巧
  20. 透镜畸变和畸变校准(OpenCV)

热门文章

  1. 【一分钱做公益】宝鸡上善公益为首批支付宝公益消费捐爱心商户集中授牌
  2. 暗组工具箱 荐!!!
  3. AP微积分与其跟着学校倒不如先跟着林老师学一一遍----美高学生如何说
  4. 从0到1,如何从知乎赚到第一笔佣金
  5. SharePoint 2010中Event 10016错误
  6. linux qt 俄罗斯方块,Qt5之QGraphicsItem编写Tetris俄罗斯方块游戏
  7. Windows Service 2012 IIS Microsoft excel Application
  8. 今天给大家介绍下APPS品牌相关网络变压器
  9. 上课点名app Android,Android开发高校点名签到app之启动页(1)
  10. WebGL简易教程(十四):阴影