自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

自由麦田

技术永无止境

  • 博客(60)
  • 资源 (5)
  • 收藏
  • 关注

原创 架构师到底是做什么的?

摘自公司一个P10的精辟总结:好的架构师,反复做四件事:1. 先选一个好的挑战,解释: 为了创造价值,这个挑战不是技术挑战,而是为了解决什么样的用户痛点,用户问题。要对业务有很好的了解。2. 把简单的东西想复杂解释:为了控制好风险和准备好未来3. 把复杂的东西做简单解释:为了做好产品且控制好成本4. 把复杂的东西讲简单解释:为了做好传承不好的架构师:1. 选一个不值得做的问题2.把复杂的问题想简单...

2020-06-24 15:41:38 1245

原创 Android性能优化:编码小细节提升性能

正确使用单例说到单例,一般我们都会想到懒汉和恶汉模式。如下恶汉单例模式如下:public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getI...

2020-02-03 22:45:17 150

原创 Android性能优化:注意同步锁的影响

同步锁的影响在我们的运行过程中,我们经常要加上同步锁,避免其他线程同时修改了数据。但是在要去获取锁的过程中,该锁被其他耗时线程占用或者其他线程占用了并等待其他线程唤醒,从而导致主线程获取不了锁等待最后发生ANR的情况。实际上,这种情况一般发生在使用了CountDownLatch的情况。CountDownLatch是一个计时器闭锁,该计数器是原子操作,同时只能有一个线程去操作该计数...

2020-02-02 18:04:05 680

原创 Android性能优化:内存泄漏,只有知根才能知底

讲关于内存泄露之前,先抛出一个问题,两个相互引用的对象是不是一定会引起内存泄露?回答这个问题之前就需要理清内存泄露是怎么产生的。首先,分配了内存的对象是可达的,既可追溯到根节点的,其次,这个对象是没用的,既再也用不到这个对象。这个时候,垃圾收集器因为相关的对象是可达的,因此无法标记为垃圾,但它又没什么用,且占内存,因此这就是内存泄露。我们是不是可以这么想,如果已经分配的对象无法追...

2020-02-02 00:40:31 154

原创 Android性能优化:让App启动更加快速

App的启动实际上设计到体验性问题,特别在一些用户常用的手机,如微信、支付宝等使用评率频繁,如果应用不存在后台,也是重新启动,既冷启动的情况下,启动速度如果很慢,那对用户来说是无法忍受的,因此对App的启动就显得有必要。 Multidex多dex加载优化 Android4.4及以下使用的是Dalvik虚拟机,应用在安装的时候已经对主dex进行d...

2020-02-01 23:51:52 593

原创 虚拟机从应用安装PMS说起

应用在安装的时候,主要由PMS(PackageManagerService)进行处理,大概就是通过守护进程installed调用一个工具dexopt对相关文件进行处理。对于Android 4.4以上的,会对Apk包中的所有dex文件进行dex2oat操作,最终形成本地机器语言代码,这种就是我们常说的AOT(AheadOfTime)、既运行前编译,得到一个ELF格式的o...

2020-01-29 17:59:04 174

原创 Android的图形之美(二)

上文我们提到,窗口绘图表面进行绘制的时候,会在画布上(非硬件加速如Canvas)的一个图形缓冲区中,然后SurfaceFlinger通过OpenGL图像块API来将这个图形缓冲区渲染到帧缓冲区中。我们对这个过程用图形来进行抽象分析。如下图,上层为生产,下层为消费,每一层有buffer为数据载体。其中,上层的buffer我们称为图形缓冲区、下层的buffer为帧缓冲区。...

2020-01-29 17:50:52 99

原创 Android的图形之美(一)

在Android App中,我们经常会看到页面与页面之间的切换,页面弹出输入法以及页面弹出窗口等,这种情况实际就是一个Activity中对应了一个窗口,页面之间的切换既是Activity生命周期的调用,也是两个窗口之间哪个展示在前,同理的,输入法也是一个窗口,在页面弹出的也是一个子窗口,由此得出,在Android系统中,我们需要一个管理类用来管理窗口的,而这就是我们经...

2020-01-29 17:50:41 199

原创 RxJava2的Observable变种之过滤操作符

debounce:设定规定的时间内observable没有发射新的数据项,则debounce会把这个结果交给订阅者处理。因此debounce的应用场景可用在按钮点击上。如有时候按钮会被点击多次,那么设置一个响应时间,如100ms,如果认为没有连续点击多次,超过100ms的时间的时候,则默认为一次点击事件,供给listener处理。如100ms内连续点击多次,则旧的发射会被新的覆...

2019-10-13 22:20:34 101

原创 RxJava2的Observable变种之变换操作符

map—— 一对一转换,一般是转换成结果,如string到int的转换。可以集合进行转换,每次转换都接着执行onNext操作。看个map的例子Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitte...

2019-10-13 22:19:51 305

原创 RxJava2的Observable变种之四大热发射

在关于Observable变种之五大金刚一文分析中,我们知道Observable在收到Observer订阅的时候,就会立即发送数据,既为冷发射。而热发射既只是为Observable和Observer之间建立了订阅管道,并不会直接发射数据,而是在有需要的时候才发射数据。而热发射的场景就有很多了,因为热发射我们可以决定发射时机、地点、数据。四大热发射集成自抽象Subject,而Sub...

2019-10-13 22:16:31 280

原创 RxJava2的Observable变种之五大金刚

RxJava2五大金刚分别为Observable、Flowable、Single、Completable以及Maybe。除了Observable,实际上其余四个的实现方式或者使用方式和Observable类似。都是最终形成形如source.subscribe(observer)此等形式。Observable已经做了分析,接下来我们来分析下其余四种,主要分析下各自的作用。分析之前要...

2019-10-13 22:14:02 272

原创 RxJava2的Observable变种之线程切换

RxJava的线程切换实质就是把不同的处理事务交由不同的线程去进行处理。代码流程看起来热仍然是像Observable.create(observableOnSubscribe).subscribe(observer)这种基本格式。那么线程切换流程在源码上是怎么做到的呢?另外,多个subscribeOn对应不同线程模型时,是都生效还是只对第一个线程有效,以及observeOn对应不同...

2019-10-11 12:14:21 1507

原创 RxJava2的中轴线

RxJava2的基础UMLimage如图,RxJava2的所有实现几乎围绕上图中最基础的UML关系图进行。其中1为Observable被观察者,2为Observer观察者,3为Emitter发射源。发射源可以被取消,发射源被取消之后,一般情况下Observer可能就收不到信息了。这三者关系,也就构成RxJava中一个核心的关系图,首先Observable订阅了Obs...

2019-10-11 11:30:31 89

原创 一文让你懂weex

weex的初始化weex的初始化一般从app启动的时候进行。weex的初始化主要完成三件事情: 初始化js framework——initFramework(); 注册公共Component和Module——registerModulesAndComponents(); 注册上层DSL框架,如Rax——loadRaxFramework(); initFramewo...

2019-09-11 23:37:58 1474

原创 一种小而美的热修复方案中间件——AndFix

在我们走安全模式或者崩溃恢复的过程中、或者从请求OkHttp的Interceptor过滤中捎带探针得到要打补丁的时候,AndFix就派上用场了。 之所以是小而美,是因为该方案只能针对异常发生在java文件中,不针对Android资源,so库等进行修复。考虑到实际工程的需要,实际上这种修复方式已经满足工程的需要。如下图,左边为打补丁包的过程,ApkPatch...

2019-08-08 16:22:30 108

原创 App运行过程中崩溃恢复安全气垫中间件——RecoveryOneTouch

我们知道,一个进程发生了什么情况,不会发生在另一个进程中。App在XXXActivity(在主进程中)运行过程中发生了crash,crash监听之后通过inten启动恢复界面RecoveryUI(在RecoveryUI进程,不受主进程影响),这种情况不像安全模式那样,安全气垫对用户是有感知的,会进入到恢复界面,用户通过点击恢复直接运行到RecoveryService进...

2019-08-08 16:19:16 588

原创 App启动失败进入安全模式中间件——SafeLikeWin

App在启动过程中可能会存在出现崩溃的情况,其中有可能因为sharedpreference开关,缓存,版本升级判断等引起崩溃的情况不在少数。因此通过类似windows的安全启动模式,让App无知觉得进入安全模式进行崩溃之后的挽救。分别根据情况使得App无知觉进入不同级别的安全模式。最后级别是通过请求hotpatch,然后打入base apk中,完成补丁修复。安全模式对...

2019-08-08 16:17:59 120

原创 依赖注入之Dagger2框架在工程中的使用

在介绍Dagger2之前,了解一下使用Dagger2的背景: 一般情况下,实例Man包含到实例Car,则实例Man依赖实例Car。如下图1: ​ 这种直接依赖的情况存在不好的情况,若car构造函数变化,则需要直接修改Man类。 使用依赖注入用于实现控制反转的常用方式。控制反转的基本思想是:借助“...

2019-08-08 15:19:51 115

原创 统一的日志中间件——timber

开发一个工程,日志输出是先行者,无论在开发中还是在运行中,都少不了日志的身影。重构过程中,使用了timber作为日志输出,主要考虑到以下几点: 1. 我们在开发中经常用到第三方库,如OkHttp使用Logging Interceptor输出日志,RxJava使用onError输出异常日志,还有Android的系统Log日志,为了捕捉这些日志,timber这...

2019-08-06 00:15:11 506

原创 页面跳转导航中间件——Router

上一篇介绍的SCC中,主要用来做组件化管理功能。在业务开发中,我们经常涉及到外链或内联打开App某个业务页面的情况,因此一个页面跳转导航中间件就显得有必要。SCC如果是整个组件化过程的基石的话,那么Router就是业务展开的基础,它统一管理了页面之间的跳转,无需确定具体Activity的名称。 开发中,可以使用URL的形式进行页面跳转,如通过扫描二维码就希...

2019-08-04 13:07:43 260

原创 一种插槽式的组件化框架中间件——SCC

SCC(SlotComponentCaller)是一种已铺好基本线路(组件管理),露出基本卡槽(组件接口),底层引流线路已打通,使用者尽管往卡槽插入(注册)到对应槽位,可对槽位进行拦截(interceptor),亦可通过底层阀门接通(AIDL跨进程)进行两个卡槽之间的接通的插槽式组件化框架。基本原理如下图所示: 在相同进程中,组件A可以通过组件管理工具ca...

2019-08-03 00:52:35 411

原创 为何重构

某某宝原始整个团队被挖走,而我们又是被挖去进去填坑的。一批人走,另一批进来的总要搞点新花样。对于Android客户端App,如果服务器架构变化、数据格式变化,那一般情况非重构不可,要不然在原先的基础上进行修修补补,终究会把坑填的越来越大。幸运的是,服务端方面并没有架构或者请求数据格式等的改动。因此Android客户端App是否重构变成工程本身是否到有必要重构的地步。重...

2019-08-01 00:42:12 70

原创 IMS发送键盘消息到Activity窗口通道能力验证

从上两篇文章我们知道创建了两个管道,这两个管道的作用是用于有消息事件发生的通信。那么实质传输什么时间,则是放在了在创建Connection的时候创建了共享内存里面的。既当Sever端写端有键盘消息时候写入内容,把键盘具体消息内容写入共享内存中,那么在Client端读端唤醒之后,从共享内存中获取到数据。这里要注意的一点就是,读端和写端都是在ServerSystem进程下...

2019-07-21 17:10:25 57

原创 应用程序Activity窗口和IMS之间的通道建立

上文中,我们已经分析了IMS的启动,IMS启动的过程跑了两个消息线程,一个分发消息线程,一个读取消息线程。当AMS监控到键盘输入时间的时候,它应该把监控到的消息分发到用户手上,而这个用户就是应用程序当前激活的Activity窗口。那么IMS怎么发给Activity窗口,这其中肯定得建立一个通道。这样当IMS监控到设备有内容的时候,就通过这个通道分发到Activity窗...

2019-07-21 17:08:39 178

原创 IMS的启动为键盘消息发送提供基础

InputManagerService的主要用来分发键盘消息和接收键盘消息。如下图,IMS的启动过程如下,在Java层进行了初始化,然后调用到了C++层初始化了一个EventHub对象,这个对象是真正执行监控键盘操作的。进而以EventHub对象为参数初始化了InputManager,在InputManger中初始化了一个读取消息的线程,一个分发消息的线程。初始化完成...

2019-07-21 17:07:06 122

原创 符合Android消息驱动的Handler消息机制

Android应用程序是消息驱动的,主线程可能处于空闲等待状态,只要需要主线程处理操作了,一般都会通过消息将主线程唤醒。系统为每一个应用程序维护了一个消息队列(MessageQueue),应用程序的主线程不断地从消息队列中获取消息(Looper),然后对消息进行处理(Handler)。 ...

2019-07-21 17:05:59 132

原创 Zygote赋予Android应用生命

Android基于Linux,Linux系统中,所有的进程都是init进程的子进程,Zygote是由init fork出来的。而Android系统进程都由Zygote fork出来的。在Zygote进程中,主要运行类为AndroidRuntime,调用了start方法中主要做三件事,一是startVm,虚拟机相关的初始化,后面文章再详细分析,二是startReg注册J...

2019-07-21 17:04:06 91

原创 PMS治下的应用程序安装和Luncher启动

PackageManagerService服务是在SystemServer中启动起来的,负责安装系统的应用程序,在构造函数进行对所有应用程序的程序的AndroidManifest的xml解析,得到我们在XML定义的四大组件(Activity、Receiver、 Service、 Provider)列表。PMS安装完应用程序之后,会开启一个Home应用程序,也就是我们A...

2019-07-21 17:02:54 110

原创 Binder机制下的应用程序进程启动过程分析

我们在上面看到,无论是Activity、Service还是Provider,在Activity、Service启动、或者Provider加载的时候都可能涉及应用程序进程启动。又有很重要的一点,在这个过程中,新启动进程涉及的ApplicationThread binder对象常与ActivityManagerService进行进程间通信。在前面的分析中,我们知道,在启动...

2019-07-20 18:18:38 140

原创 AMS治下的广播注册发送

Android系统的广播是用来发送消息的,既可以在同个进程中进行,也可以跨进程接收消息。那么既然有了binder通信机制了,为何还要有广播存在。实际上,广播是可以做到完全解耦的,调用者不需要知道它是谁,在哪调用,只管自己要发送什么即可。这样,在把广播发到任一一个应用进程就显得很简单。而Binder机制下的通信,首先得知道对方服务在哪,是否已启动了,得先获得代理。 ...

2019-07-20 18:17:39 119

原创 AMS治下的Content Provider执行原理

想象一个场景,当我们是第三方数据提供商,如百度地图数据,那么用户在接入像百度地图这种第三方数据的时候,第三方数据提供商不会把自己的数据大开四方,任由用户直接获取。那么他们一定是做了一层数据接入接口封装,通过数据接口,把自家的钥匙把握在自己的手里,而不是对外发放了直接操作数据的准入钥匙,这里说的钥匙如数据操作DbHelper。Android 的Content Provi...

2019-07-20 18:15:36 126

原创 AMS治下的Activity启动运行

Activity的启动情况有多种,一种是应用程序还未启动MainActivity,一种是在已启动的应用程序中启动Activity,这两者存在不一样的情况,如果是应用程序未启动,那么和Service在新进程中启动一样,需要先创建新进程,创建Application、绑定Application、启动ActivityThread线程、创建ApplicationThread B...

2019-07-20 18:14:33 123

原创 AMS治下的Service启动运行

Service启动有两种方式,一种bindService、一种startService。两种启动方式既有相似的地方,也有不一样的,一样的地方都是需要在AMS的管理下启动,都走到ActivityService的bringUpServiceLocked函数。在该函数下,如果要启动的Service是另一个进程的,需要通过startProcessLocked开启新进程,然后在...

2019-07-20 18:11:41 442

原创 ActivityManagerService玩弄四大组件

我们知道,Android四大组件分别是Activity、Service、Content Provider、BroadCast Receiver。四大组件是如何启动的,如何运行的,是我们关心的。实际上,四大组件的启动运行,离不开ActivityManagerService的参与。ActivityManagerService管理着Activity的任务堆栈、Service...

2019-07-20 14:30:28 133

原创 AShmem匿名共享内存为Binder机制添砖加瓦

Android的AShmem匿名共享内存是在Linux的共享内存基础上实现的。Ashmem的用处很多,如进行较大数据的从一个进程到另一个进程,那么Ashmem是不二的首选,首选避免binder进程间直接数据传递的一次数据拷贝,通过传递共享内存文件描述符来操作共享内存。如App进程和SurfaceFlinger进程是两个不同的进程,那么在进行View绘制的时候,如果采用...

2019-07-20 14:29:21 411

原创 Binder机制是基石

一个操作系统,免不了需要提供进程间通信机制。在Linux系统中,信号、管道、报文队列,共享内存等是常用的进程间通信方式。Android系统中主要使用Binder机制,是一种C/S机制。那么Binder机制是如何运行的呢?首先看下图一个典型的C/S通信问题,如Client进程要发送数据到Server进程,因为处于不同的进程,进程与进程之间是没有共享内存的,那么Clien...

2019-07-20 14:27:57 122

原创 LOG是先驱

Log在开发中是必不可少的,这里为什么说成先驱了,无论是开发系统驱动,还是系统调用层或者Java应用层,有输入,接着有输出是我们急切想看到的,这也是继续我们开发的先行因素。因此,一个完整的log系统很有必要。 思考一个问题,我们平时在Android Studio的日志是怎么输出的,既LogCat,或者说我们使用adb命令adb logcat -v thre...

2019-07-20 14:22:11 78

原创 HAL究竟是干嘛的

计算机领域中,总是需要对用到的东西进行抽象,从代码角度讲,把每个行为抽象一个个方法。通过从上层调用到底层对应的一个个方法,从而操作某个硬件,比如摄像头开,摄像头关闭,比如打印log信息,读取log信息。如此种种,就是对某个事物的计算机抽象。玩过单片机的同学可能清楚,控制跑马灯的亮灭其实是通过异或等让其亮起来,其背后其实涉及电子电路或模拟电路,但离不开01二进制。那么打...

2019-07-20 14:20:42 1728

原创 前序

关于Android系统代码读了一些,圈内相关的文章也读了很多,但是总是无法系统性的有个更深的理解。于是最近想在阅读源代码的基础上,结合其他作者的文章,想系统性的,以架构的思维去读懂Android系统。这样,无论在应用程开发,还是系统开发,都能起到很好的认知以及开发铺垫。更深层次的,理清了整个Android系统的框架思想,对架构设计、对工程开发的作用都是影响很大的。 ...

2019-07-20 14:11:11 290

CsipSimple源代码

最新的基于PJSIP源代码库编写的Andriod程序,实现基于SIP协议的短信发送,视频电话等功能,使用STUN,TURN以及ICE进行NAT穿越。

2013-09-16

基于Java的文件加密与解密

本程序完成用户无限制的输入数据,并生成相关文件,用户设置相关的密码之后进行加密,只有用户输入正确的密码才能看到相应的数据。主要用到Java的IO流操作。

2013-03-07

字符串的操作

该c语言代码主要实现对一个字符串的操作。字符串里的数字不变换位置,字符改变。如输入abc123def。那么改变后为:cba123fed。

2012-10-25

文件加密和解密

该代码用C语言实现文件的加密和解密。该文件和密码由自己输入,加密后的文件保存在另一个文件中,输入自己的密码后就能实现解密

2012-10-25

07全国电子设计获奖论文

07全国电子设计大赛国家一等奖获奖论文。

2011-07-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除