购买基金可以参考一个法则: 最近一年、两年、三年、五年及成立以来收益率排名同类基金的前1/4 最近三个月、六个月收益率排名同类基金的前1/3笔者实现了一个应用,依据上述法则筛选基金,降低广大基民踩雷的风险。本应用包含数据爬虫、数据存储和数据展示三个模块。本应用并没有采用传统的SQL作为数据库存储,而是直接利用...
ThreadLocal
,在没有任何背景知识的情况下,我们从英文单词的意思上理解它:
本文基于MacOS,介绍如何基于ACRA(Application Crash Reporting on Android)构建数据采集系统。 阅读本文之前,读者需要了解:在MacOS下通过brew安装软件包。
本文基于MacOS
,介绍如何定制微擎运行环境。
阅读本文之前,读者需要了解:在MacOS下通过brew安装软件包。
做了好些年Android,终于可以聊一聊既熟悉又陌生的Context了,每个刚入门的Android开发人员都会接触到它;然而要读懂Context的设计哲学,却又要经过好多轮的认知升级。很多时候,大家是感知不到Context的存在的,笔者最开始“被迫”使用Context,是在自定义控件的时候,布局中有一个按钮,点击一次就发送一次广播,其代码片段如下所示:
本文以Android 7.1的代码为蓝本,部分源码在不同Android版本上略有区别。
1 概要每一个社会群落都有管理机制,其中有三个要素:被管理者、管理者以及管理机制的运转。在Android的世界中,有一处群落叫“包管理”,要研究Android的包管理机制,同样可以从以下几个角度来思考: 被管理的对象是什么? 管理者的职能是什么? 管理机制是如何运转的?所谓包,其实就是一种文件格式,譬如AP...
在Activity的启动过程(上)一文中,我们介绍了Activity启动过程的上半部分, 按照Activity的启动时序,涉及内容到多达11个函数,最终落脚点在创建一个应用进程。Activity启动过程的上半部分都还是在系统进程中完成,是系统进程内部数据结构和状态的调整。本文分析Activity启动过程的下半部分,涉及到系统进程和应用进程的通信,建议读者先读完应用进程与系统进程的通信,了解两个进程的通信方式。
Activity的启动过程涉及到的逻辑非常庞大,很难做到单点突破,建议读者在读本文之前,把Activity的四种启动模式、ActivityManagerService的启动过程、Activity的管理方式都再读一遍,储存一些背景知识。也是由于内容太多,笔者把启动过程分为上、下两部分介绍,另外一部分在Activity的启动过程(下)一文中。
1. 概览ActivitityManagerService(下文简称AMS)作为系统中最重要的服务,在开机时就会被启动,而且一直存在。那么,Android是如何启动AMS,以及启动AMS时做了哪些初始化工作呢?从进入Android系统进程(SystemServer)到用户所见的桌面(HomeActivity),整...
1. 背景对于Android系统级开发人员而言,维护多个分支的代码是常态,尤其是当新的Android版本发布时,设备厂商更是苦不堪言,即疲于最新Android版本的适配,又苦于大量旧机型的维护。为了尽可能的减少维护的工作量,设备厂商有很多手段来避免新增分支,譬如: 编译时过滤。通过编译开关来兼容代码差异...
本文介绍Android代码管理中的一种本地化定制机制:Local Manifest。Android使用repo
来管来管理庞大的源码,repo
所管辖的源码都记录在一个清单文件manifest.xml,Local Manifest是对manifest.xml的一种扩展。
1. 概览Activity的管理有静态和动态两层涵义: 静态是指Activity的代码组织结构,即Application中声明的Activity的集合,这些Activity被组织在一个APK中,有特定的包名。在编写应用程序时,Activity对应到用户界面,它定义了用户界面的布局、交互行为、启动方式等,...
Android中有一个系统进程(system_process,在Lollipop之前,叫system_server),运行着系统的重要服务(AMS, PMS, WMS), 针对Activity而言,系统进程需要不断地调度Activity执行,管理Activity的状态; 每一个APK都需要运行在一个应用进程中,有自己独立的内存空间, 针对Activity而言,应用进程需要执行Activity生命周期函数(onCreate, onStart, …onDestroy)的具体逻辑。
Activity的启动模式一共有四种:Standard、SingleTop、SingleTask和SingleInstance。 之所以要设计出不同的启动模式,是因为要应对不同的用户交互场景,以便达到更好的体验。
在Android四大组件中,Activity是最重要也是最复杂的,为了厘清Activity的内在运行机制, 笔者从以下几个方面来分析Activity:
GMS
是Google针对移动终端提供的一系列服务,主要是面向于Android设备,不同于AOSP(Android Open Source Project),GMS需要Google的授权才能使用。本文从以下问题来探讨GMS:
1. 前言 全球前5位的智能手机公司就有4个在使用Klocwork 全球前7位的芯片制造商就有5个在使用Klocwork 全球前10位的通讯设备制造商就有8个在使用Klocwork 美国前7位的航空与国防企业就有5个在使用Klocwork 全球前10位的医疗设备企业就有7个在使用Klocwork初识Kl...
1. 概览StrictMode,严苛模式,是Android提供的一种运行时检测机制,用于检测代码运行时的一些不规范的操作,最常见的场景是用于发现主线程的IO操作。StrictMode包含两个维度的概念: Policy(策略): 是指StrictMode对一些违规操作的发现策略,分为两类:一类是针对一个具...
1. 概览Watchdog的中文的“看门狗”,有保护的意思。最早引入Watchdog是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序“跑飞”,造成整个系统无法正常工作,因此,引入了一个“看门狗”,对单片机的运行状态进行实时监测,针对运行故障做一些保护处理,譬如让系统重启。这种Watchdog...
1. 概览ANR(Application Not Responding),应用程序无响应,简单一个定义,却涵盖了很多Android系统的设计思想。首先,ANR属于应用程序的范畴,这不同于SNR(System Not Respoding),SNR反映的问题是系统进程(system_server)失去了响应能力,而A...
1. 概要与大部分设备厂商一样,Google也面临着AOSP(Android Open Source Project)多分支的管理问题,AOSP需要使用多个分支来维护不同的Android版本,设备厂商除了要接受Android版本的不同分支,还要使用更多的分支来处理不同设备之间的差异。维护多个分支始终是一项繁重的任...
1. 概要编译,就是将高级语言转换成机器语言。譬如,通过gcc将C语言编译成可以运行的二进制;通过javac将Java语言编译成可以在Java虚拟机上可以运行的字节码。对于简单的项目,源文件数量较少,通常只需要几条命令,组织一下源文件,调用一下编译器,生成一个可以运行的文件,就算是一个“编译系统”; 但对于大型的...
在电量统计(1)-原理一文中,我们分析了电量统计服务的运行机制、耗电量的计算方法。本文我们分析电量统计的输出日志,包括日志信息的格式、表示的意义等,这些日志信息能够帮助开发人员解决一些功耗和性能问题。
说明:本文的代码以android-5.1.1_r8为蓝本,代码的在线网址是https://android.googlesource.com/
1. 概要dumpsys是Android提供的系统工具,可以用来查看所有系统服务的信息。在命令行输入如下命令,就可以罗列出当前所有的系统服务名:$ adb shell dumpsys -lCurrently running services: ... SurfaceFlinger ... activity...
final是Java语言中的修饰符,可以修饰类、方法、属性、函数入参、局部变量,意图表达被修饰对象的最终状态,即不可再被修改。
阅读本文之前,需要对git有一定的了解。1. 概要repo是Android为了方便管理多个git库而开发的Python脚本。repo的出现,并非为了取代git,而是为了让Android开发者更为有效的利用git。Android源码包含数百个git库,仅仅是下载这么多git库就是一项繁重的任务,所以在下载源码时,A...
1. 概要Android Debug Bridge(adb)是一个Android的命令行工具,可以用来连接模拟器或实际的移动设备。做过Android开发的朋友一定对adb logcat, adb shell命令不陌生,Dalvik Debug Monitor Server(DDMS)后台也是运行的adb来实现监控...
概要本文介绍面向对象编程中,实体对象之间的相互依赖关系,包括:关联、聚合、组成和继承关系。虽然已经有很多文章,介绍这几种关系之间的区别,但仍有一些开发人员对这几种关系的理解存在困惑。有时候,这几种依赖关系之间的界定,从代码结构上并不好区分,更多的是需要从语义的角度来理解。笔者试图从面向对象的使用场景,来说明这些关...
晨记
人言酒,风入松。
酒意酣,趣意浓。
夜未央,绕指香。
岁流长,丫慢点喝。
今起时,雾满都。
遮了树,迷了路。
二零一四年三月十日 虎门大桥
盛夏小记
细水蓝流,流到何年方始休?
渔船鼓浪,浪倚孤影声悠悠。
来轸方遒,此经落拓路依旧。
莫叹去留,情到深处无怨尤。
二零一三年四月十七日 香港
晚秋小记
银杏飘零,抹得几缕夕阳?
浮光掠影,岂知荡气回肠。
凌霜泻地,不尽世间炎凉。
席间对饮,但话一曲家常。
二零一一年十一月十一日 西二旗
晚春小记
日趋千里,奈何人生如寄?
追叙往昔,感慨理想依稀。
漫步凌晨,方知寒夜彻骨。
幽待清醉,顿悟友情可贵。
二零一一年四月七日 西二旗
晨记
人言酒,风入松。
酒意酣,趣意浓。
夜未央,绕指香。
岁流长,丫慢点喝。
今起时,雾满都。
遮了树,迷了路。
二零一四年三月十日 虎门大桥
盛夏小记
细水蓝流,流到何年方始休?
渔船鼓浪,浪倚孤影声悠悠。
来轸方遒,此经落拓路依旧。
莫叹去留,情到深处无怨尤。
二零一三年四月十七日 香港
晚秋小记
银杏飘零,抹得几缕夕阳?
浮光掠影,岂知荡气回肠。
凌霜泻地,不尽世间炎凉。
席间对饮,但话一曲家常。
二零一一年十一月十一日 西二旗
晚春小记
日趋千里,奈何人生如寄?
追叙往昔,感慨理想依稀。
漫步凌晨,方知寒夜彻骨。
幽待清醉,顿悟友情可贵。
二零一一年四月七日 西二旗
购买基金可以参考一个法则: 最近一年、两年、三年、五年及成立以来收益率排名同类基金的前1/4 最近三个月、六个月收益率排名同类基金的前1/3笔者实现了一个应用,依据上述法则筛选基金,降低广大基民踩雷的风险。本应用包含数据爬虫、数据存储和数据展示三个模块。本应用并没有采用传统的SQL作为数据库存储,而是直接利用...
ThreadLocal
,在没有任何背景知识的情况下,我们从英文单词的意思上理解它:
本文基于MacOS,介绍如何基于ACRA(Application Crash Reporting on Android)构建数据采集系统。 阅读本文之前,读者需要了解:在MacOS下通过brew安装软件包。
本文基于MacOS
,介绍如何定制微擎运行环境。
阅读本文之前,读者需要了解:在MacOS下通过brew安装软件包。
1. 前言 全球前5位的智能手机公司就有4个在使用Klocwork 全球前7位的芯片制造商就有5个在使用Klocwork 全球前10位的通讯设备制造商就有8个在使用Klocwork 美国前7位的航空与国防企业就有5个在使用Klocwork 全球前10位的医疗设备企业就有7个在使用Klocwork初识Kl...
final是Java语言中的修饰符,可以修饰类、方法、属性、函数入参、局部变量,意图表达被修饰对象的最终状态,即不可再被修改。
概要本文介绍面向对象编程中,实体对象之间的相互依赖关系,包括:关联、聚合、组成和继承关系。虽然已经有很多文章,介绍这几种关系之间的区别,但仍有一些开发人员对这几种关系的理解存在困惑。有时候,这几种依赖关系之间的界定,从代码结构上并不好区分,更多的是需要从语义的角度来理解。笔者试图从面向对象的使用场景,来说明这些关...
做了好些年Android,终于可以聊一聊既熟悉又陌生的Context了,每个刚入门的Android开发人员都会接触到它;然而要读懂Context的设计哲学,却又要经过好多轮的认知升级。很多时候,大家是感知不到Context的存在的,笔者最开始“被迫”使用Context,是在自定义控件的时候,布局中有一个按钮,点击一次就发送一次广播,其代码片段如下所示:
本文以Android 7.1的代码为蓝本,部分源码在不同Android版本上略有区别。
1 概要每一个社会群落都有管理机制,其中有三个要素:被管理者、管理者以及管理机制的运转。在Android的世界中,有一处群落叫“包管理”,要研究Android的包管理机制,同样可以从以下几个角度来思考: 被管理的对象是什么? 管理者的职能是什么? 管理机制是如何运转的?所谓包,其实就是一种文件格式,譬如AP...
在Activity的启动过程(上)一文中,我们介绍了Activity启动过程的上半部分, 按照Activity的启动时序,涉及内容到多达11个函数,最终落脚点在创建一个应用进程。Activity启动过程的上半部分都还是在系统进程中完成,是系统进程内部数据结构和状态的调整。本文分析Activity启动过程的下半部分,涉及到系统进程和应用进程的通信,建议读者先读完应用进程与系统进程的通信,了解两个进程的通信方式。
Activity的启动过程涉及到的逻辑非常庞大,很难做到单点突破,建议读者在读本文之前,把Activity的四种启动模式、ActivityManagerService的启动过程、Activity的管理方式都再读一遍,储存一些背景知识。也是由于内容太多,笔者把启动过程分为上、下两部分介绍,另外一部分在Activity的启动过程(下)一文中。
1. 概览ActivitityManagerService(下文简称AMS)作为系统中最重要的服务,在开机时就会被启动,而且一直存在。那么,Android是如何启动AMS,以及启动AMS时做了哪些初始化工作呢?从进入Android系统进程(SystemServer)到用户所见的桌面(HomeActivity),整...
1. 背景对于Android系统级开发人员而言,维护多个分支的代码是常态,尤其是当新的Android版本发布时,设备厂商更是苦不堪言,即疲于最新Android版本的适配,又苦于大量旧机型的维护。为了尽可能的减少维护的工作量,设备厂商有很多手段来避免新增分支,譬如: 编译时过滤。通过编译开关来兼容代码差异...
本文介绍Android代码管理中的一种本地化定制机制:Local Manifest。Android使用repo
来管来管理庞大的源码,repo
所管辖的源码都记录在一个清单文件manifest.xml,Local Manifest是对manifest.xml的一种扩展。
1. 概览Activity的管理有静态和动态两层涵义: 静态是指Activity的代码组织结构,即Application中声明的Activity的集合,这些Activity被组织在一个APK中,有特定的包名。在编写应用程序时,Activity对应到用户界面,它定义了用户界面的布局、交互行为、启动方式等,...
Android中有一个系统进程(system_process,在Lollipop之前,叫system_server),运行着系统的重要服务(AMS, PMS, WMS), 针对Activity而言,系统进程需要不断地调度Activity执行,管理Activity的状态; 每一个APK都需要运行在一个应用进程中,有自己独立的内存空间, 针对Activity而言,应用进程需要执行Activity生命周期函数(onCreate, onStart, …onDestroy)的具体逻辑。
Activity的启动模式一共有四种:Standard、SingleTop、SingleTask和SingleInstance。 之所以要设计出不同的启动模式,是因为要应对不同的用户交互场景,以便达到更好的体验。
在Android四大组件中,Activity是最重要也是最复杂的,为了厘清Activity的内在运行机制, 笔者从以下几个方面来分析Activity:
GMS
是Google针对移动终端提供的一系列服务,主要是面向于Android设备,不同于AOSP(Android Open Source Project),GMS需要Google的授权才能使用。本文从以下问题来探讨GMS:
1. 概览StrictMode,严苛模式,是Android提供的一种运行时检测机制,用于检测代码运行时的一些不规范的操作,最常见的场景是用于发现主线程的IO操作。StrictMode包含两个维度的概念: Policy(策略): 是指StrictMode对一些违规操作的发现策略,分为两类:一类是针对一个具...
1. 概览Watchdog的中文的“看门狗”,有保护的意思。最早引入Watchdog是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序“跑飞”,造成整个系统无法正常工作,因此,引入了一个“看门狗”,对单片机的运行状态进行实时监测,针对运行故障做一些保护处理,譬如让系统重启。这种Watchdog...
1. 概览ANR(Application Not Responding),应用程序无响应,简单一个定义,却涵盖了很多Android系统的设计思想。首先,ANR属于应用程序的范畴,这不同于SNR(System Not Respoding),SNR反映的问题是系统进程(system_server)失去了响应能力,而A...
1. 概要与大部分设备厂商一样,Google也面临着AOSP(Android Open Source Project)多分支的管理问题,AOSP需要使用多个分支来维护不同的Android版本,设备厂商除了要接受Android版本的不同分支,还要使用更多的分支来处理不同设备之间的差异。维护多个分支始终是一项繁重的任...
1. 概要编译,就是将高级语言转换成机器语言。譬如,通过gcc将C语言编译成可以运行的二进制;通过javac将Java语言编译成可以在Java虚拟机上可以运行的字节码。对于简单的项目,源文件数量较少,通常只需要几条命令,组织一下源文件,调用一下编译器,生成一个可以运行的文件,就算是一个“编译系统”; 但对于大型的...
在电量统计(1)-原理一文中,我们分析了电量统计服务的运行机制、耗电量的计算方法。本文我们分析电量统计的输出日志,包括日志信息的格式、表示的意义等,这些日志信息能够帮助开发人员解决一些功耗和性能问题。
说明:本文的代码以android-5.1.1_r8为蓝本,代码的在线网址是https://android.googlesource.com/
1. 概要dumpsys是Android提供的系统工具,可以用来查看所有系统服务的信息。在命令行输入如下命令,就可以罗列出当前所有的系统服务名:$ adb shell dumpsys -lCurrently running services: ... SurfaceFlinger ... activity...
阅读本文之前,需要对git有一定的了解。1. 概要repo是Android为了方便管理多个git库而开发的Python脚本。repo的出现,并非为了取代git,而是为了让Android开发者更为有效的利用git。Android源码包含数百个git库,仅仅是下载这么多git库就是一项繁重的任务,所以在下载源码时,A...
1. 概要Android Debug Bridge(adb)是一个Android的命令行工具,可以用来连接模拟器或实际的移动设备。做过Android开发的朋友一定对adb logcat, adb shell命令不陌生,Dalvik Debug Monitor Server(DDMS)后台也是运行的adb来实现监控...