位置: 编程技术 - 正文

Android 5.0 如何正确启用isLoggable(二)__原理分析(android怎么运行)

编辑:rootadmin
前置文章

推荐整理分享Android 5.0 如何正确启用isLoggable(二)__原理分析(android怎么运行),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android最新教程,android怎么样,android系统怎么样,androidru,androidq,androidq,android系统教程,android系统教程,内容如对您有帮助,希望把文章链接给更多的朋友!

《Android 5.0 如何正确启用isLoggable(一)__使用详解》

概要

在上文《Android 5.0 如何正确启用isLoggable(一)__使用详解》中分析了isLoggable的使用方法,本文主要分析isLoggable实现原理以及user版系统root后永久enable isLoggable的原理,并使用脚本自动设置isLoggable相关属性。

本文来自 转载请务必注明出处

isLoggable工作原理

isLoggable定义在frameworks/base/core/java/android/util/Log.java中:

而isLoggable的native实现则是在frameworks/base/core/jni/android_util_Log.cpp中: 从代码中可以看到,android_util_Log_isLoggable()的返回&#;取决于android_util_Log.cpp中的isLoggable()方法: 在android_util_Log.cpp中的isLoggable()首先会通过property_get()去获取log.tag.<Your_TAG>的属性&#;,如果没有设置该属性则将buf[0]设为空,再通过toLevel()方法获取logLevel的&#;,最终返回&#;由logLevel >= 0 && level >=logLevel决定。toLevel()方法内容如下: levels是结构体levels_t的对象,在register_android_util_Log()方法完成赋&#;,而register_android_util_Log()方法则是在系统启动时通过AndroidRuntime.cpp中的REG_JNI(register_android_util_Log)完成调用,代码如下: 在toLevel()方法中,如果字符数组value[0]匹配V/D/I/W/E/A/S则返回对应的Int&#;,如果value[0]为空,则返回默认&#;levels.info即4。再次回看android_util_Log.cpp中的isLoggable()方法: 因为levels结构体中数据均来自android.util.Log中,最小&#;为2 ( VERBOSE ),最大&#;为7 ( ASSERT ),因此 logLevel >=0 始终为true。而level >=logLevel则会根据用户指定的level进行判断,如

这里的level是DEBUG也就是3,相当于 level >= logLevel变为3 >= logLevel。如果没有设置属性&#;log.tag.InCall的&#;,则logLevel的默认返回为4 ( INFO),因此 3 >= 4不成立返回false,因此logLevel >=0 && level >= logLevel返回false;如果设置log.tag.InCall的&#;为D或者V,则logLevel返回为 3或者2,因此level >= logLevel成立,从而使得isLoggable返回为true。

Android Property System简介

在isLoggable的调用流程中涉及到属性&#;的读取,这里简单了解Android Property System的工作流程。如下图所示:

图 1 android property system (Pic From @rxwen)

蓝色表示独立进程,橙色表示共享内存,白色表示属性文件。属性&#;的获取通过property consumer完成,当系统启动时会将persistent file中的属性&#;加载到共享内存中,如果需要设置属性&#;,那么property setter会通过socket将需求提交给property service,由property service将属性&#;写入到共享内存中。

因为设置属性如log.tag.InCall D后会写入到共享内存中,但设备重启后会重新申请共享内存并加载属性文件,而手动设置的属性并没有写入属性文件,所以重启设备后log.tag.InCall的属性会失效。

local .prop文件加载流程

在前文《Android 5.0 如何正确启用isLoggable(一)__使用详解》中提到,如果想要重启后设置的log.tag.<Your_Tag>属性依然有效,那么需要将log.tag.InCall=D写入/data/local.prop文件中,重启设备后系统会加载该路径下的属性文件。那这一步是如何完成的呢?这就涉及到Android Property System的初始化流程。

Android Property Service是在Init进程中被初始化的,而在初始化过程中会加载指定路径下的属性文件,加载流程如下图所示:

图 2 Property files init flow

图中涉及文件路径:

/system/core/init/init.cpp

/system/core/init/init_parser.cpp

Android 5.0 如何正确启用isLoggable(二)__原理分析(android怎么运行)

/system/core/init/builtins.cpp

/system/core/init/property_service.cpp

/system/core/rootdir/init.rc

init进程启动后首先执行main()方法,之后通过init_parse_config_file()加载init.rc文件,并对init.rc文件进行解析,最后将解析出来的service、action及其command存入链表中。在完成init.rc解析之后通过execute_one_command()方法,逐个取出链表中的command并执行。init.rc中的properties相关action如下:

load_all_props的定义在/system/core/init/keywords.h中: 最终调用到/system/core/init/property_service.cpp的load_all_props()方法中:

展开load_override_properties()方法可以看到:

通过load_properties_from_file()以及load_override_properties()等方法加载属性文件,这些文件的路径定义在/bionic/libc/include/sys/_system_properties.h中: 但这里需要注意,/system/build.prop、/vendor/build.prop、/factory/factory.prop这几个文件如果存在都会被加载,而/data/local.prop这个文件,只有在ro.debuggable=1时才会加载,也就是说/data/local.prop只有在userdebug/eng的情况下,才会被系统加载。user版系统永久开启isLoggable原理

在前文《Android 5.0 如何正确启用isLoggable(一)__使用详解》中,已给出使能isLoggable的方法以及各种方法间的优劣对比。其中,如果当前设备是user版,但在获取root权限之后能够永久开启isLoggable。通过前面的分析可以知道,在user版系统中,/data/local.prop属性文件是不会被property service读取的,但/system/build.prop属性文件无论user还是userdebug/eng版本都会读取,因此直接将log.tag.<Your_Tag>追加到/system/build.prop文件中即可。

也可以使用以下脚本(Windows)设置isLoggable的属性&#;( 需要adbd获取root权限即能够使用adb remount ):

其中local.prop内容如下: 脚本同步更新到github上,后续如有更新请查看github小结

起初,看到android.util.Log.isLoggable(TAG, android.util.Log.DEBUG)代码,想当然的认为如果在userdebug的版本中isLoggable会返回true,结果查看后发现相关log并没有打印,进一步的分析后发现isLoggable背后的实现原理,同时也体会到了使用isLoggable控制log输出的灵活性。对于开发者来说,可以很好的利用isLoggable开启user版系统中的隐藏log,从而为相关问题提供更详细的log。对于isLoggable的重要知识点,总结如下:

1. isLoggable默认阈&#;是4 (INFO)

如果log level小于4 (INFO),即3 (DEBUG) 和2 (VERBOSE),则isLoggable返回false;

2. isLoggable可以通过设置属性&#;使其返回true

通过设置如log.tag.InCall D的属性,可以使得对应的isLoggable返回true,但需要注意的是,在设置属性之后需要重启相关进程,也可以通过adb shell stop & adb shell start重启Zygote及其子进程,不过该方法在完全重启设备后失效;

3. 设置属性文件可以永久使isLoggable返回true

在userdebug/eng版本中,可以将属性&#;log.tag.InCall=D写入/data/local.prop文件,这样isLoggable返回为true,并且在设备重启之后依然有效。如果在user版的系统中已经获取到root权限,可以向/system/build.prop中追加属性&#;,也可以达到重启后永久使isLoggable返回true的目的;

参考:

深入讲解Android Property机制 :本文详细分析了Android 4.4 Android Property的各个流程

Android的init过程(二):初始化语言(init.rc)解析:本文详细分析init.rc的解析过程,注意nargs在解析是会先执行nargs&#;&#;

Android SystemProperties设置/取得系统属性的用法总结:本文是Android Property系统的集合贴

相关资源免积分下载:戳这里

shape和selector的结合使用 shape和selector是AndroidUI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector。可以这样说,shape和selecto

android ListView之——ArrayAdapter使用 android开发中有一个非常重要的组件之一——ListView,我们使用的软件基本都会用到ListView。提到ListView,有三个元素组成来显示出列表效果,分别是:①

ART GC介绍 学习了Android4.4ART的Mark-Sweep(MS)GC。到了Android5.0,ART增加了对CompactingGC的支持,包括Semi-Space(SS)、GenerationalSemi-Space(GSS)和Mark-Compact(MC)三种。总

标签: android怎么运行

本文链接地址:https://www.jiuchutong.com/biancheng/385952.html 转载请保留说明!

上一篇:揭开Android获取应用签名的神秘面纱(获取android_id)

下一篇:shape和selector的结合使用(shape form的区别)

  • 增值税有哪些二类税种
  • 质量赔偿款计入什么会计科目
  • 融资租赁业务如何高效拓展
  • 金税四期查到了怎么办
  • 用友项目核算科目的项目不能为空
  • 开一般户需要提交人行吗
  • 机械租赁带司机税目
  • 社保公积金计提是本月计提下月
  • 小规模增值税附加税税率
  • 减半征收附加税退回的分录
  • 房地产开发企业预缴增值税
  • 债务重组的会计准则
  • 事业单位缴纳税款比例
  • 会计凭证的填制与审核过程
  • 社团会费收取标准和管理办法
  • 企业出售产品
  • 城市建设综合配套费征收管理办法
  • 企业所得税汇算清缴退税账务处理
  • 营改增要交增值税吗
  • 上个月有留抵税这个月怎么结转税金
  • 商业保险税前扣除限额
  • 携税宝服务费可以入办公费吗
  • 固定资产拆下旧部件
  • 固定资产折旧应该考虑哪些因素
  • 外资企业税率是多少
  • 收到工伤保险的发票
  • 收到服务费发票怎么做账
  • centos停止发布
  • 如何搭建chatGPT
  • http://与www.开头的网站有何区别
  • 尚融宝盈(宁波)投资中心(有限合伙)
  • 怎样退出快手粉丝团 已解决
  • 损益类科目资产增加在借方还是贷方
  • 监事和财务负责人可以一个人么
  • 新个税讲解
  • vue自定义指令生命周期
  • 矿产资源补偿费是什么
  • 售后租回交易形成融资租赁,销售时不确认处置损益
  • 本期到期债务计算公式
  • 帝国cms如何使用
  • vue连接webapi
  • 未达起征点销售额
  • 个体定额和不定额有什么区别
  • 股权转让溢价款缴纳增值税
  • 政府会计计提折旧方法
  • 增值税发票内容填写不全应如何进行处理?
  • 回忆一下会计核算程序有哪几种?
  • 以前年度损益调整怎么做账
  • 折旧后的剩余价值叫什么
  • 4s店销售返利
  • 子公司的取得方式
  • 电费发票应收电费怎么开
  • 固定资产折旧年限的最新规定2023
  • 请创建一个die类
  • sql server m1
  • mac的command键相当于pc的什么键
  • centos防火墙策略配置
  • mac自带系统检测软件怎么用
  • windows任务栏变色
  • mac如何关闭开机密码
  • linux中的rpm什么意思
  • Win7系统打印机共享无法保存打印机设置0x000006d9
  • win7资源管理器不停的崩溃重启
  • win7关闭445端口 注册表
  • iptables防火墙规则
  • cocos2dx怎么安装
  • iframe transparent透明背景方法
  • angular nz
  • angular基础
  • 学javascript的书
  • python多线程异常后所有线程均不往下执行
  • Python简单格式化时间的方法【strftime函数】
  • js 调试
  • android自定义view的三大流程
  • python traits
  • 安徽国家税务局网上办税平台
  • 外经证办理流程在哪个网站申请
  • 天津海泰南路属于哪个区
  • 扣缴个人所得税客户端操作流程
  • 微观经济学的十大原理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设