- 博客(255)
- 资源 (9)
- 收藏
- 关注
原创 六大原则
单一原则:简单地说就是一个类只做一件事。如果你遵守了这个原则,那么你的类就会划分的很细,每个类都有比较单一的职责,这不就是高内聚、低耦合么!单一职责原则并不是一个类只能有一个函数,而是说这个类中的函数所做的工作是高度相关的,也就是高内聚。依赖反转原则:设计和实现要依赖于抽象而非具体。里氏替换原则:继承会给程序带来侵入性,程序的可移植性降低,增加了对象间的耦合性,如果一个类被其他的类所继承,...
2018-03-13 14:22:03 737
原创 ReentrantLock
ReentrantLock是可重入锁,或者说其持有一个锁计数器,当已持有所的线程再次获得该锁时计数器值加1,每调用一次lock.unlock()时所计数器值减一,直到所计数器值为0,此时线程释放锁;一般try前执行lock(),try中为受保护代码段;finally中执行unlock()可以保证发生异常 锁可以得到释放 避免死锁的发生;ReentrantLock的主要缺点是方法需要置于...
2018-03-13 10:27:39 415
转载 Android 系统稳定性 - ANR(二)
1.2 如何分析ANR问题引起ANR问题的根本原因,总的来说可以归纳为两类:应用进程自身引起的,例如:主线程阻塞、挂起、死循环应用进程的其他线程的CPU占用率高,使得主线程无法抢占到CPU时间片其他进程间接引起的,例如:当前应用进程进行进程间通信请求其他进程,其他进程的操作长时间没有反馈其他进程的CPU占用率高,使得当
2017-11-29 15:26:56 2011
转载 Android 系统稳定性 - ANR(一)
如果你是一个Android应用程序开发人员,你的人生中不可避免的三件事情是:死亡、缴税和ANR。这么说是夸张了,但是由于Android本身的设计,以及应用程序和系统在开发过程中的缺陷,经常会在测试过程中遇到各种各样的ANR问题。在功能性的测试中还少一些,主要是在压力测试中(例如Monkey测试)会遇到非常多的ANR问题。本章的目的就是汇总笔者在工作中遇到的各种ANR问题,将其归纳总结出一套分析和处
2017-11-29 15:25:13 481
转载 Android debuggerd 源码分析
debuggerd 简介Android系统自带一个实用的程序异常退出的诊断daemon debuggerd。此进程可以侦测到程序崩溃,并将崩溃时的进程状态信息输出到文件和串口中,以供开发人员分析调试使用。Debuggerd的数据被保存在/data/tombstone/目录下,共可保存10个文件,当超过10个时,会覆盖重写最早生产的文件。串口中,则直接用DEBUG的tag,输出logcat信
2017-05-18 11:57:41 1065
转载 Gradle配置lintOptions
lint检查对于app来说也是很重要的,可以检查出很多问题。 lint配置 从stackoverflow上扒了一个配置。android { lintOptions { // true--关闭lint报告的分析进度 quiet true // true--错误发生后停止gradle构建 abortOnError fa
2017-03-07 15:42:28 24863
转载 Android native CursorWindow数据保存原理
转自http://blog.csdn.net/ifloveelse/article/details/28394103我们通过Uri查询数据库所得到的数据集,保存在native层的CursorWindow中。CursorWindow的实质是共享内存的抽象,以实现跨进程数据共享。共享内存所采用的实现方式是文件映射。在ContentProvider端透过SQLiteDatab
2017-01-03 14:33:51 1038
原创 如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion
原文出自:http://www.open-open.com/lib/view/open1453253049558.html英文原文:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion作者:Ian Lake,Google Android 推广工程师;翻译:韩国恺。blob.png当你发布一个应用之后,(取决于具体的发布
2016-11-27 14:57:52 361
转载 Android中JavaScript和Native之间的Bridge
原文地址:http://rensanning.iteye.com/blog/2043049为什么手机浏览器或者WebView中不能执行JavaScript调用本地API,而在HTML5混合式应用中却能执行? JavaScript调用本地API大概有4种方法: (1)addJavascriptInterface/@JavascriptInterface And
2016-08-29 11:19:27 2129
转载 Android HTTPS详解
前言最近有一个跟Https相关的问题需要解决,因此花时间学习了一下Android平台Https的使用,同时也看了一些Https的原理,这里分享一下学习心得。HTTPS原理HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HT
2016-07-11 14:34:54 884
原创 Java虚拟机运行时数据区
【本文来自网路,仅供参考】经常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),这种区分方法比较粗糙,Java内存区域的划分实际上远比这复杂。Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,主要包括:虚拟机栈本地方法栈PC寄存器方法区堆区这些数据区域中大致可
2016-04-21 19:59:32 536
转载 如何在Android Studio项目中导入开源库?
前两天,谷歌发布了 Android Studio 1.0的正式版,也有更多的人开始迁移到 Android Studio 进行开发。然而,网上很多的开源库,控件等还是以前的基于 Eclipse 进行开发,很多人不知道怎么导入到自己的基于 Android Studio 项目中来,这里主要介绍一下常见的一些导包的场景。前言同 Eclipse中的项目一样,gradle/andr
2016-01-03 15:14:00 1091
转载 Android耗电评估
这里只是使用最简单的方法对你的app的电量消耗进行评估,如果还想更加详细或者复杂的方法,可以使用一些比较专用的工具,比如Emmagee(https://github.com/NetEase/Emmagee),这个就很好用。第一招:看系统的 设置-电池 里面的耗电排名。除非你的APP耗电很出格,一用手机就发烫、电量直线往下掉,否则,对于大多数用户,你到底耗电怎么样,主要就是看这个了。先测测你的静默耗电
2015-12-09 15:52:57 1956
原创 Linux上wifi找不到网络的解决
root@User-pc:~# ifconfigroot@User-pc:~# ifconfig wlan0 downroot@User-pc:~# ifconfig wlan0 up //到这一般就可以了root@User-pc:~# ifdown wlan0root@User-pc:~# ifup wlan0小结:重启网卡
2015-12-08 10:38:55 10485
原创 swap、page、mmap和Ashmem
【swap 和 page】Linux系统通过2种方法进行内存管理,“调页算法(page)”,“交换技术(swap)”。调页算法是将内存中最近不常使用的页面换到磁盘上,把常使用的页面(活动页面)保留在内存中供进程使用。交换技术是系统将整个进程,而不是部分页面,全部换到磁盘上。【swap 和 page】Linux的swap分区:交换空间是专门用于临时存储内存的一块磁盘空间,通常在页面调度和交换进程数据时
2015-11-23 15:56:07 1451
原创 Android上用tcpdump抓包(转)
1. 手机要有root权限2. 下载tcpdump http://www.strazzere.com/android/tcpdump3. adb push c:\wherever_you_put\tcpdump /data/local/tcpdump4. adb shell chmod 6755 /data/local/tcpdump5, adb shell,
2015-11-06 16:52:12 939
原创 集合的性能提升
ArrayList中查找用binarySearch比indexOf高效,因为前者是二分查找,后者是逐个查找,但前者的使用前提是元素要排序,否则准确性不可靠。
2015-10-20 09:22:55 561
原创 Android 系统源码导入 eclipse
1.复制development/ide/eclipse/.classpath 到源码的根目录下; 2.eclipse中创建java工程,不用起工程名,去掉勾选『Use default location』,选择源码目录ps:如果源码目录是只读的,导入会报权限不够,执行以下命令赋予权限,sudo chmod -R 777 源码目录
2015-10-12 13:52:11 970
转载 疫苗:HashMap的死循环
在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写的,因为Java的HashMap是非线程安全的,所以在并发下必然出现问题。但是,我发现近几年,很多人都经历过这个事(在网上查“HashMap Infinite Loo
2015-10-03 15:34:58 1116
原创 I/O随笔
BufferedInputStream的数据成员buf是一个位数组,默认为2048字节。当读取数据来源时,例如文件,BufferedInputStream会尽量将buf填满。当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源作读取。当buf中的数据不足时,BufferedInputStream才会再实现给定的InputStream对象的read()方法,从指定的装置中提取数
2015-09-19 03:03:37 450
原创 Java GC、新生代、老年代
堆大小 = 新生代 + 老年代。默认下,新生代 ( Young ) = 1/3 的堆空间大小,老年代 ( Old ) = 2/3 的堆空间大小;新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。默认的,Edem : from : to = 8 : 1 : 1;JVM 每次只会使用 Eden
2015-09-14 18:06:45 2459
原创 MAC 下配置代理用于终端下载Android源码
➜ ~ expor http_proxy=’proxy_url:port’ 或 ➜ ~ expor https_proxy=’proxy_url:port’
2015-09-10 12:17:48 920
原创 JVM内存
首先我们来了解JVM specification中的JVM: 主要包括两个子系统和两个组件: Class loader(类装载器) 子系统,Execution engine(执行引擎) 子系统;Runtime data area (运行时数据区域)组件, Native interface(本地接口)组件。 Class load
2015-09-03 17:47:41 512
原创 Android内存分析工具(六):开源项目Emmagee
Emmagee的功能包括:检测被测应用占用的CPU使用率和总体使用量 检测被测应用的内存占用量及百分比 检测流量消耗改项目的真正流弊之处还在于,它不是一种嵌入式工具,而是一个单独的app。所以完全不依赖于开发环境。Git 地址: https://github.com/kevinkong/EmmageeApk地址:http://code.google.com/p/emmagee/downloads
2015-09-02 16:51:49 3561
原创 Android内存分析工具(四):adb命令
adb shell dumpsys meminfo yourpakagename其中Pss对应的TOTAL值为内存所实际占用的值
2015-08-20 23:30:03 10463
原创 Android内存分析工具(三):MAT
Histogram:以下图示为分析内存泄露过程Histogram对比: 如上图,为查找内存泄漏,通常需要两个 Dump结果作对比,打开 Navigator History面板,将两个表的 Histogram结果都添加到 Compare Basket中去 如上图,添加好后,打开 Compare Basket面板,得到结果 如上图,点击右上角的 ! 按钮,将得到比对结果 如上图,为更方便查找差
2015-08-19 20:16:40 2488
原创 Android内存分析工具(二):DDMS
上图为 DDMS中的标签Heap,讲解如下:打开DDMS界面,在左侧面板中选择你要观察的应用程序进程,然后点击Update Heap按钮,接着在右侧面板中点击Heap标签,之后不停地点击Cause GC按钮来实时地观察应用程序内存的使用情况即可。继续操作我们的应用程序,然后继续点击Cause GC按钮,如果你发现反复操作某一功能会导致应用程序内存持续增高而不会下降的话,那么就说明这里很有可能发生
2015-08-19 17:33:21 1759
原创 Android内存分析工具(一):Memory Monitor
Memory Monitor 是android studio 提供的性能分析工具, 可以通过视图直观的看到android应用的内存,CPU占用情况。Memory Monitor可以反映出当前操作带来的CPU和内存变化。
2015-08-19 17:10:58 9875
原创 shallow heap例说
public class Person{ String name; int age; public Person(String a, int b){ name = a; age = b; }}上面类实例的shallow heap是16,因为对象头是8字节,成员变量int是4字节、St
2015-08-18 17:34:32 713
原创 内存概念随笔
如果说一个对象已经不被任何程序逻辑所需要但是还存在被根元素引用的情况,我们可以说这里存在内存泄露。MAT 支持用 OQL(Object Query Language)对 heap dump 中的对象进行查询,支持对线程的分析等。JVM根据generation(代)来进行GC,generation被分为young generation(年轻代)、tenured generation(老年代)、pe
2015-08-18 16:21:45 666
原创 线程随笔
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
2015-08-01 22:49:40 471
转载 Android 性能优化之使用MAT分析内存泄露问题
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/42396507),请尊重他人的辛勤劳动成果,谢谢!我们平常在开发Android应用程序的时候,稍有不慎就有可能产生OOM,虽然JAVA有垃圾回收机,但也不能杜绝内存泄露,内存溢出等问题,随着科技的进步,移动设备的内存也越来越大了,但由于Android设备的参差不
2015-07-27 19:37:36 837
原创 原子性
CPU是按一个一个指令来执行的,每个指令的执行都是不可分割的,原子性的。为了使一些代码块也具有原子性,可以使用synchronized同步。JSL规范定义,类的构造必须是原子性的,非并发的,因此不需要加同步块。个人理解,只要 CPU 被分配给某个线程执行构造方法,则构造期间 CPU 不会切换到其他线程,而是把构造方法这条指令执行完。再进一步说,个人理解,CPU 总是将一条指令执行完才可能切换到其
2015-07-16 09:49:30 535
原创 Volatile
int a = 10;int c = a;理论上来讲每次使用a的时候都应该从a的地址来读取变量值,但是这存在一个效率问题,就是每次使用a都要去内存中取变量值,然后再通过系统总线传到CPU处理,这样开销会很大。所以那些编译器优化者故作聪明,把a读进CPU的cache里,像上面的代码,假如a在赋 值期间没有被改变,就直接从CPU的cache里取a的副本来进行赋值。但是bug也显而易见,可能a已经被另一
2015-07-16 09:42:54 457
原创 单例模式、双检测锁定DCL、volatile(转)
单例模式最要关心的则是对象创建的次数以及何时被创建。Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图)。但是如果在“对象创建的次数以及何时被创建”这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论、涉及到多个类加载器(ClassLoader)协同时
2015-07-15 17:40:11 713
原创 《架构之美》笔记
美是创造矛盾并解决矛盾。架构的多关注点(例如业务逻辑、系统扩展性、持久、并发)和简洁性就是一种矛盾,美丽的架构能解决这种矛盾,使人内心产生愉悦;随着关注点的增加,架构也在不断演进;术:分层、组件化、服务化、标准化、缓存、分离、队列、复制、冗余、代理; 道:如何恰到好处地使用术,例如顿悟变化的道理、博弈中寻找平衡、相对与绝对的奥秘、开放的心态;爱因斯坦说:『让它尽可能简单,但不要过于简单』,美
2015-07-11 01:46:58 1104
SurfaceView示例2
2014-12-22
surfaceview动画示例
2014-12-21
AIDL和远程Service调用实现音乐播放器
2013-12-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人