Android 13 sysprop_library新增属性

前提

我们在androidP及之前的版本,平台侧及应用层开发习惯于通过调用(或者反射)SystemProperties系统API的方式进行系统属性的读写。Android R以后,平台侧代码采用了一种将系统属性封装成类方法的形式供开发者调用。

Android R以前读写属性

1:mk文件或者system.prop文件新增属性
mk文件:
PRODUCT_PROPERTY_OVERRIDES += persist.vendor.usb.config=adb
*.prop文件
persist.vendor.usb.config=true
2:给属性配置上下文
persist.vendor.usb.config u:object_r:usb_prop:s0
3:通过SystemProperties进行读写
SystemProperties.set("persist.vendor.usb.config", "adb,mtp");
String value = SystemProperties.get("persist.vendor.usb.config");

Android R以后读写属性:

例如TelephonyManager.java为例,读写属性:gsm.sim.operator.iso-country

1:设置sim卡国家码
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public void setSimCountryIsoForPhone(int phoneId, String iso) {if (SubscriptionManager.isValidPhoneId(phoneId)) {List<String> newList = updateTelephonyProperty(TelephonyProperties.icc_operator_iso_country(), phoneId, iso);TelephonyProperties.icc_operator_iso_country(newList);}
}
2:读取国家码
@UnsupportedAppUsage
public static String getSimCountryIsoForPhone(int phoneId) {return getTelephonyProperty(phoneId, TelephonyProperties.icc_operator_iso_country(), "");
}

以上的属性定义在TelephonyProperties

//QSSI.13\frameworks\base\telephony\java\com\android\internal\telephony\TelephonyProperties.java
public interface TelephonyProperties
{
....
/** ISO country code equivalent for the SIM provider's country code*/
static String PROPERTY_ICC_OPERATOR_ISO_COUNTRY = "gsm.sim.operator.iso-country";
....
}

我们看到TelephonyProperties为接口,并且接口类中未定义实现icc_operator_iso_country(),只定义了属性PROPERTY_ICC_OPERATOR_ISO_COUNTRY,其实icc_operator_iso_country定义在如下文件

//QSSI.13/system/libsysprop/srcs/android/sysprop/TelephonyProperties.sysprop
# ISO country code equivalent for the SIM provider's country code.
# Indexed by phone ID
prop {api_name: "icc_operator_iso_country"type: StringListscope: Internalaccess: ReadWriteprop_name: "gsm.sim.operator.iso-country"
}

/system/libsysprop/srcs/android/sysprop/,发现这里面有很多文件,文件后缀均为sysprop。

我们可以先看下bp文件

sysprop_library {name: "PlatformProperties",srcs: ["**/*.sysprop"],property_owner: "Platform",api_packages: ["android.sysprop"],apex_available: ["//apex_available:platform","com.android.art","com.android.art.debug","com.android.bluetooth","com.android.tethering",],cpp: {min_sdk_version: "S",},vendor_available: true,
}

可以看到该模块会被编译为jar包为:PlatformProperties.jar,该模块对应的jar包位置为:

QSSI.13\out\soong\.intermediates\system\libsysprop\srcs\PlatformProperties\android_common\javac\PlatformProperties.jar

我们可以把该jar包放到AndroidStudio中引用看下,可以到TelephonyProperties.sysprop会被转换为TelephonyProperties.java

我们看下代码就可以看到原来也是调用SystemProperties

这个用法类似于aidl,说明编译脚本会将我们的sysprop文件转换为java文件,并生成对应的方法。此工作是在以下路径的脚本文件处理

//QSSI.13/build/soong/sysprop/sysprop_library.go
...
func (g *syspropJavaGenRule) GenerateAndroidBuildActions(ctx android.ModuleContext) {var checkApiFileTimeStamp android.WritablePathctx.VisitDirectDeps(func(dep android.Module) {if m, ok := dep.(*syspropLibrary); ok {checkApiFileTimeStamp = m.checkApiFileTimeStamp}})for _, syspropFile := range android.PathsForModuleSrc(ctx, g.properties.Srcs) {srcJarFile := android.GenPathWithExt(ctx, "sysprop", syspropFile, "srcjar")ctx.Build(pctx, android.BuildParams{Rule:        syspropJava,Description: "sysprop_java " + syspropFile.Rel(),Output:      srcJarFile,Input:       syspropFile,Implicit:    checkApiFileTimeStamp,Args: map[string]string{"scope": g.properties.Scope,},})g.genSrcjars = append(g.genSrcjars, srcJarFile)}
}
...

从上面的编译逻辑中可以窥知,编译过程中会输出srcJarFile类型的文件。例如TelephonyProperties.sysprop文件会被转换为TelephonyProperties.srcjar java文件

out\soong.intermediates\system\libsysprop\srcs\PlatformProperties_java_gen\gen\sysprop\system\libsysprop\srcs\android\sysprop\TelephonyProperties.srcjar

至此我们知道编译脚本会对.sysprop文件 转换,我们只需要按照.sysprop文件格式定义对应的api即可

下面演示下如何新增一个prop

1:在TelephonyProperties.sysprop 中定义属性
//QSSI.13/system/libsysprop/srcs/android/sysprop/TelephonyProperties.sysprop
# set default dns list
prop {api_name: "sim_default_dns"type: StringListscope: Publicaccess: ReadWriteprop_name: "sim.default.dns"
}
scope为public 可被外部读写,scope: Internal 则只可被同包下的读写,并且public需要更新PlatformProperties-current.txt Internal 需要更新PlatformProperties-latest.txt文件
2:更新api接口
我们新增了属性,需要执行如下指令,更新api文件,具体的详见脚本文件:/build/soong/scripts/freeze-sysprop-api-files.sh
m PlatformProperties-dump-api && rm -rf system/libsysprop/srcs/api/PlatformProperties-current.txt && cp -f out/soong/.intermediates/system/libsysprop/srcs/PlatformProperties_sysprop_library/api-dump.txt system/libsysprop/srcs/api/PlatformProperties-current.txt
执行上述指令以后会更新如下文件
//QSSI.13/system/libsysprop/srcs/api/PlatformProperties-current.txt
prop {api_name: "sim_default_dns"type: StringListaccess: ReadWriteprop_name: "sim.default.dns"}
3:我们新增了属性为sim.default.dns,我们还需要增加selinux权限,即为此属性配置上下文,可直接使用之前系统定义好的上下文
//QSSI.13/system/sepolicy/private/property_contexts
sim.default.dns                u:object_r:telephony_status_prop:s0 exact string
//QSSI.13/system/sepolicy/prebuilts/api/33.0/private/property_contexts
sim.default.dns                u:object_r:telephony_status_prop:s0 exact string
4:在如下接口中新增属性
QSSI.13\frameworks\base\telephony\java\com\android\internal\telephony\TelephonyProperties.java
/*** PROPERTY_SIM_DEFAULT_DNS is to set the default DNS*/
static String PROPERTY_SIM_DEFAULT_DNS = "sim.default.dns";
5:如上以后我们可以重新编译PlatformProperties
make PlatformProperties

然后把:out\soong.intermediates\system\libsysprop\srcs\PlatformProperties_java_gen\gen\sysprop\system\libsysprop\srcs\android\sysprop\TelephonyProperties.srcjar

路径下的jar包拖到AS中,可以看到系统为我们生成了对应的方法

然后我们就可以直接通过如下代码去读写了

 /*** Set TelephonyProperties.default_dns for dns.** @hide*/public void setSimDnsServers(int phoneId, String dnsStr) {if (SubscriptionManager.isValidPhoneId(phoneId)) {List<String> newList = new ArrayList();if (!TextUtils.isEmpty(dnsStr)) {List<String> tList = updateTelephonyProperty(TelephonyProperties.sim_default_dns(), phoneId, dnsStr);newList.addAll(tList);}for (int i = 0; i < newList.size(); i++) {Log.e(TAG, "setSimDns...." + newList.get(i));}Log.e(TAG, "setSimDnsList...." + dnsStr + ":" + newList);TelephonyProperties.sim_default_dns(newList);}}/*** get TelephonyProperties.default_dns** @hide*/public String getSimDnsServers(int phoneId) {return getTelephonyProperty(phoneId, TelephonyProperties.sim_default_dns(), "");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go语言,golang,linux,unbantu安装

查看系统是arm还是amd uname -m 命令可以显示系统的架构类型&#xff1a; uname -m输出可能是&#xff1a; x86_64&#xff1a;表示是 AMD64 架构&#xff08;即 64 位的 x86 架构&#xff09;。aarch64&#xff1a;表示是 ARM64 架构&#xff08;即 64 位的 ARM架构&#xf…

SMB工具横向移动

一. SMB工具介绍和使用 1.介绍 2013年的Defcon上&#xff0c;就引入了smbexec&#xff0c;后续 smbexec 被 Impacket 进一步完善了。在Impacket中支持明文认证&#xff0c;NTLM认证&#xff0c;Aeskey认证等方式&#xff01; 2. 使用方法 命令&#xff1a; smbexec.exe 用户…

【计算机毕业设计】基于SSM+Vue的线上旅行信息管理系统【源码+lw+部署文档】

目录 摘 要 第1章 绪论 1.1背景及意义 1.2 国内外研究概况 1.3 研究的内容 第2章 相关技术 2.1 Java简介 2.2 SSM三大框架 2.3 MyEclipse开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 第3章 系统分析 3.1 需求分析 3.2 系统可行性分析 3.2.1技术可行性&#xff1a;技术背景 …

Debug-011-ES6中的链判断运算符(?.)

这个问题的来源是&#xff1a; 前端在请求后端接口&#xff0c;拿到的数据&#xff0c;有可能是这样的&#xff1a; data:{a:{b:{c:{d:""}}} } 我们前端小伙伴联调时需要取到d的值&#xff0c;我以前是这样写的&#xff1a; // 错误的写法 const value data.a.b.c…

ACM Proceedings Template 使用方法

模板导入 打开ACM Primary Article Template官网&#xff0c;可以看到自带overleaf模板&#xff0c;接下来我们使用overleaf来自动导入模板。 选择你需要的ACM Conference or Journals模板&#xff0c;然后Open as Template 栏目说明 接下来依次解释一下左边栏目的作用 …

5月28号总结

刷题记录 1.A. Phone Desktop 输入&#xff1a; 11 1 1 7 2 12 4 0 3 1 0 8 1 0 0 2 0 15 0 8 2 0 9 输出&#xff1a; 1 1 2 2 1 1 0 1 1 2 5 题意&#xff1a;题目给我们1x1和2x2的图标个数&#xff0c;让我们求最少需要多少个5x3的屏幕。 思路&#xff1a;当只看2x2的图…

开源与闭源:AI大模型发展路径的博弈

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;大模型以其卓越的性能和广泛的应用前景&#xff0c;成为了近年来技术发展的热点。然而&#xff0c;在大模型的发展路径上&#xff0c;开源与闭源两种模式一直存在着激烈的博弈。本文将深入探讨这两种模式在大模…

module ‘plotting‘ has no attribute ‘EpisodeStats‘

plotting.py 的版本不同&#xff0c;可以使用下列版本 reinforcement-learning/lib/plotting.py at master dennybritz/reinforcement-learning GitHubImplementation of Reinforcement Learning Algorithms. Python, OpenAI Gym, Tensorflow. Exercises and Solutions to a…

如何将云服务器上操作系统由centos切换为ubuntu

本文将介绍如何将我们购买的云服务器上之前装的centos切换为ubuntu&#xff0c;云服务器以华为云为例&#xff0c;要切换的ubuntu版本为ubuntu20.04。 参考官方文档&#xff1a;切换操作系统_弹性云服务器 ECS (huaweicloud.com) 首先打开华为云官网&#xff0c;登录后点击右…

MongoDB分片集群容灾方案

MongoDB分片集群容灾方案 1. 集群同步工具介绍1.1 第三方数据同步工具mongoshake1.2 官方同步工具mongosync 2. 工具对比2.1 数据一致性2.2 稳定性和可靠性2.3 维护成本 3. 总结 1. 集群同步工具介绍 最近客户咨询MongoDB分片集群市面上主流的容灾方案&#xff0c;所以抽空整理…

安卓六种页面加载优化方案对比总结

根据工作经验&#xff0c;笔者提炼了六种页面加载优化方式&#xff0c;按照业务与非业务&#xff0c;将六种加载方式分为两类&#xff1a; 业务类 控制业务与UI的执行顺序、控制多业务之间的执行顺序 ①预加载&#xff1a;是指在进入页面之前&#xff0c;提前获得页面所需得数据…

直播预告|中服云第5代`工业物联产品线上发布会

我国作为全球制造业的领军者&#xff0c;拥有世界上最完整且健全的制造业产业链。但随着各企业规模的扩大和设备的增加&#xff0c;企业设备管理面临的难点和挑战也越来越多。 为了满足企业不断提高的设备管理需求&#xff0c;中服云即将推出全新的“设备全生命周期管理系统5.…

机器学习之聚类学习

聚类算法 概念 根据样本之间相似性&#xff0c;将样本划分到不同类别种&#xff0c;不同相似度计算方法&#xff0c;会得到不同聚类结果&#xff0c;常用相似度计算方法为&#xff1a;欧氏距离 目的是在没有先验知识情况下&#xff0c;自动发现数据集种内在结构和模式 无监督…

告别裸奔,聊聊主流消息队列的认证和鉴权!

大家好&#xff0c;我是君哥。 我们在使用消息队列时&#xff0c;经常关注的是消息队列收发消息的功能。但好多时候需要对客户端有一定的限制&#xff0c;比如只有持有令牌的客户端才能访问集权&#xff0c;不允许 Producer 发送消息到某一个 Topic&#xff0c;或者某一个 Top…

人脸识别——Webface-OCC遮挡人脸识别算法解析

1. 概述 自2019年被誉为人脸识别技术的元年&#xff0c;各地纷纷引入这项技术。然而&#xff0c;自2020年起&#xff0c;为了抵御冠状病毒&#xff08;COVID-19&#xff09;的全球传播&#xff0c;人们普遍开始佩戴口罩。众所周知&#xff0c;现有人脸识别模型在面对遮挡物&am…

Dalle2学习

Dalle2 mini有GitHub库并且有网页可以直接测试

网络之再谈体系结构

大家都知道的是网络的体系结构&#xff0c;现代软件常用的体系结构无非是TCP/IP协议栈&#xff0c;OSI因为实现复杂并且效率没有TCP/IP协议栈好&#xff0c;所以不用OSI&#xff0c;但是&#xff0c;最近在复习网络知识的时候&#xff0c;发现了一些奇怪的地方&#xff0c;那就…

C/C++连接MySQL

本章Gitee仓库地址&#xff1a;mysql连接基本操作 文章目录 1. mysql connect库2. mysql相关接口2.1 mysql_init()2.2 mysql_real_connect()2.3 mysql_query()2.4 mysql_store_result()2.41 mysql_num_rows2.42 mysql_num_fields2.43 mysql_fetch_row2.44 mysql_fetch_fields 2…

中国上市企业行业异质性数据分析

数据简介&#xff1a;企业行业异质性数据是指不同行业的企业在运营、管理、财务等方面的差异性数据。这些数据可以反映不同行业企业的特点、优势和劣势&#xff0c;以及行业间的异质性对企业经营和投资的影响。通过对企业行业异质性数据的分析&#xff0c;投资者可以更好地了解…

STM32系列-STM32介绍

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” STM32介绍 STM32介绍 ST&#xff1a;指的是意法半导体 M&#xff1a;指定微处理器 32&#xff1a;表示计算机处理器位数 ARM分成三个系列&#xff1a; Cortex-A&#xff1…