自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 Android IM SDK开发设计大纲

IM SDK开发 数据协议 数据编解码与数据加解密 TLV编解码的JAVA实现与优化 数据加解密 SDK架构设计 公共部分 TLV编解码 数据存储与共享 跨进程通信管理 配置管理 自定义异常 大数据埋点统计 APP进程 协议请求管理 协议响应管理 消息...

2020-05-26 01:14:57 19 0

原创 Activity启动流程和源码解析

↓双击 Markdown插件,就可以开始编辑啦。 APP进程 ActivityThread的启动 public static void main(String[] args) { ActivityThread thread = new ActivityThread(); ...

2020-04-17 18:09:33 37 0

原创 APP启动优化案例

布局优化 窗体的布局结构: 窗体布局层次: 窗体绘制: 上图中是表明DecorView的加载耗时:31.89ms 检测方法耗时 手表性能太低,无法使用traceview去跟踪方法耗时,会造成ANR aop的方式还要再集成或者自己开发来获取方法耗时,开发耗时周期太长 简单粗...

2018-12-14 22:51:37 171 0

原创 从源码的角度分析ThreadPoolExecutor实现原理

线程池(ThreadPoolExecutor)的几个状态 RUNNING:Accept new tasks and process queued tasks(可接受新的任务并且执行已经加入队列的任务) SHUTDOWN:Don’t accept new tasks, but process q...

2018-08-21 11:44:29 138 0

原创 数据结构?从HashMap的源码分析开始!

Hash(哈希) 哈希即散列,散列表是为了解决高速存取而设计的,是一种典型的通过空间去换取时间的做法;为啥叫散列?其实我们可以把这个数据接口理解为一个线性的表,但是这个表当中的元素并不是紧密排列的,而是分散的,元素与元素之间可能存在间隙,所以这里就会造成空间上的浪费;散列表是依据Key-Val...

2018-07-17 17:52:50 90 0

原创 TextView实现自定义换行以及缩进文字的格式化对齐

自定义换行 我们通常在自定义控件的时候会遇到不想用系统默认的文字换行,而需要根据自己的需求来实现文字的换行,原理如下: 使用Paint的measureText方法来测量文字的长度 假设设定单行的最大长度为maxWidth,那么就通过measureText来测量每一个字的长度,然后不断的累加再...

2018-07-02 21:36:58 1094 0

原创 自定义实现垂直滚动的TextView

需求 当TextView限制最大行数的时候,文本内容超过最大行数可自动实现文本内容向上滚动 随着TextView的文本内容的改变,可自动计算换行并实时的向上滚动 文字向上滚动后可向下滚动回到正确的水平位置 自定义方法 自定义一个View,继承自View,定重写里面的onDraw方法 文...

2018-07-02 20:20:58 247 0

原创 Android中使用Contentprovider导致进程被杀死

使用contentprovider发现的问题 在我们的android设备上有两个app,app1提供了一个contentprovider出去,也就是contentprovider的server端,app2使用了app1提供的contentprovider,也就是contentprovider的...

2018-06-30 17:26:19 1581 0

原创 TCP问题分析

TCP问题分析 网络的五层协议 物理层 数据链路层 网络层,IP协议,ICMP协议(ping) 传输层,传输层有两个协议,面向连接的TCP和无连接的UDP,TCP是点对点的可靠连接,保证数据顺序必达,UDP是无连接的,不保证数据顺序必达,UDP的传输效率要比TCP高,但是可能会丢包,而且...

2018-01-12 15:25:28 249 0

原创 JVM内存区域与OOM

说明:本篇博客属于读书笔记,大量参考《深入理解Java虚拟机》这本书 JVM的内存 程序计数器 程序计数器是线程私有的,每一个线程都有自己的一个程序计数器,并且互不干扰,程序计数器相当于当前代码所执行指令的指针,控制了当前线程的执行流程,当Java程序在执行Java方法的时候,程序...

2018-01-12 15:24:33 232 0

原创 Android界面绘制原理

Android的Activity界面从何处开始绘制 Activity启动之后,灰溜溜的会去跑onCreate,onStart,onResume等生命周期方法,那么从framework里面,让我们看看Activity在onResume之前都在干些啥? 在ActivityThread中的hand...

2018-01-12 15:24:09 641 0

原创 Android事件分发原理分析

MotionEvent.ACTION_DOWN传递 在Android中,触碰控件的时候回产生一个ACTION_DOWN事件并逐层向下传递,首先ACTION_DOWN回先从Activity的dispatchTouchEvent方法开始向下传递: public boolean dispatch...

2018-01-12 15:23:39 151 0

原创 Android ANR在线监控原理

Android中的Watchdog 在Android中,Watchdog是用来监测关键服务是否发生了死锁,如果发生了死锁就kill进程,重启SystemServer Android的Watchdog是在SystemServer中进行初始化的,所以Watchdog是运行在SystemServer...

2018-01-12 15:23:19 1222 0

原创 Android开发之逻辑单元测试

单元测试的必要性 完整,规范的单元测试有利于提升程序的“自动化”验证 降低后期程序的维护成本 高覆盖率的单元测试在很大程度上能提前发现一些潜在的bug 编写单元测试的过程中可以帮助程序模块化重构,一个耦合性非常高的程序是无法针对他编写完善的单元测试的 private void conn...

2018-01-12 15:22:58 176 0

原创 startActivity的Hook之路

Hook Context.startActivity和Activity.startActivity Context的startActivity其实具体是由ContextImpl去实现的,首先来看下framework的相关源码ContextImpl: @Override publ...

2018-01-12 15:22:31 127 0

原创 BlockCanary源码解析

BlockCanary原理 如何计算主线程的方法执行耗时 计算方法耗时最简单粗暴的就是在方法之前前记录下开始时间,方法执行完后用当前时间剪去方法开始执行的时间就完事了,但是主线程那么多方法总不能每一个方法都这个干吧?那肯定崩!有没有一个统一的地方来实现这个功能?当然有了,不然这篇博客...

2018-01-12 15:21:56 287 0

原创 本人简书博客:http://www.jianshu.com/u/61b0362f5329

简书博客地址:简书博客地址

2017-09-08 23:14:20 1124 0

原创 Android Studio的Proguard(代码混淆)

混淆误区 在android studio中AndroidMainifest.xml文件,对于主APP工程和lib工程来说,在生成apk的时候是会自动合并的,这给我造成一个误区让我以为主工程里面配置的混淆和lib工程配置的混淆在生成apk的时候也会自动合并,经过测试发现,混淆配置是不会合并的 如果A...

2017-06-08 13:22:19 5807 2

原创 Battery Historian2.0使用过程中遇到的一些问题

could not parse aggregated battery stats 之前有一篇文章Android5.0系统耗电分析中提到用Battery Historian来分析耗电问题,但是在最近几次用Battery Historian2.0分析的时候点击Submit按钮analyse成功后,进入...

2017-01-09 11:39:24 5583 2

原创 启动Activity前的黑屏

在启动的Activity的onCreate里面做了太多的事情导致初始化activity太慢 onCreate做到精简,如果实在不行那就开异步任务,这样onCreate就不会因为执行太多任务都卡住,可以顺利的回调下面的生命周期,因为activity是在onResume的时候才是可视的 在start下...

2016-12-17 11:43:01 1339 0

原创 Android5.0系统耗电分析

耗电检测环境搭建(Battery Historian2.0) 这里啰嗦一句,Battery Historian1.0已经过时了,而且1.0的分析表格远远没有2.0来的详细,所以推荐用2.0的环境来检测,但是2.0的环境搭建比1.0要稍微复杂一点 go语言环境安装 go语言环境变量配置,这个跟j...

2016-12-09 17:10:57 1477 1

原创 Android APP内存泄漏分析

Activity内部类泄漏 Activity如果存在内部类,无论是匿名内部类,或者是声明的内部类,都有可能造成Activity内存泄漏,因为内部类默认是直接持有这个activity的引用,如果内部类的生命周期比activity的生命周期要长,那么在activity销毁的时候内部类仍然存在并且持有a...

2016-11-05 16:11:12 2333 0

原创 Android开发中的APP内存泄漏检测

使用android shell命令查看内存使用情况使用adb shell dumpsys meminfo pkgname或者直接使用AndroidStudio里面的memory usage功能然后就会出现如下信息:Applications Memory Usage (kB): Uptime: 14...

2016-10-19 21:40:23 3166 0

原创 Android APP耗电优化

可能造成耗电的一些原因 网络请求耗电,而且手机数据网络进行http请求比无线网进行http请求更加耗电,因为数据网络调用到一些底层的硬件模块,就如GPS一样,当手机打开GPS功能后,也是启动了一些硬件模块就会明显增加耗电 高频的刷新UI界面,刷新UI界面其实就是进行layout的绘制,如果一个Ac...

2016-10-18 18:25:47 5132 1

原创 IM推送之客户端SDK开发(二)

IM Android端SDK开发过程中遇到的问题华为手机 我们曾经采用Native守护进程保活的方案做到了在android5.0系统以下的手机可以做到push进程被杀死后能够重启,后来在华为一些机型手机上出现严重的耗电问题,同时也发现在这些机型上Native层的守护进程无效,push进程被杀死后无...

2016-10-16 18:52:02 813 0

原创 IM推送之客户端SDK开发(一)

什么是IM IM就是即时通讯(instant messenger)的简称,市面上比较流行的即时通讯APP有微信,易信,阿里旺旺,陌陌等,在Android平台上,即时通讯主要都是通过TCP来实现的 TCP的鲜明特点 TCP连接是可靠连接,保证消息必达 TCP链路是双工通道,所谓双工就是链路两端都...

2016-10-14 18:18:37 1677 0

原创 IM推送Android客户端之重连策略

话不多直接进入主题 所谓重连就是Android客户端额度TCP连接断开之后自动进行连接,但是有时候会遇到一直重连不上的情况,那么就不能一直频繁的进行重连操作,毕竟在手机休眠的时候重连操作可能会有网络数据通信,手机会被唤醒,等重连操作完成后手机才会再进入休眠,所以频繁的重连会导致手机频繁的唤醒,...

2016-10-14 15:49:46 1183 0

原创 IM推送Android客户端SDK之智能心跳

微信的智能心跳策略微信智能心跳策略1. 为什么TCP连接需要心跳? 因为运营商有一个NAT超时:因为IP v4的IP量有限,运营商分配给手机终端的IP是运营商内网的IP,手机要连接Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation...

2016-09-29 15:18:51 2218 1

原创 进程保活之——这绝对不是扯淡

之前写了篇关于service保活的博客,其实这么长时间下来,感觉service的存活率并没有什么提升,提升的只是心里安慰。。。废话不多说,试了下酷狗音乐即使关掉了任何受保护开关,自启动开关,在华为6.0系统锁定屏幕后依然可以保持运行,即便是不播放音乐也可以保持程序不被杀死,所以就想到了是不是跟音乐...

2016-07-31 17:01:33 2705 8

原创 Android移动端IM开发之应用层实现TCP长连接多路复用

这里只是提供一个长连接多路复用的实现思路什么是长连接多路复用 从字面意思看就是一台设备只有一条长连接连向服务器,其他集成这个IM SDK的app都会共享这条长连接,TCP长连接的维护是比较耗资源的,而且也会增加耗电,所以实现长连接共享就表示在一定程度上降低了耗电也节省了内存 java里面还有一个I...

2016-04-22 17:09:50 4322 12

原创 关于Android系统休眠后,线程的执行情况

理论上,android系统休眠后,app进程会被挂起,所以相关的执行线程也会被挂起,那些java线程的操作例如:wait,await,sleep,循环阻塞,handler的delay,线程池的delay操作都会被挂起,因为它们使用的系统计时器在休眠的时候是停止的,例如:SystemClock.up...

2016-04-22 14:56:16 7519 2

原创 java多线程编程的volatile应用

volatile是一个原子属性的修饰,什么是原子,按照我的理解就是原子属性可以支持多线程编程。int a = 0; new Thread(){ public void run(){ a++; } }.start();new Thread(){ public void ru...

2016-04-21 16:08:36 380 0

原创 广播和Service唤醒被杀死的android app

静态的系统广播静态的系统广播,例如:开机广播,用户开屏广播,USB插入和拔出广播等这类广播在app运行期间可以用静态注册的广播正常接收,但是在app被杀死后就无法收到了,android系统做了屏蔽,把被杀死的app的系统静态广播都过滤了,所以想让app被杀死后仍然通过静态注册的广播接收系统广播是做...

2016-04-12 20:31:58 13085 5

原创 Java中整形和byte数组相互转换,支持正负数

/** * 字节数组转int,适合转高位在前低位在后的byte[] * * @param bytes * @return */ public static long byteArrayToLong(byte[] bytes) { ...

2016-04-09 16:33:45 4661 0

原创 Android几种弹窗的实现

直接使用android sdk里面的Dialog以及子类AlertDialog,这种弹窗要求依赖Activity环境,如果传入的context不是activity就会报错,所以这种弹窗是和界面强相关的 使用系统弹窗:TYPE_SYSTEM_ALERT,而且要加权限:android.permissi...

2016-03-31 16:01:15 5526 0

原创 Java多线程锁异常:IllegalMonitorStateException

在项目多线程编程中用了ReentrantLock配合Condition来控制线程的加锁和解锁:private void signalAllConnect() { final ReentrantLock lock = this.connectLock; try { ...

2016-03-26 11:38:14 4067 1

原创 Android中的进程之间的通信

Android中的进程通信主要有三种1.广播广播是比较常用的进程间通信的方式,而且实现起来也比较简单 缺点:某些手机对于静态注册的广播的发送和接收延迟非常严重,例如一些配置很低的手机,华硕,联想的部分低配手机就对静态注册的广播有较长的延迟,我曾经遇到过的有延迟1到2分钟的;广播的数据传输是有限的...

2016-03-24 23:58:56 1596 0

原创 Android多进程导致多次初始化Application

最近项目中遇到一个问题:APP运行2个进程,然后发现APP的Application的onCreate被调用了两次,导致Application初始化了两次,造成app启动的时候非常缓慢而且已启动占用的内存很大,因为两个进程都初始化了相同的资源,而且两个进程是相互独立的,所以各自初始化的资源都是独立的...

2016-03-24 16:33:03 5822 0

原创 Eventbus是如何实现事件分发的

Evenbus是基于java反射机制来实现事件分发的 EventBus.getDefault().register(this);这里的this一般情况下是Activity类,但其实它只要是一个Object就可以了,Eventbus支持任何对象的事件分发 public void register(O...

2016-03-21 17:40:57 1865 0

原创 AsyncTask原理

AsyncTask默认一次只能执行一个任务AsyncTask默认是使用线程池实现异步操作的,如果你调用的是execute()方法,那么:public final AsyncTask<Params, Progress, Result> execute(Params... params) ...

2016-03-21 02:32:34 1429 0

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