安卓应用日志的实现方法和装置
技术领域
本申请涉及计算机及软件技术领域,尤其涉及一种安卓应用日志的实现方法和装置。
背景技术
在软件开发和测试过程中,对于定位软件中存在的问题,日志具有难以替代的作用。即使在软件完成测试、正式发布之后,仍有可能存在缺陷,定位缺陷如果没有日志来辅助,无异于盲人摸象。
对Android(安卓)系统中的应用,可以使用系统提供的日志工具来产生应用的日志,但是需要将运行应用的移动设备通过USB(Universal Serial Bus,通用串行总线)等本地连接方式接入个人电脑后,利用个人电脑上的adb(android debug bridge,安卓调试桥)工具才能查看和分析这些日志。
现有技术还提供了另一种获得应用日志的方案,运行一个日志获取进程,通过调用Android系统提供的函数,实时向Android自带的系统日志进程请求某个应用的日志,并且将获得的日志传递给该应用的进程。这样,查看日志不再需要本地连接个人电脑。但是,这种方案需要运行一个新的进程来在系统日志进程和应用进程之间传递日志,实现复杂;并且由于安卓的系统日志进程始终处于运行状态,这个新的日志获取进程也需要一直运行,要一直占用移动设备上有限的系统资源,并且使得移动设备耗电量增加。
发明内容
有鉴于此,本申请提供一种安卓应用日志的实现方法,包括:
将本应用的日志记录写入属于本应用进程的存储空间;
读取所述日志记录,根据预定条件生成本应用的日志。
本申请还提供了一种安卓应用日志的实现装置,包括:
日志记录写入单元,用于将本应用的日志记录写入属于本应用进程的存储空间;
应用日志生成单元,用于读取所述日志记录,根据预定条件生成本应用的日志。
由以上技术方案可见,本申请的实施例中,应用进程将自身的日志记录写入到本应用进程的存储空间,而非系统日志进程的存储空间,应用进程可以利用这些日志记录生成本应用的日志,从而不必增加新的进程即可实现通过应用进程所在的设备或远程查看应用的日志,实现简单,节省了所在设备的资源,不会对耗电量造成影响。
附图说明
图1是本申请实施例中一种安卓应用日志的实现方法的流程图;
图2是本申请应用示例中一种应用日志生成过程的示意图;
图3是终端或服务器的一种硬件结构图;
图4是本申请实施例中一种安卓应用日志的实现装置的逻辑结构图。
具体实施方式
Android系统提供了自带的日志实现机制。系统中运行的应用可以通过调用android.util.log类来输出应用的日志记录。android.util.log类提供了Log.v()、Log.d()、Log.i()、Log.w()、Log.e()、Log.println()等多个Java层方法,可以由应用进程直接调用,来将应用进程在运行中产生的日志记录输出到系统的日志设备文件中。系统的日志设备文件用来在系统中运行的所有应用进程与Android系统自带的系统日志进程Logcat之间传递日志记录。系统日志进程Logcat在日志设备文件中读取所有应用的日志记录,生成各个应用的日志,用户可以通过运行在本地连接的个人电脑上adb工具来查看。而前述现有技术的实现方案中,则是运行一个新的进程,来向系统日志进程logcat请求属于某个应用的日志,并对logcat进程是否生成了该应用的新日志进行实时监控,以及时获得该应用的新日志。
本申请的实施例提出一种新的安卓应用日志的实现方法,将应用进程产生的日志记录的输出,从现有技术中的系统日志设备文件修改为属于本应用进程的存储空间,由应用进程利用日志记录来生成日志,这样,不需额外的进程即可在应用所安装的设备上或者远程查看该应用的日志,避免了对设备系统资源和电量的消耗,以解决现有技术中存在的问题。
本申请的实施例应用在运行Android系统应用程序的终端或服务器上,其中,终端可以是手机、平板电脑、PC(Personal Computer,个人电脑)、笔记本等设备;服务器可以是物理或逻辑服务器;不做限定。
本申请的实施例中,Android应用日志的实现方法的流程如图1所示。
步骤110,将本应用的日志记录写入属于本应用进程的存储空间。
Android系统为每个进程分配了独立的存储空间,一个进程不能直接访问属于另一个进程的存储空间。每个应用的日志记录由该应用的进程来搜集,本发明的实施例中,应用进程在采集运行中的日志记录后,将日志记录写入到Android系统为本应用进程分配的存储空间中。根据Android系统所在设备的具体实现,存储空间可以是内存、虚拟内存、闪存或其他存储设备中的一段到几段可读写的地址范围。
应用进程可以采用自定义的方式来采集本应用的日志记录,并将采集到日志记录写入属于本应用进程的存储空间中,但是,这种方式改变了开发人员的习惯,并且增加了应用的编程复杂程度。为了避免上述两个问题,在一种实现方式中,可以利用Android系统提供的native函数注册机制来将应用进程日志记录的输出,由现有的设备文件修改为分配给本应用进程的存储空间。
Android系统中的java层方法在运行时,其调用的每个函数对应于Java虚拟机中的一个数据结构,该数据结构有属性来表示该函数是否是一个native函数,并且包含一个指针来指向对应的native函数。Android的JNI提供了一个动态注册native函数的方式,在动态注册后Java虚拟机中该函数对应的数据结构中,指针会指向新注册的native函数,这样,在Java虚拟机将调用新注册的native函数,而不会运行动态注册前指针指向的native函数。本申请的实施例中,可以通过动态注册用于日志记录输出的native函数,在新注册的native函数中将日志记录输出到分配给本应用进程的存储空间中,即可通过调用注册后的native函数来将本应用的日志记录写入属于本应用进程的存储空间。这样,只要修改并动态注册用于日志记录输出的native函数,开发人员调用动态注册后Android系统的日志工具即可实现本步骤。
具体而言,应用进程可以通过调用Android系统提供的android.util.log类中的各种Java层方法,如Log.v()、Log.d()、Log.i()、Log.w()、Log.e()、Log.println()等来输出应用运行中产生的日志记录。android.util.log类中的上述Java层方法都通过调用JNI(Java Native Interface,Java本地接口)的native(本地)函数println_native来将应用的日志记录输出到系统的日志设备文件。这样,修改println_native函数,将日志记录的输出从系统日志设备文件修改为应用进程的存储空间后,动态注册修改后的println_native函数,开发人员在编程时仍调用android.util.log类中的上述各种Java层方法来实现日志记录的输出,而该应用的日志记录即可写入到属于该应用进程的存储空间中。
应用进程可以在属于其的存储空间中设置一段缓冲区,来存放在运行的过程中不断产生的日志记录。应用进程可以将本应用的日志记录按照循环队列写入设置的缓冲区中。当有新的日志记录产生时,应用进程将新的日志记录写入循环队列当前写指针指向的存储位置,并将写指针向循环队列的尾部移动,如果写指针已经到达循环队列尾部,则将写指针置为循环队列的头部。循环队列的具体实现方式可以借鉴现有技术中系统设备文件的循环队列实现方式,不再赘述。
步骤120,读取本应用进程存储空间中的日志记录,根据预定条件生成本应用的日志。
对采用循环队列缓冲区来写入日志记录的实现,当缓冲区中有未读取的日志记录时,读取这些日志记录来生成本应用的日志。例如,应用进程可以读取当前读指针指向的日志记录,并在读取后将读指针向循环队列的尾部移动,如果读指针已经到达循环队列尾部,则将读指针置为循环队列的头部。由于日志记录在应用运行中不断被写入缓冲区,当有新的日志记录写入后,读指针与写指针不重合,此时表明缓冲区中有未读取的日志记录,则应用进程可以进行日志记录的读取,直到读指针与写指针重合。
应用进程可以通过预定条件来控制用哪些记录生成日志和所生成日志的形式。一个例子中,可以设置预定过滤条件来对读取的日志记录进行筛选,如将符合预定过滤条件的日志记录写入本应用的日志中,而将不符合预定过滤条件的日志记录丢弃。另一个例子中,可以设置预定分组条件将日志记录归属为不同类型的日志,如采用Android系统自带的日志记录优先级,来将不同优先级的日志记录,作为不同类型的日志写入到本应用日志中。预定过滤条件和预定分组条件可以结合使用,在对日志记录按照预定过滤条件进行筛选后,将筛选出的日志记录再按照预定分组条件来归为不同类型的日志。
应用进程在生成本应用的日志后,可以将日志保存在本地,供用户在运行应用的设备上查看该应用的日志;也可以将日志通过通信网络传输给网络中的其他节点,供用户远程查看。
如果在应用中提供对预定筛选条件、预定分组条件、保存或发送生成的日志的设置手段,用户在应用中即可控制是否生成日志、用哪些记录生成日志、生成怎样的日志以及如何处理生成的日志。这样,不仅在应用软件的调试和测试过程中可以方便高效的得到应用的日志,在应用发布后,同样可以在需要时将日志从用户设备传输给开发人员,便于开发人员改进未能在测试阶段发现的软件缺陷。
可见,本申请的实施例中,应用进程将产生的日志记录输出到属于本应用进程的存储空间,由应用进程自身利用日志记录来生成日志,从而不必增加新的进程即可实现通过应用进程所在的设备或远程查看应用的日志,实现简单,避免了因跨进程获取日志对设备系统资源和电量的消耗。
在本申请的一个应用示例中,Java层函数println_java用来将日志记录写入到应用进程在其内存里设置的循环队列缓冲区中。某个应用采用Android系统提供的native函数动态注册机制,将JNI的native函数println_native动态注册为Java层println_java函数。本应用示例的流程示意图如图2所示。
该应用的开发人员在编程时使用Android系统原生的日志工具android.util.Log来产生本应用的日志记录。由于android.util.Log类中的各个Java层方法在将日志记录写入存储区时都是调用native函数println_native,而在将println_native函数动态注册为println_java函数后,当android.util.Log类的方法在调用println_native函数时,实际上调用的是println_java函数。这样,在应用运行时,android.util.Log类的方法将该应用的日志记录写入到该应用内存的循环队列缓冲区中。
应用进程串行读取循环队列缓冲区中的日志记录,按照预定筛选条件对日志记录进行过滤,利用通过筛选的日志记录生成本应用的日志,保存在本地,同时通过网络发送给远程主机。当收到用户的指令时,应用进程还可以在所运行的设备上展示在本地保存的日志。
与上述流程实现对应,本申请的实施例还提供了一种安卓应用日志的实现装置。该装置可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为逻辑意义上的装置,是通过终端或服务器的CPU(Central Process Unit,中央处理器)将对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,除了图3所示的CPU、内存以及非易失性存储器之外,该装置所在的终端通常还包括用于进行无线信号收发的芯片等其他硬件,该装置所在的服务器通常还包括用于实现网络通信功能的板卡等其他硬件。
图4所示为本申请实施例提供的一种安卓应用日志的实现装置,包括日志记录写入单元和应用日志生成单元,其中:日志记录写入单元用于将本应用的日志记录写入属于本应用进程的存储空间;应用日志生成单元用于读取所述日志记录,根据预定条件生成本应用的日志。
可选的,所述装置还包括应用日志处理单元,用于将本应用的日志保存在本地或通过网络传输给其他主机。
一个例子中,所述日志记录写入单元具体用于:在属于本应用进程的存储空间中设置缓冲区,将本应用的日志记录按照循环队列写入所述缓冲区。
上个例子中,所述应用日志生成单元可以具体用于:当所述缓冲区中有未读取的日志记录时,读取所述未读取的日志记录,根据预定条件生成本应用的日志。
可选的,所述预定条件包括预定过滤条件和/或预定分组条件;所述预定过滤条件用来对读取的日志记录进行筛选;所述预定分组条件用来将日志记录归属为不同类型的日志。
可选的,所述日志记录写入单元具体用于:动态注册用于日志记录输出的安卓本地native函数,调用注册后的native函数将本应用的日志记录写入属于本应用进程的存储空间。
可选的,所述安卓native函数包括:println_native函数。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。