- 博客(51)
- 收藏
- 关注
原创 JMM内存可见性问题-工作内存读写主存时机
工作内存和主存刷新时机是个很有意思的问题,网上有不少文章,但是写的都不是很全,所以这里亲自下场用代码实验一、内存可见性:内存可见性是并发编程中容易忽略的一个问题,但我认为他是一个非常重要的问题,只有对内存模型深刻理解才能发现这个问题。主内存:线程共享内存,主要是堆和方法区;工作内存:线程私有内存。相比于主存,工作内存离cpu更近性能更好,当线程访问公共变量时,会将变量copy一份到工作内存作为副本,后续都直接操作这个副本。当然这里面核心的问题就是副本什么时候更新?什么时候重新从主存里.
2022-04-15 18:51:40
829
原创 Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.android.suppor
“Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+.”这个问题很蛋疼啊,本质上是v7包依赖问题。查了各种方法搞不定,最后试了重新添加依赖:这个是直接在库里面找的更具体的版本,果然,一替换就好了。。。坑爹的gra...
2018-05-21 16:08:52
2050
原创 重磅整理---Android进程保活组件
github地址: https://github.com/stephen8341/KeepProcLive这里面集成的方案包括:1. Service指定为START_STICKY 被系统回收的进程会被系统重新拉起2. Service设置为前台进程 将后台进程设置为前台进程,提高进程优先级 3. 1像素Activity方案 关屏后加载1个像素的Act
2017-05-05 21:54:27
1132
1
原创 android 硬件加速
1. 硬件加速原理: 将所有的cavas操作,比如drawBitmap drawLine 等转化为opengl的操作命令,存储到displaylist中,这样的好处是防止重复绘制? 在对view做动画的时候,可以开启硬件加速,setLayerTyep 这样可以将view缓存到硬件纹理上,做动画的过程中就不会反复绘制view
2017-02-21 20:47:44
420
原创 android性能问题---项目实战
1. HandlerThread导致oom 背景:自动化测试过程中,每一个用例task里面会启动一个HandlerThread,但是HandlerThread是在task构造函数里面启动,而不是onStart里面启动,这样就导致初始化task集合时瞬间start了很多HandlerThread,并且如果中间退出测试,会导致没有开始的task里面的HandlerThread无法释放。最终
2017-01-22 16:21:01
286
转载 struct 的长度对齐
结构体的sizeof的值并不是简单的将其中各个元素所占的字节相加,而是要考虑到存储空间的字节对齐问题结构体默认的字节对齐准则:1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2. 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字符;3.
2017-01-16 20:15:46
451
原创 Sqlite线程安全
sqlite是线程安全的,是指写线程安全,这里面是由SqliteConnection保证的,即一个database只有一个connection可以使用,所以天生是安全的。但是如果实在想支持多线程并发访问,可以使用enableAheadLogging开启一个写线程与多个读线程同时在一个SQLiteDatabase上起作用,它的机制是先写到临时日志文件中,再统一flush到数据库文件中。
2017-01-04 15:22:51
1308
原创 关于两个设计模式的心得----模版方法模式、责任链模式
最近在做一个蓝牙稳定性的自动化测试工具,就是用app模拟人的行为,自动去跑一些蓝牙相关的测试用例,譬如间隔传输数据、传输大数据、反复开关蓝牙等,再加上不同的参数配置,一共加起来大概有30多个case要跑,并且需要这些case串行执行,就是一个case跑完了才能执行下一个。这个时候如果没有一个设计框架在里面,直接硬编码实现每一个case会无比混乱,尤其是想实现串行执行会很麻烦。所以搞了一套框架,主要
2016-12-09 20:16:48
662
转载 http协议之我理解
1.HTTP请求的请求行 GET/POST2.HTTP响应的状态行 200 404 5003.HTTP消息报头 Connection:keep-alive Cache-Control l 请求报头 Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/ht
2016-10-18 16:30:31
235
转载 tcp协议之我理解
1.有连接,可靠传输,数据按序到达的TCP2. 为何建立连接是3次握手,而拆除连接是4次挥手。 3次握手的目的很简单,就是分配资源,初始化序列号,这时还不涉及数据传输,3次就足够做到这个了,而4次挥手的目的是终止数据传输,并回收资源,此时两个端点两个方向的序列号已经没有了任何关系,必须等待两方向都没有数据传输时才能拆除虚链路,不像初始化时那么简单,发现SYN标志就初始化
2016-10-18 16:04:44
247
原创 view invalidate流程
view.invalidate---viewparent.invalidateInparent---ViewRootImpl.invalidateInparent---ViewRootImpl.scheduleTraversals---Choreographer.postCallback (vsync信号到来)---performTraversals--performDraw--
2016-10-14 21:59:28
615
原创 canvas的save restore clipRect方法解析
之前对canvas的这几个方法一直不是很清楚,今天花点时间总算搞明白了。 1.save restore方法成对出现,用于保存恢复画布canvas,比如需要临时rotate canvas来画一些东西,画完之后再rotate回来画其它东西,这时就可以用这个兄弟 2.cliprect方法,用于将画布切割到指定区域大小来作画,一般需要save restore方法保存恢复画布
2016-10-14 19:10:40
952
原创 watchdog杀死system_server导致系统重启问题分析流程
下面是最近在解一个monkey测试过程中系统重启的bug的分析过程,从这里我们可以看一下对于watchdog杀死死锁进程的一般分析流程。(这里当是一个笔记,没有详细按着文章的逻辑来整理词汇和语句 汗汗汗)1. watchdog: Blocked in handler on ActivityManager (ActivityManager) 说明Activity
2016-09-23 20:41:25
9001
原创 从mms源码看IM应用的架构<二>
Action+ IntentService架构 这一部分给大家总结一下mms里面对于后台任务的处理。正常情况下,一个互联网应用可能会涉及到n多的后台任务要运行,短信应用也不例外,不如插入短信到数据库,删除短信,标记为已读,发送短信,接收短信,下载彩信等。这些都是耗时任务,并且他们之间有些还有先后顺序要求,如果没有一个两个的后台任务管理框架,拿维护起来可就要了亲命了。 这里我们就来看一下
2016-07-14 17:35:21
873
原创 从mms源码看IM应用的架构<一>
最近因为项目在研究mms短信代码,本来以为现在短信已经是一个很鸡肋的功能了,没有什么价值了。但在看代码过程中,却在技术上收获不少,尤其是关于处理N多后台任务的架构设计很不错,可以学习google工程师的代码设计用到自己项目中。好了,下面会从几个方面分析:LoadManager框架、Action+IntentService框架、其它方面。 LoaderManager是什么?正常情况
2016-07-14 10:19:53
542
原创 adb 查看wifi命令
4. 打开WIFI指令 svc wifi enable5. 关闭WIFI指令 svc wifi disableps|grep wifi 查看wpa_supplicant是不是已经起来了6.查看ip: adb shell netcfg
2016-04-26 20:40:03
8641
1
原创 快慢指针的时间复杂度探究
对于“访问单向链表倒数第k个结点”,比较成熟的算法是快慢指针,即定义两个指针,一个指针先走k个结点,之后两个指针再一起走,从而拿到倒数第k个结点。快慢指针算法如下:LinkNode* findNode(LinkNode* head){//找到单向链表倒数第2个结点,快慢指针LinkNode* temp = head->next->next;LinkNode*
2016-01-29 16:36:19
1509
原创 二叉查找树、平衡二叉树、红黑树
先看几个基本概念: 树:由根出发,指向n个孩子,孩子再指向孙子。。。这样一种数据结构 二叉树:每个接点最多有两个孩子的树 二叉查找树:每个结点的左子树 平衡二叉树:每个结点左右子树的高度差不大于1 红黑树:从任一节点到其每个叶子的所有简单路径 都包含相同数目的黑色节点。(当然还有其它性质)几点关键点: 1.平衡二叉树/红黑树都属于二叉查找树
2016-01-13 11:09:05
537
原创 Looper.myQueue().addIdleHandler,在activty界面显示后做一些事情,就在这个idlehandler中做
相当于一个处理任务的时间节点。
2016-01-11 17:39:44
3261
原创 FutureTask的cancel方法真的能停止掉一个正在执行的异步任务吗
public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); FutureTask futureTask = new FutureTask(new Callable() { @Override public String call()
2015-12-30 14:25:49
17757
11
转载 测试页面刷新帧率的python脚步
#!/usr/bin/env python# -*- coding: UTF-8 -*-import osimport time,re,csvcsvWriter = csv.writer(file('fps_realtime.csv','wb'))csvWriter.writerow(['timestamp','fps'])lines = ''str =
2015-12-04 11:17:41
1370
原创 android input子系统详解
Input子系统是一个庞大的系统,为了简单明了的介绍该系统,我们采用分模块以及倒序追踪的方式来一步步解开它的面纱。 一、java层事件传递过程 我们从这个button被点击来研究input子系统中事件的传递。废话不多说,对button加一个OnTouchListener,在其onTouch方法上加一个断点,直接利用ec
2015-09-13 16:59:21
5154
原创 android属性动画小结
一直以来都没有用属性动画,认为可以靠postDelayed()一个任务来不断invalidate这个view从而实现动画效果。但是今天发现使用属性动画会更流畅 public void rotateyAnimRun(final View view){ObjectAnimator anim = ObjectAnimator//.ofFloat(view, "zhy", 1.0F
2015-08-03 21:21:14
501
原创 windows7下virtualBox配置识别usb
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
2015-07-06 16:52:09
1993
原创 java并发处理 synchronized volatile ActomicInteger的关系与区别
java中的多线程并发问题是一个让人头疼的问题,因为当多个线程访问同一个资源时,由于一段操作非原子性,就会导致可能出现操作到一半的时候,cpu时间片被切换到其它线程里面去,最终再切换回来的时候,该线程之前所获取的资源已经相当于失效了,但是该线程并不知道,会继续使用,最终导致脏数据的产生。当然java为了解决这个问题提出了同步机制,现在分析其中三个易搞混的东西。 1. synchronized
2015-04-22 12:09:05
2542
转载 探究Android SQLite3多线程
关于getWriteableDataBase()和getReadableDatabase()的真正作用getWriteableDataBase()其实是相当于getReadableDatabase()的一个子方法,getWriteableDataBase()是只能返回一个以读写方式打开的SQLiteDatabase的引用,如果此时数据库不可写时就会抛出异常,比如数据库的磁盘空间满了的情况。
2015-04-10 16:47:58
388
原创 ActivityThread ApplicationThread简要记录
android应用ui是绘制在主线程中的,这个线程就是ActivityThread。但实际上看源码发现ActivityThread并没有继承自Thread,而是一个独立的类,只是在其main方法中开了一个Looper循环消息,不断接收处理发到主线程里面的消息,比如performLaunchActivity. 而ApplicationThread也不是一个Thread,是一个Binder
2015-04-05 15:42:23
1124
原创 ThreadLocal的使用
熟悉Looper源码的朋友可能知道,looper与线程绑定并不是直接set进去的,而是通过ThreadLocal这个东西间接将looper的引用交给当前线程持有的。Looper.java private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) {
2015-04-04 20:59:29
698
转载 Android获取图片指定大小的缩略图--inJustDecodeBounds的使用
在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片
2015-03-31 15:05:41
684
原创 三分钟理解Java继承和多态原理
现上一道面试题public class MainClass { public static void main(String[] args) { Fu f = new Zi(); Zi z = new Zi(); System.out.println("f.num:"+f.num); System.out.p
2015-03-31 11:48:21
2068
转载 android view原理
分三个阶段来看第一步需要 知道view的绘制过程View绘制流程以及invalidate()等相关方法分析整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简单概况为 根据之前设置的状态,判断是否需要重新计算视图大小(measure)、是否重新需要安置视图的位置(layou
2015-03-31 11:34:35
1894
原创 ListView的缓存原理
之前一直不清楚 getView(int position, View convertView, ViewGroup vg)中的convertView是怎么进行缓存管理的。今天看了一下相关源码及网上的相关介绍,终于明白了。在这里把里面的关键点梳理出来。 class RecycleBin { private ArrayList[] mScrapViews;
2015-03-26 20:26:26
717
转载 Android性能调优实例
本文主要分享自己在appstore项目中的性能调优点,包括同步改异步、缓存、Layout优化、数据库优化、算法优化、延迟执行等。一、性能瓶颈点整个页面主要由6个Page的ViewPager,每个Page为一个GridView,GridView一屏大概显示4*4的item信息(本文最后有附图)。由于网络数据获取较多且随时需要保持页面内app下载进度及状态,所以出现以下性能问题a. Vi
2015-03-23 15:47:35
400
转载 Android性能优化案例研究(下)
目录[-]去掉冗余的图层重要:去掉桌面背景:进一步去掉重绘一句建议:Activity名字:未来的优化:扁平化View的层级如何扁平化你的界面:关于输入事件?现在轮到你了!提示:译者前言:在Android性能优化案例研究(上)中,作者Romain Guy将Falcon Pro这款应用作为例子,通过Android现有的工具追踪和分
2015-03-20 18:15:53
437
转载 Android性能优化案例研究(上)
目录[-]Falcon Pro说说关于性能优化证实我的疑问方法:提醒:关于“Execute”:进一步研究注意:技巧:可视化重绘透明像素:重绘和GPU:英文原文:Android Performance Case Study 编译:ImportNew - 孙立译 者前言:这是Google的Android开发工
2015-03-20 18:14:11
486
转载 ubuntu 14.04 安装chrome及给chromium 安装 flash player
在网上尝试很多方法,大多数是拷贝 libflashplayer.so,尝试之后,没有用。最后还是从大牛处找到了办法,其实就是chromium提示的安装方法,不过chromium推荐用软件更新器做,远没有命令方便。简单点说,打开terminal:sudo apt-get install pepperflashplugin-nonfreesudo update-pepper
2015-03-17 10:34:01
541
转载 Android性能调优
(一) 查询数据库没有关闭游标(二) 构造Adapter时,没有使用缓存的 convertView (三) Bitmap对象不在使用时调用recycle()释放内存(四) 释放对象的引用描述: 这种情况描述起来比较麻烦,举两个例子进行说明。示例A:假设有如下操作public class DemoAct
2015-03-05 15:37:18
438
原创 WindowManager当前焦点窗口管理,及多用户下当前焦点window错乱问题
android中窗口是由WindowManagerService管理的,其中有一个成员变量mCurrentFocus,记录的是当前的焦点窗口,用于将实时input event传递给这个window处理,比如back键。当然在activity切换的时候,这个mCurrentFocus的值会实时变化成当前activity所在的window.这个原生逻辑本来是没有问题的,但是在引入多用户之后,情况却变的
2015-02-12 11:45:02
7076
2
原创 activity界面劫持--qq钓鱼应用分析
"在其位谋其政 任其职尽其责",既然进入了安全领域就应该做出一点相关的成果出来,否则就是名不符实,而我今天总算做出了一点真正和安全相关的东西了,记录于此。我的项目组做的是一个叫安全容器的东西,大致上就是在系统中虚拟出另外一个操作环境与普通环境隔离开来,这个环境可以进行一些安全度高的操作,比如支付,并且保证不被普通环境影响。主要是针对政府企业单位的产品,最大的亮点当然就是这个隔离性了。
2015-02-04 17:08:15
1240
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人