自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(51)
  • 收藏
  • 关注

原创 JMM内存可见性问题-工作内存读写主存时机

工作内存和主存刷新时机是个很有意思的问题,网上有不少文章,但是写的都不是很全,所以这里亲自下场用代码实验一、内存可见性:内存可见性是并发编程中容易忽略的一个问题,但我认为他是一个非常重要的问题,只有对内存模型深刻理解才能发现这个问题。主内存:线程共享内存,主要是堆和方法区;工作内存:线程私有内存。相比于主存,工作内存离cpu更近性能更好,当线程访问公共变量时,会将变量copy一份到工作内存作为副本,后续都直接操作这个副本。当然这里面核心的问题就是副本什么时候更新?什么时候重新从主存里.

2022-04-15 18:51:40 757

原创 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 2003

原创 重磅整理---Android进程保活组件

github地址: https://github.com/stephen8341/KeepProcLive这里面集成的方案包括:1.  Service指定为START_STICKY 被系统回收的进程会被系统重新拉起2.  Service设置为前台进程 将后台进程设置为前台进程,提高进程优先级   3.  1像素Activity方案 关屏后加载1个像素的Act

2017-05-05 21:54:27 1106 1

原创 android 硬件加速

1. 硬件加速原理:          将所有的cavas操作,比如drawBitmap drawLine 等转化为opengl的操作命令,存储到displaylist中,这样的好处是防止重复绘制?        在对view做动画的时候,可以开启硬件加速,setLayerTyep   这样可以将view缓存到硬件纹理上,做动画的过程中就不会反复绘制view

2017-02-21 20:47:44 397

原创 android性能问题---项目实战

1. HandlerThread导致oom     背景:自动化测试过程中,每一个用例task里面会启动一个HandlerThread,但是HandlerThread是在task构造函数里面启动,而不是onStart里面启动,这样就导致初始化task集合时瞬间start了很多HandlerThread,并且如果中间退出测试,会导致没有开始的task里面的HandlerThread无法释放。最终

2017-01-22 16:21:01 270

转载 struct 的长度对齐

结构体的sizeof的值并不是简单的将其中各个元素所占的字节相加,而是要考虑到存储空间的字节对齐问题结构体默认的字节对齐准则:1.           结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2.           结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字符;3.      

2017-01-16 20:15:46 427

原创 Sqlite线程安全

sqlite是线程安全的,是指写线程安全,这里面是由SqliteConnection保证的,即一个database只有一个connection可以使用,所以天生是安全的。但是如果实在想支持多线程并发访问,可以使用enableAheadLogging开启一个写线程与多个读线程同时在一个SQLiteDatabase上起作用,它的机制是先写到临时日志文件中,再统一flush到数据库文件中。

2017-01-04 15:22:51 1255 2

原创 关于两个设计模式的心得----模版方法模式、责任链模式

最近在做一个蓝牙稳定性的自动化测试工具,就是用app模拟人的行为,自动去跑一些蓝牙相关的测试用例,譬如间隔传输数据、传输大数据、反复开关蓝牙等,再加上不同的参数配置,一共加起来大概有30多个case要跑,并且需要这些case串行执行,就是一个case跑完了才能执行下一个。这个时候如果没有一个设计框架在里面,直接硬编码实现每一个case会无比混乱,尤其是想实现串行执行会很麻烦。所以搞了一套框架,主要

2016-12-09 20:16:48 623

转载 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 223

转载 tcp协议之我理解

1.有连接,可靠传输,数据按序到达的TCP2. 为何建立连接是3次握手,而拆除连接是4次挥手。   3次握手的目的很简单,就是分配资源,初始化序列号,这时还不涉及数据传输,3次就足够做到这个了,而4次挥手的目的是终止数据传输,并回收资源,此时两个端点两个方向的序列号已经没有了任何关系,必须等待两方向都没有数据传输时才能拆除虚链路,不像初始化时那么简单,发现SYN标志就初始化

2016-10-18 16:04:44 222

原创 view invalidate流程

view.invalidate---viewparent.invalidateInparent---ViewRootImpl.invalidateInparent---ViewRootImpl.scheduleTraversals---Choreographer.postCallback        (vsync信号到来)---performTraversals--performDraw--

2016-10-14 21:59:28 584

原创 canvas的save restore clipRect方法解析

之前对canvas的这几个方法一直不是很清楚,今天花点时间总算搞明白了。  1.save restore方法成对出现,用于保存恢复画布canvas,比如需要临时rotate canvas来画一些东西,画完之后再rotate回来画其它东西,这时就可以用这个兄弟  2.cliprect方法,用于将画布切割到指定区域大小来作画,一般需要save restore方法保存恢复画布

2016-10-14 19:10:40 918

原创 watchdog杀死system_server导致系统重启问题分析流程

下面是最近在解一个monkey测试过程中系统重启的bug的分析过程,从这里我们可以看一下对于watchdog杀死死锁进程的一般分析流程。(这里当是一个笔记,没有详细按着文章的逻辑来整理词汇和语句 汗汗汗)1. watchdog: Blocked in handler on ActivityManager (ActivityManager)      说明Activity

2016-09-23 20:41:25 8753

原创 从mms源码看IM应用的架构<二>

Action+ IntentService架构  这一部分给大家总结一下mms里面对于后台任务的处理。正常情况下,一个互联网应用可能会涉及到n多的后台任务要运行,短信应用也不例外,不如插入短信到数据库,删除短信,标记为已读,发送短信,接收短信,下载彩信等。这些都是耗时任务,并且他们之间有些还有先后顺序要求,如果没有一个两个的后台任务管理框架,拿维护起来可就要了亲命了。  这里我们就来看一下

2016-07-14 17:35:21 837

原创 从mms源码看IM应用的架构<一>

最近因为项目在研究mms短信代码,本来以为现在短信已经是一个很鸡肋的功能了,没有什么价值了。但在看代码过程中,却在技术上收获不少,尤其是关于处理N多后台任务的架构设计很不错,可以学习google工程师的代码设计用到自己项目中。好了,下面会从几个方面分析:LoadManager框架、Action+IntentService框架、其它方面。    LoaderManager是什么?正常情况

2016-07-14 10:19:53 518

原创 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 8568 1

原创 快慢指针的时间复杂度探究

对于“访问单向链表倒数第k个结点”,比较成熟的算法是快慢指针,即定义两个指针,一个指针先走k个结点,之后两个指针再一起走,从而拿到倒数第k个结点。快慢指针算法如下:LinkNode* findNode(LinkNode* head){//找到单向链表倒数第2个结点,快慢指针LinkNode* temp = head->next->next;LinkNode*

2016-01-29 16:36:19 1464

原创 二叉查找树、平衡二叉树、红黑树

先看几个基本概念:   树:由根出发,指向n个孩子,孩子再指向孙子。。。这样一种数据结构   二叉树:每个接点最多有两个孩子的树   二叉查找树:每个结点的左子树   平衡二叉树:每个结点左右子树的高度差不大于1   红黑树:从任一节点到其每个叶子的所有简单路径 都包含相同数目的黑色节点。(当然还有其它性质)几点关键点:  1.平衡二叉树/红黑树都属于二叉查找树

2016-01-13 11:09:05 491

原创 Looper.myQueue().addIdleHandler,在activty界面显示后做一些事情,就在这个idlehandler中做

相当于一个处理任务的时间节点。

2016-01-11 17:39:44 3229

原创 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 17499 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 1335

原创 ANDROID6.0指纹识别框架架构

2015-11-27 16:11:06 3132

原创 android input子系统详解

Input子系统是一个庞大的系统,为了简单明了的介绍该系统,我们采用分模块以及倒序追踪的方式来一步步解开它的面纱。  一、java层事件传递过程                                我们从这个button被点击来研究input子系统中事件的传递。废话不多说,对button加一个OnTouchListener,在其onTouch方法上加一个断点,直接利用ec

2015-09-13 16:59:21 5096

原创 android属性动画小结

一直以来都没有用属性动画,认为可以靠postDelayed()一个任务来不断invalidate这个view从而实现动画效果。但是今天发现使用属性动画会更流畅   public void rotateyAnimRun(final View view){ObjectAnimator anim = ObjectAnimator//.ofFloat(view, "zhy", 1.0F

2015-08-03 21:21:14 483

原创 windows7下virtualBox配置识别usb

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

2015-07-06 16:52:09 1955

原创 java并发处理 synchronized volatile ActomicInteger的关系与区别

java中的多线程并发问题是一个让人头疼的问题,因为当多个线程访问同一个资源时,由于一段操作非原子性,就会导致可能出现操作到一半的时候,cpu时间片被切换到其它线程里面去,最终再切换回来的时候,该线程之前所获取的资源已经相当于失效了,但是该线程并不知道,会继续使用,最终导致脏数据的产生。当然java为了解决这个问题提出了同步机制,现在分析其中三个易搞混的东西。  1. synchronized

2015-04-22 12:09:05 2486

转载 探究Android SQLite3多线程

关于getWriteableDataBase()和getReadableDatabase()的真正作用getWriteableDataBase()其实是相当于getReadableDatabase()的一个子方法,getWriteableDataBase()是只能返回一个以读写方式打开的SQLiteDatabase的引用,如果此时数据库不可写时就会抛出异常,比如数据库的磁盘空间满了的情况。

2015-04-10 16:47:58 371

原创 ActivityThread ApplicationThread简要记录

android应用ui是绘制在主线程中的,这个线程就是ActivityThread。但实际上看源码发现ActivityThread并没有继承自Thread,而是一个独立的类,只是在其main方法中开了一个Looper循环消息,不断接收处理发到主线程里面的消息,比如performLaunchActivity.   而ApplicationThread也不是一个Thread,是一个Binder

2015-04-05 15:42:23 1112

原创 ThreadLocal的使用

熟悉Looper源码的朋友可能知道,looper与线程绑定并不是直接set进去的,而是通过ThreadLocal这个东西间接将looper的引用交给当前线程持有的。Looper.java    private static void prepare(boolean quitAllowed) {        if (sThreadLocal.get() != null) {   

2015-04-04 20:59:29 677

转载 Android获取图片指定大小的缩略图--inJustDecodeBounds的使用

在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片

2015-03-31 15:05:41 665

原创 三分钟理解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 2039

转载 android view原理

分三个阶段来看第一步需要 知道view的绘制过程View绘制流程以及invalidate()等相关方法分析整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简单概况为 根据之前设置的状态,判断是否需要重新计算视图大小(measure)、是否重新需要安置视图的位置(layou

2015-03-31 11:34:35 1862

原创 ListView的缓存原理

之前一直不清楚 getView(int position, View convertView, ViewGroup vg)中的convertView是怎么进行缓存管理的。今天看了一下相关源码及网上的相关介绍,终于明白了。在这里把里面的关键点梳理出来。      class RecycleBin {        private ArrayList[] mScrapViews;

2015-03-26 20:26:26 694

转载 Android性能调优实例

本文主要分享自己在appstore项目中的性能调优点,包括同步改异步、缓存、Layout优化、数据库优化、算法优化、延迟执行等。一、性能瓶颈点整个页面主要由6个Page的ViewPager,每个Page为一个GridView,GridView一屏大概显示4*4的item信息(本文最后有附图)。由于网络数据获取较多且随时需要保持页面内app下载进度及状态,所以出现以下性能问题a.  Vi

2015-03-23 15:47:35 383

转载 Android性能优化案例研究(下)

目录[-]去掉冗余的图层重要:去掉桌面背景:进一步去掉重绘一句建议:Activity名字:未来的优化:扁平化View的层级如何扁平化你的界面:关于输入事件?现在轮到你了!提示:译者前言:在Android性能优化案例研究(上)中,作者Romain Guy将Falcon Pro这款应用作为例子,通过Android现有的工具追踪和分

2015-03-20 18:15:53 418

转载 Android性能优化案例研究(上)

目录[-]Falcon Pro说说关于性能优化证实我的疑问方法:提醒:关于“Execute”:进一步研究注意:技巧:可视化重绘透明像素:重绘和GPU:英文原文:Android Performance Case Study  编译:ImportNew - 孙立译 者前言:这是Google的Android开发工

2015-03-20 18:14:11 462

转载 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 525

转载 Android性能调优

(一) 查询数据库没有关闭游标(二) 构造Adapter时,没有使用缓存的 convertView (三) Bitmap对象不在使用时调用recycle()释放内存(四) 释放对象的引用描述:    这种情况描述起来比较麻烦,举两个例子进行说明。示例A:假设有如下操作public class DemoAct

2015-03-05 15:37:18 427

原创 WindowManager当前焦点窗口管理,及多用户下当前焦点window错乱问题

android中窗口是由WindowManagerService管理的,其中有一个成员变量mCurrentFocus,记录的是当前的焦点窗口,用于将实时input event传递给这个window处理,比如back键。当然在activity切换的时候,这个mCurrentFocus的值会实时变化成当前activity所在的window.这个原生逻辑本来是没有问题的,但是在引入多用户之后,情况却变的

2015-02-12 11:45:02 6940 4

原创 activity界面劫持--qq钓鱼应用分析

"在其位谋其政 任其职尽其责",既然进入了安全领域就应该做出一点相关的成果出来,否则就是名不符实,而我今天总算做出了一点真正和安全相关的东西了,记录于此。我的项目组做的是一个叫安全容器的东西,大致上就是在系统中虚拟出另外一个操作环境与普通环境隔离开来,这个环境可以进行一些安全度高的操作,比如支付,并且保证不被普通环境影响。主要是针对政府企业单位的产品,最大的亮点当然就是这个隔离性了。

2015-02-04 17:08:15 1215

空空如也

空空如也

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

TA关注的人

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