CN116521487A - 日志打印方法、电子设备以及存储介质 - Google Patents
日志打印方法、电子设备以及存储介质 Download PDFInfo
- Publication number
- CN116521487A CN116521487A CN202310766659.7A CN202310766659A CN116521487A CN 116521487 A CN116521487 A CN 116521487A CN 202310766659 A CN202310766659 A CN 202310766659A CN 116521487 A CN116521487 A CN 116521487A
- Authority
- CN
- China
- Prior art keywords
- log
- printing
- program
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000007639 printing Methods 0.000 title claims abstract description 101
- 238000000034 method Methods 0.000 title claims abstract description 63
- 230000006870 function Effects 0.000 claims description 60
- 230000008569 process Effects 0.000 claims description 26
- 230000015654 memory Effects 0.000 claims description 25
- 239000003999 initiator Substances 0.000 claims description 6
- 230000001105 regulatory effect Effects 0.000 claims 3
- 239000000758 substrate Substances 0.000 claims 1
- 238000007726 management method Methods 0.000 description 76
- 238000004891 communication Methods 0.000 description 16
- 238000003780 insertion Methods 0.000 description 10
- 230000037431 insertion Effects 0.000 description 10
- 238000010295 mobile communication Methods 0.000 description 9
- 238000012545 processing Methods 0.000 description 9
- 238000011161 development Methods 0.000 description 6
- 238000010586 diagram Methods 0.000 description 6
- 230000009471 action Effects 0.000 description 5
- 230000001413 cellular effect Effects 0.000 description 3
- 238000010276 construction Methods 0.000 description 3
- 230000008676 import Effects 0.000 description 3
- 238000009434 installation Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000002688 persistence Effects 0.000 description 3
- 238000013528 artificial neural network Methods 0.000 description 2
- 230000003190 augmentative effect Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000001133 acceleration Effects 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 210000000988 bone and bone Anatomy 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000001914 filtration Methods 0.000 description 1
- 230000036541 health Effects 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000011056 performance test Methods 0.000 description 1
- 230000000644 propagated effect Effects 0.000 description 1
- 230000005855 radiation Effects 0.000 description 1
- 238000009877 rendering Methods 0.000 description 1
- 239000004984 smart glass Substances 0.000 description 1
- 230000005236 sound signal Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3065—Monitoring arrangements determined by the means or processing involved in reporting the monitored data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/302—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a software system
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请提供了日志打印方法、电子设备以及存储介质,涉及电子设备技术领域。该日志打印方法可以在程序的源代码中插入每个日志打印代码块的管控代码,并且管控代码先于日志打印代码块执行。如此,当用户使用的电子设备运行编译后的程序时,会在日志打印代码块执行之前,先执行管控代码,由管控代码判断是否需要打印日志。当判断不需要打印日志时,就可以直接跳过日志打印代码块的执行,从而避免调用日志打印代码块中的逻辑判断函数以及执行大量的字符串拼接指令,以避免多余的功耗开销,从而提升电子设备的性能。
Description
技术领域
本申请涉及电子设备技术领域,尤其涉及一种日志打印方法、电子设备以及存储介质。
背景技术
在终端设备的程序开发阶段,比如Java程序的开发阶段,开发人员在开发一些功能时,为了分析和定位功能开发过程中遇到的问题,会在Java程序的源代码中添加大量的日志打印代码块(指包括至少一行日志打印代码的代码块),以通过执行日志打印代码块打印相应的日志,然后依据打印的日志对Java程序进行调试。在程序开发完成之后,开发人员会对Java程序进行编译,并将编译后的Java程序移植到用户的手机上进行运行,以实现相应的功能。
用户在使用手机时,不需要像开发人员一样分析定位技术问题,也就没有日志打印的需求。但是,用户使用的Java程序仍然是开发人员开发的版本,如前所述,该版本中Java程序的源代码被添加了大量的日志打印代码块。这样,用户的手机在运行Java程序的过程中会执行大量的日志打印代码块,造成多余的功耗开销,从而影响手机的性能。
发明内容
本申请的一些实施方式提供了一种日志打印方法、电子设备以及计算机可读存储介质,以下从多个方面介绍本申请,以下多个方面的实施方式和有益效果可互相参考。
第一方面,本申请提供了一种日志打印方法,用于电子设备,方法包括:运行第一程序;检测到第一程序运行过程中产生的第一事件;基于第一事件对应的打印程序的管控信息确定是否打印第一事件;对应于管控信息为第一管控信息时,确定不打印第一事件。
其中,本申请提及的程序可以是Java程序,第一事件可以是日志,打印程序可以是打印代码块,管控信息可以是管控代码。管控代码可以包括逻辑判断函数,逻辑判断函数可以包括第一标记,第一管控信息可以是第一标记对应的逻辑值为第一值时的管控信息。
根据本申请实施方式,电子设备运行程序的过程中,在检测到该程序运行过程中产生的事件时,可以基于事件对应的打印程序的管控信息确定是否打印该事件。例如,当管控信息为第一管控信息时,可以直接不打印该事件,即不执行该事件对应的打印程序。如此,可以避免多余的功耗,从而提升电子设备的性能。
在一些实施例中,管控信息包括逻辑判断函数,逻辑判断函数包括第一标记,第一标记的逻辑值表征是否执行打印程序;打印程序用于打印第一事件;第一管控信息为第一标记对应的逻辑值为第一值时的管控信息。
其中,本申请提及的第一标记可以是管控代码中的变量参数,逻辑值可以为第一值或第二值,第一值可以是False,第二值可以是True。
根据本申请实施方式,可以通过设置第一标记的逻辑值,对日志的打印进行管控。例如,在第一标记的逻辑值为第一值时,程序运行时基于第一标记的逻辑值为第一值,确定不打印事件,也就不执行打印程序,从而避免多余的功耗开销。
在一些实施例中,第一标记用于指示打印程序打印第一事件的级别。
根据本申请实施方式,由于第一标记可以指示日志的级别,这样可以通过设置第一标记的逻辑值,对各个级别的日志进行管控,使得程序在运行中仅打印某些级别的日志,以满足后续程序维护时,需要打印某些级别的日志的需求。
在一些实施方式中,管控信息还包括起始符和结束符,逻辑判断函数和起始符位于打印程序对应的打印代码块的前面;结束符位于打印代码块的后面。
其中,打印代码块可以是日志打印代码块。
根据本申请实施方式,逻辑判断函数、起始符和结束符构成完整了的管控代码,并且,逻辑判断函数和起始符位于打印代码块的前面,这样管控代码就会先于打印代码块执行,从而可以在执行到打印代码块之前,判断是否执行打印代码块。
在一些实施方式中,逻辑判断函数、起始符和打印代码块的起始语句位于同一代码行;结束符和打印代码块的结束语句位于同一代码行。
根据本申请实施方式,管控代码是在程序开发完成之后插入到程序的源代码中的。在插入时,让逻辑判断函数、起始符和打印代码块的起始语句处于同一代码行,以及让结束符和打印代码块的结束语句位于同一代码行,可以保持程序中各个代码的行号不变,从而不影响后续分析时对代码的定位。
在一些实施方式中,对应于管控信息为第一管控信息时,确定不打印第一事件,包括:对应于管控信息为第一管控信息时,确定不执行打印程序。
根据本申请实施方式,当管控代码中逻辑判断函数的变量参数被设置为False时,表示不需要打印日志。电子设备运行程序时,可以直接跳过日志打印代码块,无需执行字符串的拼接指令,从而避免出现多余的功耗,提升电子设备的性能。
在一些实施方式中,方法还包括:对应于管控信息为第二管控信息时,执行打印程序,以确定是否打印第一事件。
在一些实施方式中,执行打印程序,以确定是否打印第一事件,包括:判断打印程序打印第一事件的级别是否高于或等于预设级别;若是,则打印第一事件;若否,则不打印第一事件。
第二方面,本申请实施方式提供了一种电子设备,包括:存储器,用于存储由电子设备的一个或多个处理器执行的指令;处理器,当处理器执行存储器中的指令时,可使得电子设备执行本申请第一方面所述的方法。第二方面能达到的有益效果可参考第一方面任一实施方式所提供的方法的有益效果,此处不再赘述。
第三方面,本申请实施方式提供了一种计算机可读存储介质,计算机可读存储介质上存储有指令,该指令在计算机上执行时可使计算机执行第一方面任一实施方式所述的方法。第三方面能达到的有益效果可参考第一方面任一实施方式所提供的方法的有益效果,此处不再赘述。
附图说明
图1为本申请实施例的示例性应用场景;
图2为一些实施例提供的日志打印代码的示例图;
图3为本申请实施例提供的插入管控代码的流程示例图;
图4为本申请实施例提供的管控代码的示例图一;
图5为本申请实施例提供的管控代码的示例图二;
图6为本申请实施例提供的日志打印方法的流程示意图;
图7为本申请实施例提供的程序编译的流程示例图;
图8为一些实施例提供的未插入管控代码时手机打印日志的原理示例图;
图9为本申请实施例提供的插入管控代码后手机打印日志的原理示例图;
图10为本申请实施例提供的日志管控级别的设置原理示例图;
图11为本申请实施例的版本构建的流程示例图;
图12示出了本申请实施例提供的日志插桩工具插入管控代码的流程示例图;
图13示出了本申请实施例提供的电子设备的构造示意图。
具体实施方式
本申请实施方式用于提供一种日志打印方法。通过本申请提供的方法,可以提升电子设备的性能。
图1示出了本申请的示例性应用场景。参考图1,为了满足一些功能需求,开发人员可以在计算机10上开发程序,例如,Java程序。在Java程序开发完成之后,可以将编译后的Java程序移植到手机20上进行运行,以实现相应的功能。
本申请中,计算机10和手机20仅作为示例性说明,不作为对本申请的限制。在其他实施例中,计算机10也可以为服务器等其他支持程序开发的电子设备,手机20也可以为笔记本电脑、平板、大屏设备、可穿戴设备(例如,手表,智能眼镜,头盔),台式电脑、增强现实(Augmented Reality,AR)/虚拟现实(Virtual Reality,VR)设备、个人数字助理(PersonalDigital Assistant,PDA)等其他支持运行该程序的电子设备。
但是,在程序开发阶段,为了分析和定位问题,开发人员会在Java程序的源代码中添加一些日志打印代码块,这就导致手机20运行编译后的Java程序时,会频繁地打印日志,从而导致处理器的功耗增加,影响手机20的性能。
可以理解,手机20的运行阶段属于用户使用阶段。在该阶段,程序已经开发完成,就不需要再打印日志。因此,需要对日志的打印进行管控,以保证在该阶段手机20不再打印日志。
由于Java程序的代码量通常较大,在开发的过程中也会遇到较多的技术问题,开发人员会在源代码中添加较多的日志打印代码块。在此情况下,如果采用人工的方式删除日志打印代码块,效率较低,且难以实现。
在一些实施例中,可以将日志划分成多个级别,并在系统中预先设置日志管控级别。如果请求打印的日志级别高于或等于日志管控级别,则允许打印该级别的日志;如果请求打印的日志级别低于日志管控级别,则不允许打印该级别的日志。
例如,可以将日志从高到低依次划分成如下级别:off、fatal、error、warn、info、debug、trace、all。下面对各级别进行说明:
off:最高级别,不打印日志。
fatal:指明非常严重的可能会导致应用终止执行错误事件。
error:指明错误事件,但应用可能还能继续运行。
warn:指明可能潜在的危险状况。
info:指明描述信息,从粗粒度上描述了应用运行过程。
debug:指明细致的事件信息,用于程序的调试。
trace:指明程序运行轨迹,比debug级别的粒度更细。
all:最低的日志级别,用于打印所有日志。
示例性地,假设预先将日志管控级别设置为fatal级别,则当手机20运行到如图2所示的日志打印代码块(记作为“日志打印代码块R1”)时,会调用日志打印函数Log.d()判断当前请求打印的日志级别是否高于或等于日志管控级别,并根据判断结果确定是否打印日志。由于日志打印代码块R1请求打印的日志级别为debug级别,低于fatal级别,因此,手机20不会打印日志。
但是,日志打印函数Log.d()中包括字符串拼接代码,而字符串拼接代码被编译后会生成多条字符串拼接指令。当手机20调用日志打印函数Log.d()时,会先执行这些字符串拼接指令,再执行日志打印的判断动作。在此情况下,手机20虽然不打印日志,但是还是会执行大量的字符串拼接指令,造成多余的功耗开销,从而影响手机20的性能。
为了解决上述技术问题,本实施例提供了一种日志打印方法。本实施例提供的方法中,在程序开发阶段,可以在程序中添加管控信息(例如,管控代码),管控信息用于确定是否执行对应的打印程序,即确定是否打印相应的事件(即日志)。这样,在电子设备运行程序时,在检测到该程序运行过程中产生的事件时,可以基于事件对应的打印程序的管控信息确定是否打印该事件。例如,当管控信息为第一管控信息时,例如管控代码中逻辑判断函数的变量参数对应的逻辑值为False时,可以直接不打印该事件,即不执行该事件对应的打印程序,即不会执行上述的日志打印代码块,也就不会执行字符串拼接指令。如此,可以避免多余的功耗开销,从而提升电子设备的性能。
可以理解,当管控代码中逻辑判断函数的变量参数对应的逻辑值为True时,即管控信息为第二管控信息时,可以执行打印程序,即首先进行字符串拼接指令。然后进行基于逻辑判断函数中指示的日志级别以及预设的日志管控级别,确定是否打印事件。
下文以计算机10和手机20为例对本申请的方案进行叙述说明。
本申请实施例是先由计算机10在Java程序的源代码中插入日志打印代码块的管控代码,然后在插入完成之后,对Java程序的源代码进行编译,再将编译后的Java程序移植到手机20上进行运行。
下面先介绍管控管控代码的插入过程。
图3示出了管控代码的插入过程的流程示例图。管控代码的插入由计算机10执行,参考图3,包括以下步骤:
S101,识别第一程序的源代码中的日志打印代码块(或称为“打印代码块”)和日志打印代码块请求打印的日志级别。
本申请对第一程序的程序类型不作限定,第一程序可以为Java程序、C语言程序、C++程序等语言类型的程序。本实施例将Java程序作为第一程序的示例。
在开发人员在计算机10上开发完成Java程序之后,在预编译阶段,计算机10可以调用日志插桩工具(一种集成于安卓编译系统中可自动插入代码的工具)对该Java程序的源代码进行循环扫描,以识别该源代码中的日志打印代码块,以及该日志打印代码块请求打印的日志级别。
S102,基于日志打印代码块请求打印的日志级别,生成日志打印代码块的管控代码。
示例性地,在日志插桩工具识别到日志打印代码块R1之后,可以根据日志打印代码块R1请求打印的日志级别(debug级别),生成管控代码“if(LogControl.D){}”。其中,if(LogControl.D)为逻辑判断函数,LogControl.D为变量参数(作为第一标记),“{”为起始符,“}”为结束符。
逻辑判断函数的变量参数LogControl.D是根据日志打印代码块R1请求打印的日志级别确定的。例如,若日志打印代码块R1请求打印的日志级别为warn级别,其具体的日志打印函数为Log.w(),则逻辑判断函数的变量参数为LogControl.W。
LogControl.D的值可以根据实际的场景需求进行设定。例如,当需要打印日志时,将LogControl.D的逻辑值设置为Ture(作为第一值的示例)。当不需要打印日志时,将LogControl.D的逻辑值设置为False(作为第二值的示例)。
可以理解,本实施例中,手机20不需要打印日志。因此可以将LogControl.D的逻辑值应设置为False,以跳过日志打印代码块R1,避免调用日志打印函数Log.d(),以及避免执行字符串拼接指令。
可以理解,上述逻辑值的方式只是举例说明,本申请在此不做限定。
S103,在第一程序的源代码中插入管控代码。
可以理解,Java程序在开发完成之后,其源代码的代码行号是确定的。因此对Java程序的源代码编译后生成的符号表也是确定的。其中,符号表用于解析手机20导出的dump文件(一种进程的内存镜像文件,用于调试程序)。在对dump文件进行解析时,会根据符号表确定代码行号,然后根据代码行号确定出现问题的代码行,也就能定位问题代码。
在一些实施例中,插桩工具可以将日志打印代码块R1向下移动一行,此时,日志打印代码块R1的起始行号从22582更新为22583,结束行号从22584更新为22585。然后,参考图4,插桩工具再在日志打印代码块R1的上一行(其行号为22582)插入“if(LogControl.D){”,以及在日志打印代码块R1的下一行(其行号为22586)插入“}”。
在插入管控代码之后,日志打印代码块R1的行号发生了变化。并且,日志打印代码块R1下方代码的行号也随之发生了变化。而代码行号的变化,会影响代码的定位,使得后续在对程序进行维护时,难以定位出现问题的代码。因此,在插入管控代码时,应保证代码行号保持不变。
本实施例中,参考图5,插桩工具可以获取日志打印代码块R1的起始行号和结束行号,然后分别根据起始行号和结束行号,确定日志打印代码块的起始语句和结束语句,并在起始语句的前面插入“if(LogControl.D){”,以及在结束语句的后面插入“}”。这样,可以保证插入管控代码后,源代码的代码行号保持不变,从而不影响程序的后续维护。
综上,本实施例中,计算机10在日志打印代码块的前面插入管控代码,可以使得在手机20运行程序过程中,提前由程序中的管控代码去执行日志打印的判断动作,而无需进入到日志打印代码块再进行判断。并且,当管控代码判断不打印日志时,可以直接跳过日志打印代码块,无需进入日志打印代码块去调用日志打印函数以及执行字符串拼接指令,从而可以提高手机20的运行速度,进而提升手机20的性能。
上述实施例介绍了管控代码的插入过程,下面对管控代码的运行过程进行介绍。
图6为本申请实施例提供的日志打印方法的流程示意图。该方法由手机20执行,参考图6,该方法包括以下步骤:
S201,获取第一程序的安装包。其中,第一程序的源代码包括日志打印代码块以及日志打印代码块的管控代码,管控代码包括第一标记,第一标记表征是否需要打印日志,并且,管控代码先于日志打印代码块执行。
下文继续以Java程序为第一程序为例进行叙述说明。
在日志插桩工具在Java程序的源代码中插入管控代码之后,计算机10对Java程序的源代码进行编译。并在编译完成之后,将编译后的Java程序移植到手机20上进行运行。
例如,参考图7,在预编译阶段,日志插桩工具可以分别在A1.java、B1.java、C1.java(作为Java程序的源代码)中静态插入管控代码得到A2.java、B2.java、C2.java。然后,在编译阶段,计算机10可以调用编译器javac分别将A2.java、B2.java、C2.java编译成各自对应的class文件:A2.class、B2.class、C2.class,然后再调用编译工具dx或d8按照dex文件格式将A2.class、B2.class、C2.class合并到一起,得到class.dex文件。然后,再将class.dex文件打包成安卓安装包(Android application package,APK)。
计算机10将编译后的Java程序打包成APK之后,可以将该APK上传至网络,由手机20在上传的网络上进行下载,或者,直接将该APK发送给手机20。
S202,基于安装包,安装第一程序并运行。
手机20获取到Java程序的APK后,基于该APK安装Java程序并运行。
S203,基于第一程序执行到管控代码,根据管控代码的第一标记的预设值,确定是否执行日志打印代码块。若否,则执行步骤S204;若是,则执行步骤S205。
当手机20执行到管控代码时,调用if(LogControl.D)函数,判断LogControl.D的逻辑值(或称为“预设值”)是否为True,若是,则确定执行日志打印代码块;若否,则确定不执行日志打印代码块。
S204,跳过日志打印代码块,执行日志打印代码块的下一行代码。
当LogControl.D的逻辑值为False时,跳过日志打印代码块,执行日志打印代码块的下一行代码。
S205,执行日志打印代码块,判断请求打印的日志级别是否高于或等于预设的日志管控级别。若是,则执行步骤S206;若否,则执行步骤S207。
当LogControl.D的逻辑值为True时,执行日志打印代码块。为了叙述的连贯性,在下文中对日志打印代码块的具体执行过程进行叙述说明。
S206,打印对应日志级别的日志。
例如,若日志管控级别为trace级别,日志打印代码块请求打印的日志级别为debug级别(高于trace级别),则打印debug级别的日志。
S207,不打印日志,执行日志打印代码块的下一行代码。
例如,日志管控级别为info级别,若日志打印代码块请求打印的日志级别为debug级别(低于info级别),则不打印debug级别的日志,继续执行日志打印代码块的下一行代码。
可以理解,为了保证手机20在运行时不调用日志打印函数,避免出现多余的功耗,本实施例中,可以将LogControl.D的逻辑值设置为False。这样,在上述步骤S202中就会判断手机20需要打印日志,从而跳过日志打印代码块,执行后续代码。
综上,本实施例中,在程序的源代码中插入管控代码之后,手机20在运行该程序的过程中,当管控代码判断手机20不需要打印日志时,可以直接跳过日志打印代码块,从而避免执行日志打印函数的调用,以及避免字符串拼接指令的执行。这样,可以减少日志打印代码块的执行所带来的性能消耗,从而提升手机20的性能。
图8示出了未插入管控代码时手机20打印日志的过程。参考图8,安卓系统包括应用层、应用框架(Framework)层、本地服务(Native)层和内核(Kernel)层。
其中,应用层可以包括应用程序A、应用程序B、应用程序C、应用程序D等应用程序。
应用框架层可以包括Log.java打印接口、Slog.java打印接口和Rlog.java打印接口等日志打印接口。
本地服务层可以包括libog库(一种日志库)和Java本地(Java NativeInterface,JNI)接口。JNI接口可以调用writeEvent函数、Android_uitil_EventLog_writeEvent_Integer函数、write_to_log函数执行相关的打印指令(例如,字符串的拼接指令)。
内核层可以包括日志记录器(logger device)以及一些可调用的函数,例如,__write_to_log_kernel函数、logger_init函数、init_log函数等。在JNI接口调用到内核层时,可以调用内核层的__write_to_log_kernel函数将日志写入日志记录器,以及调用logger_init函数、init_log函数等执行相应的指令,例如,日志级别管控,打开设备文件,将日志写入设备文件,Log驱动写入数据等。
下面对未插入管控代码时日志打印的过程进行介绍。
当手机20在应用层执行到日志打印代码块并调用日志打印函数时,应用层会调用应用框架层中预先封装好的日志打印接口(例如,Log.java打印接口,Slog.java打印接口,Rlog.java打印接口等)(即调用日志打印函数),然后通过日志打印接口调用本地服务层中的Java本地(Java Native Interface,JNI)接口,再通过JNI接口调用liblog库,接着通过liblog库在内核层调用__write_to_log_kernel函数,将日志写入到日志记录器中。
最后,日志记录器判断该日志打印代码块请求打印的日志级别是否高于或等于预设的日志管控级别。若是,则将日志打印代码块请求打印的日志级别的日志写入到对应的设备文件,若否,则不做任何操作。可以理解,在未插入管控代码时,对日志打印的管控只是在内核层控制是否将日志写入设备文件(即控制日志是否落盘),而并没有控制日志打印代码块的执行,也就无法避免日志打印代码块被执行时带来的功耗。
图9示出了插入管控代码后手机20打印日志的过程。
参考图9,在插入管控代码后,可以在应用框架层对日志打印接口进行管控。
具体地,当手机20在应用层执行到管控代码时,可以调用管控代码中的逻辑判断函数在应用框架层判断是否执行日志打印代码块。若是,则执行日志打印代码块,此时,允许调用日志打印接口;若否,则跳过日志打印代码块,此时,不允许调用日志打印接口。
一些情况下,当逻辑判断函数中变量参数(例如LogControl.D)的逻辑值的True时,管控代码确定执行日志打印代码块。此时,手机20会调用应用框架层中的日志打印接口,然后通过日志打印接口调用本地服务层中JNI接口,再通过JNI接口调用liblog库,接着通过liblog库调用内核层的__write_to_log_kernel函数将日志写入到日志记录器中。
最后,日志记录器判断该日志打印代码块请求打印的日志级别是否高于或等于预设的日志管控级别。若是,则将日志打印代码块请求打印的日志级别的日志写入对应的设备文件中,若否,则不做任何操作。
在另一些情况下,当逻辑判断函数中变量参数的逻辑值的False时,管控代码确定不执行日志打印代码块。此时,跳过日志打印代码块,执行日志打印代码块的下一行代码。为了避免执行日志打印代码块,可以将逻辑判断函数中的变量参数设置为False,这样在应用框架层进行判断时,判断的结果就会是跳过日志打印代码块。根据图8和图9所描述的过程可知,插入日志打印代码的管控代码,可以将日志打印的判断动作从内核层提前到应用框架层,从而可以控制日志打印代码块的执行,进而避免日志打印代码块被执行时带来的功耗。
本申请中,为了满足不同的场景需求,可以将Java程序构建成不同的版本,例如,用户版本,调试版本,性能测试版本等。
参考图10,可以根据版本类型persist.log.tag(日志管控级别的标志位)设置成不同的日志级别,作为日志管控级别。例如,对于性能调试版本可以将persist.log.tag设置为info级别。
当手机20运行到的日志打印代码块时,可以根据persist.log.tag判断日志管控级别,并根据日志管控级别,打印对应级别的日志。例如,若日志管控级别为error,则打印error及以上级别的日志。若日志管控级别为warn,则打印warn及以上级别的日志。若日志管控级别为info,则打印info及以上级别的日志。
在一些实施例中,可以通过设置prop的属性值,控制persist.log.tag对应的日志级别。
图11示出了版本的构建过程。参考图11,包括以下步骤:
S301,启动编译系统。
在开发人员在计算机10上开发完成Java程序之后,计算机10可以启动编译系统,进入到预编译阶段。
S302,解析编译命令参数。
对于不同的版本,可以设置不同的编译命令参数,以根据编译命令参数,确定是否在Java程序的源代码中插入管控代码。
S303,判断是否插入管控代码。若是,则执行步骤S304;若否,则执行步骤S306。
根据编译命令参数判断是否插入管控代码。例如,若编译命令参数为Ture,则判断需要插入管控代码,若编译命令参数为False,则判断不需要插入管控代码。
S304,调用日志插桩工具执行插桩操作。
当判断需要插入管控代码时,可以调用编译系统中日志插桩工具在Java程序的第一源代码中插入日志打印代码块的管控代码。
S305,使用检查工具检查插桩结果。
在管控代码插入完成之后,可以调用检查工具对插入后的管控代码进行检查。
S306,执行编译操作。
对插入后的管控代码检查完成后,调用编译系统对Java程序的源代码进行编译。
S307,完成版本构建。
在编译完成之后,完成相应版本的构建。
图12示出了日志插桩工具插入管控代码的过程的流程示例图。
参考图12,在插入管控代码时,插桩工具可以从系统的配置文件中解析插桩目录,并遍历待扫描目录下的Java文件(第一源代码的文件),然后使用Javaparser库将源代码解析成语法树。判断是否系统是否调用日志打印工具(例如,import android.tuil.Log、import android.tuil.Sog、import android.tuil.Rog),若否,则遍历下一个Java文件;若是,则使用Javaparser库遍历语法树中的MethodCallExpr节点。
然后判断当前遍历节点的node.Scope是否为Log、Slog或Rlog。若否,则遍历下一个MethodCallExpr节点;若是,则判断当前节点的node.Name是否为日志级别的标识(例如,t(trace级别)、d(debug级别)、i(info级别)、w(trace级别)、e(error级别)等)。若否,则遍历下一个MethodCallExpr节点,若是,则使用当前节点重新构建一个ifStmt语句。然后,将原来的节点替换成重新构建的ifStmt语句。
接着,判断语法树是否遍历完成,若否,则遍历下一个MethodCallExpr节点,若是,则使用插桩后的语法树生成新的Java文件。然后,生成该Java文件插桩前后的diff信息,用于检查插桩操作的正确性。最后判断Java文件是否遍历结束,若否,则遍历下一个待扫描目录下的下一个Java文件,若是,则结束,完成该Java文件的插桩。
图13示出了电子设备100的结构示意图。电子设备100可以包括处理器110,外部存储器接口120,内部存储器121,通用串行总线(universal serial bus,USB)接头130,充电管理模块140,电源管理模块141,电池142,天线1,天线2,移动通信模块150,无线通信模块160,音频模块170,扬声器170A,受话器170B,麦克风170C,耳机接口170D,传感器模块180,按键190,马达191,指示器192,摄像头193,显示屏194,以及用户标识模块(subscriberidentification module,SIM)卡接口195等。其中传感器模块180可以包括压力传感器180A,陀螺仪传感器180B,气压传感器180C,磁传感器180D,加速度传感器180E,距离传感器180F,接近光传感器180G,指纹传感器180H,温度传感器180J,触摸传感器180K,环境光传感器180L,骨传导传感器180M等。
可以理解的是,本发明实施例示意的结构并不构成对电子设备100的具体限定。在本申请另一些实施例中,电子设备100可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
处理器110可以包括一个或多个处理单元,例如:处理器110可以包括应用处理器(application processor,AP),调制解调处理器,图形处理器(graphics processingunit,GPU),图像信号处理器(image signal processor,ISP),控制器,视频编解码器,数字信号处理器(digital signal processor,DSP),基带处理器,和/或神经网络处理器(neural-network processing unit,NPU)等。在一些实施例中,处理器110可以包括一个或多个接口。接口可以包括集成电路(inter-integrated circuit,I2C)接口,集成电路内置音频(inter-integrated circuit sound,I2S)接口,脉冲编码调制(pulse codemodulation,PCM)接口,通用异步收发传输器(universal asynchronous receiver/transmitter,UART)接口,移动产业处理器接口(mobile industry processor interface,MIPI),通用输入输出(general-purpose input/output,GPIO)接口,用户标识模块(subscriber identity module,SIM)接口。
充电管理模块140用于从充电器接收充电输入。其中,充电器可以是无线充电器,也可以是有线充电器。在一些有线充电的实施例中,充电管理模块140可以通过USB接头130接收有线充电器的充电输入。在一些无线充电的实施例中,充电管理模块140可以通过电子设备100的无线充电线圈接收无线充电输入。充电管理模块140为电池142充电的同时,还可以通过电源管理模块141为电子设备供电。
电源管理模块141用于连接电池142,充电管理模块140与处理器110。电源管理模块141接收电池142和/或充电管理模块140的输入,为处理器110,内部存储器121,显示屏194,摄像头193,和无线通信模块160等供电。电源管理模块141还可以用于监测电池容量,电池循环次数,电池健康状态(漏电,阻抗)等参数。在其他一些实施例中,电源管理模块141也可以设置于处理器110中。在另一些实施例中,电源管理模块141和充电管理模块140也可以设置于同一个器件中。
电子设备100的无线通信功能可以通过天线1,天线2,移动通信模块150,无线通信模块160,调制解调处理器以及基带处理器等实现。
天线1和天线2用于发射和接收电磁波信号。电子设备100中的每个天线可用于覆盖单个或多个通信频带。不同的天线还可以复用,以提高天线的利用率。例如:可以将天线1复用为无线局域网的分集天线。在另外一些实施例中,天线可以和调谐开关结合使用。
移动通信模块150可以提供应用在电子设备100上的包括2G/3G/4G/5G等无线通信的解决方案。移动通信模块150可以由天线1接收电磁波,并对接收的电磁波进行滤波,放大等处理,传送至调制解调处理器进行解调。移动通信模块150还可以对经调制解调处理器调制后的信号放大,经天线1转为电磁波辐射出去。在一些实施例中,移动通信模块150的至少部分功能模块可以被设置于处理器110中。在一些实施例中,移动通信模块150的至少部分功能模块可以与处理器110的至少部分模块被设置在同一个器件中。
调制解调处理器可以包括调制器和解调器。其中,调制器用于将待发送的低频基带信号调制成中高频信号。解调器用于将接收的电磁波信号解调为低频基带信号。随后解调器将解调得到的低频基带信号传送至基带处理器处理。低频基带信号经基带处理器处理后,被传递给应用处理器。应用处理器通过音频设备(不限于扬声器170A,受话器170B等)输出声音信号,或通过显示屏194显示图像或视频。在一些实施例中,调制解调处理器可以是独立的器件。在另一些实施例中,调制解调处理器可以独立于处理器110,与移动通信模块150或其他功能模块设置在同一个器件中。
无线通信模块160可以提供应用在电子设备100上的包括无线局域网(wirelesslocal area networks,WLAN)(如无线保真(wireless fidelity,Wi-Fi)网络),蓝牙(bluetooth,BT),全球导航卫星系统(global navigation satellite system,GNSS),调频(frequency modulation,FM),近距离无线通信技术(near field communication,NFC),红外技术(infrared,IR)等无线通信的解决方案。无线通信模块160可以是集成至少一个通信处理模块的一个或多个器件。无线通信模块160经由天线2接收电磁波,将电磁波信号调频以及滤波处理,将处理后的信号发送到处理器110。无线通信模块160还可以从处理器110接收待发送的信号,对其进行调频,放大,经天线2转为电磁波辐射出去。
在一些实施例中,电子设备100的天线1和移动通信模块150耦合,天线2和无线通信模块160耦合,使得电子设备100可以通过无线通信技术与网络以及其他设备通信。
电子设备100通过GPU,显示屏194,以及应用处理器等实现显示功能。GPU为图像处理的微处理器,连接显示屏194和应用处理器。GPU用于执行数学和几何计算,用于图形渲染。处理器110可包括一个或多个GPU,其执行程序指令以生成或改变显示信息。
显示屏194用于显示图像,视频等。显示屏194包括显示面板。在一些实施例中,电子设备100可以包括1个或N个显示屏194,N为大于1的正整数。
电子设备100可以通过ISP,摄像头193,视频编解码器,GPU,显示屏194以及应用处理器等实现拍摄功能。
外部存储器接口120可以用于连接外部存储卡,例如Micro SD卡,实现扩展电子设备100的存储能力。外部存储卡通过外部存储器接口120与处理器110通信,实现数据存储功能。例如将音乐,视频等文件保存在外部存储卡中。
内部存储器121可以用于存储计算机可执行程序代码,所述可执行程序代码包括指令。内部存储器121可以包括存储程序区和存储数据区。其中,存储程序区可存储操作系统,至少一个功能所需的应用程序(比如图像播放功能等)等。存储数据区可存储电子设备100使用过程中所创建的数据(比如音频数据,电话本等)等。此外,内部存储器121可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件,闪存器件等。处理器110通过运行存储在内部存储器121的指令,和/或存储在设置于处理器中的存储器的指令,执行电子设备100的各种功能应用以及数据处理。
电子设备100可以通过音频模块170,扬声器170A,受话器170B,麦克风170C,耳机接口170D,以及应用处理器等实现音频功能。例如音乐播放,录音等。
本申请公开的各实施例可以被实现在硬件、软件、固件或这些实现方法的组 合中。本申请的实施例可实现为在可编程系统上执行的计算机程序或程序代码,该可编程 系统包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备。
可将程序代码应用于输入指令,以执行本申请描述 的各功能并生成输出信息。可以按已知方式将输出信息应用于一个或多个输出设备。为了本申请的目的,处理系统包括具有诸如例如数字信号处理器(DSP)、微控制器、专用集成电路(ASIC)或微处理器之类的处理器的任何系统。
程序代码可以用高级程序化语言或面向对象的编程语言来实现,以便与处理系统通信。在需要时,也可用汇编语言或机器语言来实现程序代码。事实上,本申请中描述的机制 不限于任何特定编程语言的范围。在任一情形下,该语言可以是编译语言或解释语言。
在一些情况下,所公开的实施例可以以硬件、固件、软件或其任何组合来实现。所公开的实施例还可以被实现为由一个或多个暂时或非暂时性机器可读(例如,计算机可读)存储介质承载或存储在其上的指令,其可以由一个或多个处理器读取和执行。例如,指令可以通过网络或通过其他计算机可读介质分发。因此,机器可读介质可以包括用于以机器(例如,计算机)可读的形式存储或传输信息的任何机制,包括但不限于,软盘、光盘、光碟、只读存储器(CD-ROMs)、磁光盘、只读存储器(ROM)、随机存取存储器(RAM)、可擦除可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)、磁卡或光卡、闪存、或用于利用因特网以电、光、声或其他形式的传播信号来传输信息(例如,载波、红外信号数字信号等)的有形的机器可读存储器。因此,机器可读介质包括适合于以机器(例如,计算机)可读的形式存储或传输电子指令或信息的任何类型的机器可读介质。
在附图中,可以以特定布置和/或顺序示出一些结构或方法特征。 然而,应该理解,可能不需要这样的特定布置和/或排序。 而是,在一些实施例中,这些特征可以以不同于说明性附图中所示的方式和/或顺序来布置。 另外,在特定图中包括结构或方法特征并不意味着暗示在所有实施例中都需要这样的特征,并且在一些实施例中,可以不包括这些特征或者可以与其他特征组合。
需要说明的是,本申请各设备实施例中提到的各单元/模块都是逻辑单元/模块,在物理上,一个逻辑单元/模块可以是一个物理单元/模块,也可以是一个物理单元/模块的一部分,还可以以多个物理单元/模块的组合实现,这些逻辑单元/模块本身的物理实现方式并不是最重要的,这些逻辑单元/模块所实现的功能的组合才是解决本申请所提出的技术问题的关键。此外,为了突出本申请的创新部分,本申请上述各设备实施例并没有将与解决本申请所提出的技术问题关系不太密切的单元/模块引入,这并不表明上述设备实施例并不存在其它的单元/模块。
需要说明的是,在本专利的示例和说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
虽然通过参照本申请的某些优选实施例,已经对本申请进行了图示和描述,但本领域的普通技术人员应该明白,可以在形式上和细节上对其作各种改变,而不偏离本申请的范围。
Claims (10)
1.一种日志打印方法,用于电子设备,其特征在于,所述方法包括:
运行第一程序;
检测到所述第一程序运行过程中产生的第一事件;
基于所述第一事件对应的打印程序的管控信息确定是否打印所述第一事件;
对应于所述管控信息为第一管控信息时,确定不打印所述第一事件。
2.根据权利要求1所述的方法,其特征在于,
所述管控信息包括逻辑判断函数,所述逻辑判断函数包括第一标记,所述第一标记的逻辑值表征是否执行所述打印程序;
所述打印程序用于打印所述第一事件;
所述第一管控信息为所述第一标记对应的逻辑值为第一值时的管控信息。
3.根据权利要求2所述的方法,其特征在于,所述第一标记用于指示所述打印程序打印所述第一事件的级别。
4.根据权利要求2所述的方法,其特征在于,所述管控信息还包括起始符和结束符,
所述逻辑判断函数和所述起始符位于所述打印程序对应的打印代码块的前面;
所述结束符位于所述打印代码块的后面。
5.根据权利要求4所述的方法,其特征在于,
所述逻辑判断函数、所述起始符和所述打印代码块的起始语句位于同一代码行;
所述结束符和所述打印代码块的结束语句位于同一代码行。
6.根据权利要求2所述的方法,其特征在于,所述对应于所述管控信息为第一管控信息时,确定不打印所述第一事件,包括:
对应于所述管控信息为所述第一管控信息时,确定不执行所述打印程序。
7.根据权利要求2所述的方法,其特征在于,所述方法还包括:
对应于所述管控信息为第二管控信息时,执行所述打印程序,以确定是否打印所述第一事件。
8.根据权利要求7所述的方法,其特征在于,所述执行所述打印程序,以确定是否打印所述第一事件,包括:
判断所述打印程序打印所述第一事件的级别是否高于或等于预设级别;
若是,则打印所述第一事件;
若否,则不打印所述第一事件。
9.一种电子设备,包括:
存储器,用于存储由所述电子设备的一个或多个处理器执行的指令;
处理器,当所述处理器执行所述存储器中的所述指令时,可使得所述电子设备执行权利要求1~8任一项所述的日志打印方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有指令,所述指令在计算机上执行时使得计算机执行权利要求1~8任一项所述的日志打印方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310766659.7A CN116521487A (zh) | 2023-06-27 | 2023-06-27 | 日志打印方法、电子设备以及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310766659.7A CN116521487A (zh) | 2023-06-27 | 2023-06-27 | 日志打印方法、电子设备以及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116521487A true CN116521487A (zh) | 2023-08-01 |
Family
ID=87397883
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310766659.7A Pending CN116521487A (zh) | 2023-06-27 | 2023-06-27 | 日志打印方法、电子设备以及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116521487A (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140149576A1 (en) * | 2012-11-29 | 2014-05-29 | Vladimir Pavlov | Managing Application Log Levels in Cloud Environment |
CN107577577A (zh) * | 2017-09-13 | 2018-01-12 | 郑州云海信息技术有限公司 | 日志分级打印的方法、装置、系统及计算机可读存储介质 |
CN110377244A (zh) * | 2019-07-12 | 2019-10-25 | 苏州浪潮智能科技有限公司 | 一种日志打印方法、装置、设备及存储介质 |
CN110858130A (zh) * | 2018-08-22 | 2020-03-03 | 网宿科技股份有限公司 | 日志打印方法及系统、服务器 |
CN113641634A (zh) * | 2021-07-07 | 2021-11-12 | 荣耀终端有限公司 | 一种日志流量控制的方法以及电子设备 |
CN113778348A (zh) * | 2020-06-10 | 2021-12-10 | 腾讯科技(深圳)有限公司 | 日志染色方法、装置、电子设备及计算机可读存储介质 |
CN114780333A (zh) * | 2022-04-07 | 2022-07-22 | 北京沃东天骏信息技术有限公司 | 一种日志打印控制方法和装置 |
-
2023
- 2023-06-27 CN CN202310766659.7A patent/CN116521487A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140149576A1 (en) * | 2012-11-29 | 2014-05-29 | Vladimir Pavlov | Managing Application Log Levels in Cloud Environment |
CN107577577A (zh) * | 2017-09-13 | 2018-01-12 | 郑州云海信息技术有限公司 | 日志分级打印的方法、装置、系统及计算机可读存储介质 |
CN110858130A (zh) * | 2018-08-22 | 2020-03-03 | 网宿科技股份有限公司 | 日志打印方法及系统、服务器 |
CN110377244A (zh) * | 2019-07-12 | 2019-10-25 | 苏州浪潮智能科技有限公司 | 一种日志打印方法、装置、设备及存储介质 |
CN113778348A (zh) * | 2020-06-10 | 2021-12-10 | 腾讯科技(深圳)有限公司 | 日志染色方法、装置、电子设备及计算机可读存储介质 |
CN113641634A (zh) * | 2021-07-07 | 2021-11-12 | 荣耀终端有限公司 | 一种日志流量控制的方法以及电子设备 |
CN114780333A (zh) * | 2022-04-07 | 2022-07-22 | 北京沃东天骏信息技术有限公司 | 一种日志打印控制方法和装置 |
Non-Patent Citations (2)
Title |
---|
LEO_LEI: "Java日志框架中需要判断log.isDebugEnabled()吗?", pages 1 - 4, Retrieved from the Internet <URL:《https://www.cnblogs.com/leiwei/p/14674143.html》> * |
小小千千: "日志对系统的性能影响", pages 1 - 2, Retrieved from the Internet <URL:《https://jason-qianhao.github.io/2023/01/23/ri-zhi-dui-xi-tong-de-xing-neng-ying-xiang/》> * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111625431B (zh) | 一种日志信息生成方法、装置及电子设备 | |
CN110633090B (zh) | 补丁方法、相关装置及系统 | |
CN111740948B (zh) | 数据包发布方法、动态更新方法、装置、设备及介质 | |
CN111274155B (zh) | 动态库的内存操作记录方法、装置、设备及存储介质 | |
CN110865837B (zh) | 一种进行系统升级的方法和终端 | |
CN115017096B (zh) | 数据迁移方法、可读介质和电子设备 | |
CN113641996B (zh) | 检测方法、图形界面及相关装置 | |
CN112068903A (zh) | 应用程序的加载方法、应用程序的加载装置、介质与设备 | |
CN113867848A (zh) | 图形接口的调用方法、装置、设备及可读存储介质 | |
CN113641988B (zh) | 沙箱初始化方法、图形界面及相关装置 | |
CN111125602A (zh) | 页面构建方法、装置、设备和存储介质 | |
WO2022030903A1 (ko) | 어플리케이션 설치 방법 및 이를 지원하는 전자 장치 | |
CN113391811B (zh) | 函数编译方法、装置、电子设备及计算机可读存储介质 | |
CN116483734B (zh) | 一种基于编译器的插桩方法、系统及相关电子设备 | |
CN116467221B (zh) | 一种基于解释器的插桩方法、系统及相关电子设备 | |
CN111414308B (zh) | 应用程序包的处理方法和应用程序的运行方法、装置 | |
CN116521487A (zh) | 日志打印方法、电子设备以及存储介质 | |
CN111258802A (zh) | 捕获应用程序崩溃信息的方法及相关设备 | |
CN116669064A (zh) | 无线协议测试方法及电子设备 | |
CN115220873A (zh) | 一种在Android系统中运行Open Harmony应用的方法 | |
CN111984541A (zh) | 一种内存泄漏检测方法及装置、终端 | |
CN116483736B (zh) | 插桩位置确定方法及电子设备 | |
CN113485923B (zh) | 项目代码检测方法与装置、电子设备 | |
CN117707918A (zh) | 一种并发缺陷检测方法、测试设备和存储介质 | |
CN118170385A (zh) | 一种代码编译方法、装置、电子设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |