前言:

  安卓底层对于不同APP通常有不同的参数配置。这个功能可以通过接口实现,让APP自己决定具体的参数配置。但是在一些情况下,APP自己设置的参数并不一定符合所有客户的需求,所以需要厂商根据自己实际情况去做不同改变。

  下面以设置vidoe的比特率为例介绍具体实现方法:

方法一. 在native层获取APP name然后做不同处理

1. 包含头文件

#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#ifndef __ANDROID_VNDK___#include <binder/IPermissionController.h>
#endif

2. 获取包名:

String16 mClientName;
const uid_t uid = IPCThreadState::self()->getCallingUid();
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("permission"));
if (binder == 0) {ALOGE("Cannot get permission service");return;
}
sp<IPermissionController> permCtrl = interface_cast<IPermissionController>(binder);
Vector<String16> packages;
permCtrl->getPackagesForUid(uid, packages);
if (packages.isEmpty()) {ALOGE("No packages for calling UID");
}else {mClientName = packages[0];
}

3. 判断是否是某个APP并做相应处理

if(!String16("com.xxx.mm").compare(mClientName)){msg->setInt32("bitrate", bitrate);
}

此方法的问题: 只能获取当前APP的name,无法得知当前APP的操作。

方法二:在activity.java中获取APP的操作,并设置系统属性,在native中获取属性,并做相应处理

1. 在java中获取APP的操作

import android.os.SystemProperties;
final void attach(……){mComponent = intent.getComponent(); // 获取APP name及当前的操作if(needChangeBitRate(mComponent.toShortString())){ // 判断是否是需要改变的APP操作SystemProperties.set("sys.highbitrate", "1"); // 设置系统属性}else{SystemProperties.set("sys.highbitrate", "0"); // 设置系统属性}
}

2. 在native中获取系统属性,并做响应处理

#include <cutils/properties.h>
……
string str;
property_get("sys.highbitrate", str);
if(str == "1")
{msg->setInt32("bitrate", 2400000);
}

此处有坑!!!!

事实证明上面的方法二并不可用,运行过程中,SystemProperties.set("sys.highbitrate", "1");总是报错: Unable to set property "sys.xiaomi.highratevideo" to "yes": connection failed; errno=13 (Permission denied)。从log就可以看出是权限问题。网上搜了一大推,全是关于设置Manifest和makefile的,但是此处并不适用。后来才知道,SystemProperties.set( key, value);此处的key的前缀是与权限相关的。

具体权限对应前缀:

vendor image里 要用vendor 开头的前缀

system image也有默认,可以不加,系统会自己加上。

然后我试了sys/persist/ro/audio/不加,然后发现所有的都还是一样的报错。

然后发现是selinux相关,设置adb shell setenforce 0,然后报错就会变成Unable to set property "ro.highratevideo" to "yes": error code: 0xb。

最后改为: SystemProperties.set("persist.highbitrate", "1");

并adb shell setenforce 0,

      ok,可以成功设置。

但是adb shell setenforce 0,是禁掉了selinux的相关检查,只能用来临时测试。如果要用来正式改动,还是需要去文件里面设置相关权限。具体可参考下面。

分析selinux权限缺失的解决办法:

sepolicy 有两种类型,一种是进程,一种是文件。 可分别用ps -Z和ls -Z查看进程和文件的selinux权限。
分析过程:
  缺少什么权限:      { search }权限,
  谁缺少权限:       scontext=u:r:system_app:s0
  对哪个文件缺少权限:tcontext=u:object_r:fs_bpf:s0
  什么类型的文件:    tclass=dir
  完整的意思: system_app进程对fs_bpf类型的dir缺少search权限。

解决方法:
  关于权限添加的文件:
  platform/system/sepolicy
  xxui/system/sepolicy
  在xxui/system/sepolicy 中找到system_server.te文件添加
  allow system_app fs_bpf:dir { search };

ps:
  针对dir缺少的任何权限,建议赋予create_dir_perms,基本涵盖对dir的所有权限,比如:
  { open search write read rename create rmdir getattr }等等。
  针对file缺少的任何权限,建议赋予rwx_file_perms,基本涵盖对file的所有权限,比如:
  包含{ open read write open execute getattr create ioctl }等等。

最后,关于这种和权限相关的改动,很有可能引起TS类测试fail,一定要跑一遍试试!!!

还有这种改动每次activity发生变化都需要设置全局系统属性,很有可能引起系统卡顿,请慎重操作!!!

安卓基础-安卓底层针对不同APP做不同处理相关推荐

  1. 对安卓手机上的APP做monkey压力测试

    之前对安卓手机上的APP做了monkey测试,今天来总结一下如何使用安卓自带的monkey命令去做测试. 首先,PC端要对安卓手机进行monkey测试的话,必须要有以下条件: 1.电脑中必须配有ADB ...

  2. 【安卓基础】Android直接通过路径来操作其他应用的私有目录,可以吗?

    在上篇文章[安卓基础]一文搞懂Android历代版本文件访问权限变化我们对同一个应用的的文件访问权限做了比较. 那么不同应用之间文件访问又有什么限制呢?我们准备分二到三篇文件来阐述. 这篇文章,主要来 ...

  3. 安卓手机来电防火墙_安卓基础知识自动化测试

    安卓基础知识 本章重点探讨AndroidUI自动化测试过程中所涉及到的原理和技术.掌握这些知识是为学习Appium自动化测试框架打下基础. 学习目标 了解API和安卓版本的关系 了解安卓组件,安卓程序 ...

  4. 目录大全_安卓面经_Android面经_150道安卓基础面试题全解析

    高级系列专栏: 安卓(安卓系统开发也要掌握) 想通关安卓面试,请看:<150道安卓高频面试题目录及答案链接> 想通关安卓系统面试,请看:<140道安卓系统Framework面试题目录 ...

  5. 安卓期末大作业——鲜花商店APP(源码+任务书)

    安卓期末大作业--鲜花商店APP(源码+任务书) <移动应用开发> 课程考核报告 姓    名: 学    号: 完 成 日 期 2022年 5月 建议从以下方面填写:1. 课题的作用和意 ...

  6. android模拟器背景色,安卓开发者必备的 5 款 App:终端模拟器、颜色萃取、移动 IDE 等...

    原标题:安卓开发者必备的 5 款 App:终端模拟器.颜色萃取.移动 IDE 等 编者按:Antonis Tsagaris是一名Android开发者,最近,他在博文中推荐了5款Android App, ...

  7. android模拟器背景色,安卓开发者必备的5款App:终端模拟器、颜色萃取、移动IDE等...

    安卓开发者必备的5款App:终端模拟器.颜色萃取.移动IDE等 摘要:原标题:安卓开发者必备的5款App:终端模拟器.颜色萃取.移动IDE等编者按:AntonisTsagaris是一名Android开 ...

  8. 安卓基础知识-layout布局详解。

    安卓基础知识 1. 目录结构: src存放java源代码. gen存放系统自动生成的配置文件 res存放应用用到的所有资源文件,如图片,布局等等 drawable存放不同分辨率的图片 layout存放 ...

  9. 安卓基础知识之Activity篇(一):Activity生命周期

    安卓基础知识系列旨在简明扼要地提供面试或工作中常用的基础知识,让对安卓还不太熟悉的小伙伴更快地入门.同时自己在工作中,也没法完全记住所有的基础细节,写这样的系列文章,可以让自己形成一个更完备的知识体系 ...

最新文章

  1. 使用Red Gate Sql Data Compare 数据库同步工具进行SQL Server的两个数据库的数据比较、同步...
  2. c++ 如何获取系统时间
  3. 分支程序与循环程序设计-汇编实验二
  4. P2178-[NOI2015]品酒大会【SA,并查集】
  5. 集合——对象数组(引用数据类型数组)
  6. 计算平面坐标某点(x,y)与原点(0,0)的角度
  7. 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换
  8. 单片机蜂鸣器音乐c语言程序,51单片机 使用蜂鸣器播放简单音乐
  9. Python 之 PyCharm + selenium 163邮箱登录详解
  10. 博弈论完全信息博弈思维导图
  11. 我的世界java版钻石剑附魔_我的世界钻石剑怎么附魔 钻石剑附魔100级指令
  12. 2018-12-24:企业微信分享功能
  13. 2017中山大学计算机考研科目,2017年中山大学0812计算机科学与技术考研参考书目推荐...
  14. 面试经历---广东耶萨智能科技股份有限公司(2016年01月11日上午面试)
  15. 游戏推广免费的cps模式和游戏加盟平台选择的一个误区。
  16. 使用freemarker导出word文档包含多张图片
  17. 手臂疼,竟是它惹的祸?这些征兆你想都想不到
  18. c语言习题字符指针作函数参数
  19. 【Scratch算法讲解】02-Scratch冒泡排序 少儿编程Scratch常见排序算法案例分析讲解
  20. Oracle-获取某一日期之前/之后的数据

热门文章

  1. Vue3电商项目实战-个人中心模块3【07-订单管理-tabs组件、08-订单管理-基础布局】
  2. 【自动化测试工程师】成为自动化测试的7种技能
  3. DELL R730 iDRAC与IPMI的使用
  4. 划分亚洲国家的三个足球梯队
  5. 会心自选:买家秀怎么做?有哪些方法?
  6. kubeadm部署高可用k8s
  7. java+SpringBoot+HTML+Mysq基于Java语言开发的奶茶外卖平台
  8. 新手必看!51单片机指令快速记忆法
  9. 汇编语言--将字符串中小写字母转换成大写字母
  10. Fingerprintjs2:一款开源设备指纹采集器