客户要求

客户提了一个小需求,就是要将系统属性(ro.com.google.clientidbase.ms)随卡适配。
具体要求是:
如果插中国的卡,系统属性ro.com.google.clientidbase.ms值为android-orange-cn。
如果插法国的卡,系统属性ro.com.google.clientidbase.ms值为android-orange-fr。
如果插西班牙的卡,系统属性ro.com.google.clientidbase.ms值为android-orange-es。

需求实现

这个功能,怎么样,是不是非常简单。
哈哈,如果你这样认为,我担心你搞不定此问题。此问题不是那么好实现的。
但是,我们公司还是有牛人啊,将其实现了。

大概分析实现流程

监听到插入sim卡手机后,读取sim卡的国家缩写码,再将此读取到的sim卡的国家缩写码赋值给系统属性ro.com.google.clientidbase.ms。

感觉是不是太简单了,如果你这样觉得,那是因为你不知道实现此问题的关键所在。ro开头的系统属性,我们一般是只有读取的权限,是没有写的权限噢。
所以,此问题的关键点:

就在与给系统属性ro.com.google.clientidbase.ms赋值的写的权限。

具体实现

(1)监听到插入sim卡后,读取sim卡的国家缩写码,将系统属性gsm.operator.googleclientbase值设置为true。

在\frameworks\base\telephony\java\com\android\internal\telephony\TelephonyProperties.java文件中,定义系统属性gsm.operator.googleclientbase和gsm.sim.operator.iso-country:

/** ISO country code equivalent for the SIM provider's country code*/
static String PROPERTY_ICC_OPERATOR_ISO_COUNTRY = "gsm.sim.operator.iso-country";//add codes begin
static final String PROPERTY_GOOGLE_CLIENTIDBASE_SET = "gsm.operator.googleclientbase";
//add codes end

在\frameworks\base\telephony\java\android\telephony\TelephonyManager.java文件中,将读取sim卡的国家缩写码保存到gsm.sim.operator.iso-country中,再将系统属性gsm.operator.googleclientbase值设置为true,从而触发init.rc中的服务。

public void setSimCountryIsoForPhone(int phoneId, String iso) {setTelephonyProperty(phoneId,TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY, iso);//add codes beginif (!android.text.TextUtils.isEmpty(iso)) {SystemProperties.set(TelephonyProperties.PROPERTY_GOOGLE_CLIENTIDBASE_SET, "true");}//add codes end
}

(2)init.rc定义给系统属性ro.com.google.clientidbase.ms赋值的服务:
当系统属性gsm.operator.googleclientbase值设置为true,从而触发init.rc中的服务client_search,并指定此服务为/system/bin/googleclientidbaseprop。
至于为什么在init.rc来执行给系统属性ro.com.google.clientidbase.ms赋值的操作,还是因为权限的问题,此文件可以有root权限,这其实是可以从此文件的路径可以看出。

\system\core\rootdir\init.rc

#add codes begin
#当系统属性设置为true时,启动服务client_search
on property:gsm.operator.googleclientbase=truestart client_search#给服务client_search指定bin文件和添加对应权限
service client_search /system/bin/googleclientidbasepropuser rootgroup rootdisabledoneshot
#add codes end

(3)googleclientidbaseprop应用,主要功能是将从gsm.sim.operator.iso-country读取到的sim卡的国家缩写码赋值给ro.com.google.clientidbase.ms。

这其实就是一个我们平时的应用,只是,他为一个bin执行文件。
apps\GoogleClientIdBase\Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \googleclientidbaseprop_main.cpp
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
LOCAL_SHARED_LIBRARIES := \libcutils \liblog \libutils
LOCAL_MODULE:= googleclientidbaseprop
ifdef TARGET_32_BIT_SURFACEFLINGER
LOCAL_32_BIT_ONLY := true
endif
include $(BUILD_EXECUTABLE)

apps\GoogleClientIdBase\googleclientidbaseprop_main.cpp

#undef NDEBUG
#define LOG_TAG "Googleclientidbaseprop"
#include <cutils/properties.h>
#include <utils/Log.h>
#include <string.h>using namespace android;#define PROPERTY_OPERATOR_ISO_COUNTRY "gsm.sim.operator.iso-country"
#define RO_COM_GOOGLE_CLIENTIDBAEE_MS_PROP "ro.com.google.clientidbase.ms"int main()
{char value[PROPERTY_VALUE_MAX] = "";char value_ms[PROPERTY_VALUE_MAX] = "";char propValue[PROPERTY_VALUE_MAX] = "android-orange-";property_get(PROPERTY_OPERATOR_ISO_COUNTRY, value, "");property_get(RO_COM_GOOGLE_CLIENTIDBAEE_MS_PROP, value_ms, "");ALOGD("First Get prop %s: %s", RO_COM_GOOGLE_CLIENTIDBAEE_MS_PROP, value_ms);if(!(0 == strcmp("", value_ms))) return 0;if (!(0 == strcmp("", value))) {strncat(propValue, value, strlen(value));property_set(RO_COM_GOOGLE_CLIENTIDBAEE_MS_PROP, propValue);}memset(value, 0, PROPERTY_VALUE_MAX);property_get(RO_COM_GOOGLE_CLIENTIDBAEE_MS_PROP, value, "");ALOGD("Get prop %s: %s", RO_COM_GOOGLE_CLIENTIDBAEE_MS_PROP, value);return 0;
}

在*.mk文件中,将此应用加进来:

PRODUCT_PACKAGES += googleclientidbaseprop

(4)添加对应的权限

4.1 预置要随卡适配的系统属性的读写权限:
在文件device/qcom/sepolicy/common/property_contexts中,定义要修改的系统属性对应的属性名:

ro.com.google.clientidbase.ms       u:object_r:googleclient_base_prop:s0

再在文件device/qcom/sepolicy/common/property.te中,定义对应要修改的系统属性为系统属性:

type googleclient_base_prop, property_type;

4.2 init.rc的服务googleclientidbaseprop 读写权限:

再在device/qcom/sepolicy/common/file_contexts文件中,定义应用的执行名字:

/system/bin/googleclientidbaseprop u:object_r:googleclientidbaseprop_exec:s0

再在device/qcom/sepolicy/common/googleclientidbaseprop.te文件中,定义此服务的相关权限:

type googleclientidbaseprop, domain;
type googleclientidbaseprop_exec, exec_type, file_type;init_daemon_domain(googleclientidbaseprop)allow googleclientidbaseprop system_file:file execute_no_trans;
# Property Service write
set_prop(googleclientidbaseprop, googleclient_base_prop)

4.3 adb shell系统属性的读写权限:
这就是要在device/qcom/sepolicy/common/shell.te文件中添加随卡适配的系统属性的读写权限。

allow shell googleclient_base_prop:file { read getattr open };

可以看出,此系统权限的相关设置是比较复杂的,这也是此功能的实现的关键所在。

android开发笔记之系统属性(ro.com.google.clientidbase.ms)随卡适配相关推荐

  1. Android 系统(94)---android系统属性(ro.com.google.clientidbase.ms)随卡适配

    android系统属性(ro.com.google.clientidbase.ms)随卡适配 客户要求 客户提了一个小需求,就是要将系统属性(ro.com.google.clientidbase.ms ...

  2. Android开发笔记(八十一)屏幕规格适配

    Configuration 适配各种屏幕规格,首先要取到系统对于屏幕的配置信息,这些配置可从工具类Configuration获得.Configuration对象在Activity中通过调用getRes ...

  3. 属性数量限制android,Android开发笔记 今天学到的一些属性

    Android开发笔记 今天学到的一些属性 更新时间:2012年11月07日 10:23:33   作者: 离开实验室之前再贴上今天下午自己学到的一些基础知识 上午干嘛了呢,忙着数据恢复呢 1.最后程 ...

  4. android开发笔记之属性动画

    属性动画简单介绍 作用对象:任意 Java 对象 不再局限于 视图View对象 实现的动画效果:可自定义各种动画效果 不再局限于4种基本变换:平移.旋转.缩放 & 透明度 特点 作用对象进行了 ...

  5. Android开发笔记(九十六)集合动画与属性动画

    集合动画AnimationSet 补间动画有四大类:透明度动画AlphaAnimation.旋转动画RotateAnimation.缩放动画ScaleAnimation.平移动画TranslateAn ...

  6. Android开发笔记(八十四)使用Properties读写属性值

    Properties概述 Java中的配置文件常为.properties文件,而Properties类便是读写此类文件的工具.属性文件有两种格式,一种是文本格式,其内容是"键=值" ...

  7. Android开发笔记(一百七十九)避免方法数过多的问题

    一个大规模的App工程,往往引入了数量繁多的第三方开发库,其中既有官方的Jetpack库,也有第三方厂商的开源包.有时候运行这种App会报错"Cannot fit requested cla ...

  8. Android开发笔记(一百七十七)借助FileProvider安装应用

    除了发送彩信需要文件提供器,安装应用也需要FileProvider.不单单彩信的附件图片能到媒体库中查询,应用的APK安装包也可在媒体库找到.查找安装包依然借助于内容解析器,具体的实现过程和查询图片类 ...

  9. Android开发笔记(一百七十六)借助FileProvider发送彩信

    通过系统相册固然可以获得照片的路径对象,却无法知晓更多的详细信息,例如图片名称.文件大小.文件路径等等都不知道,也就无法进行个性化的定制开发.为了把更多的文件信息开放出来,Android设计了专门的媒 ...

最新文章

  1. ROS知识【13】:ubuntu下安装eclipse-CDT【非installor】
  2. ITK:将颜色贴图应用于图像
  3. [BUUCTF-pwn]——jarvisoj_level2
  4. MoQ(基于.net3.5,c#3.0的mock框架)简单介绍(转)
  5. CentOS 7上搭建Spark3.0.1+ Hadoop3.2.1分布式集群
  6. C/C++ 去掉字符串首位的空格字符
  7. HTTP 1.1 协议规范
  8. Digilent提供的Pmod AD1驱动程序
  9. dsp c语言程序设计,DSP C语言程序设计.pdf
  10. docker-maven-plugin 推送镜像到 docker-hub
  11. 2019牛客多校第二场E MAZE(线段树 + 矩阵)题解
  12. Less/Sass 定制私人常用方法库
  13. java 缓存日志_Java日志缓存机制的实现(3)
  14. mysql sqlyog中文乱码_sqlyog 查询中文乱码
  15. 超详细的Windows新装机流程(自装Windows系统、设置BIOS等)
  16. web中常见的敏感信息
  17. Win10、Win7系统,电脑蓝屏,什么原因怎么解决?一篇文章彻底解决!
  18. CentOS 中安装nginx
  19. 明道云对接小鹅通,沉淀内容付费平台数据
  20. FastDFS分布式文件系统实践详解

热门文章

  1. 【C语言X数据结构】用静态链表实现的多项式计算器,加减乘除求导求值,输入输出样样在行!(完整代码+注释)
  2. 恩施机器人编程_恩施教学机器人_海联天下物联网
  3. 刷OPENWRT后悔了,刷回原厂固件教程
  4. python毕业设计作品基于django框架 校园二手书籍交易系统毕设成品(2)网站功能
  5. smart rtmpd 服务器配置文件说明及优化方法介绍
  6. ​ 基于机器学习的旅游推荐系统(Python+Django)
  7. Word去除页眉下的横线
  8. 高德地图JS API 使用01
  9. linux开机与关机步骤
  10. 海量数据“一键筛选”,比Excel还好用的筛选功能,更便捷了