- 博客(116)
- 资源 (1)
- 收藏
- 关注
原创 Android 预置应用
Android如何将第三方应用预置到手机中?分析下该需求,预置第三方应用,要求可卸载,恢复出厂设置后可恢复这些应用。就需要将这些应用预置到system下面,如果放到data下面恢复出厂设置后就不能恢复这些应用了。一、代码设计1、创建“/system/presetapp”目录,将预置应用保存到该目录下。2、在PackageManagerService的构造方法里创建PresetApp的对
2018-04-03 16:42:39
1973
原创 Android性能优化 -- 布局优化
一、前言根据Google官方出品的Android性能优化典范,60帧每秒是目前最合适的图像显示速度,事实上绝大多数的Android设备也是按照每秒60帧来刷新的。为了让屏幕的刷新帧率达到60fps,我们需要确保在时间16ms(1000/60HZ)内完成单次刷新的操作(包括measure、layout、draw),这也是Android系统每隔16ms就会发出一次VSYNC信号触发对UI进行渲染的
2018-03-01 14:14:25
541
原创 Android性能优化 -- 应用启动优化之启动页设计
上篇博客我们学习了应用启动优化的一些优化思路,经过这些优化后,如果还不能达到你的要求,我们一般会做个启动页。因为启动页一般View数量比较少,业务逻辑比较简单,因此启动比较快。一、设计思路常规启动页设计思路通常点击桌面就会执行Application中的逻辑,然后会跳入启动页SplashActivity,通常展示一个图片和logo,然后2或3秒后,并且SplashActivity里面可以去做一些Ma...
2018-02-08 18:01:39
691
原创 Android性能优化 -- 应用启动优化
应用的启动启动方式通常来说,在Android中应用的启动方式分为两种:冷启动和热启动。1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程依然会保留在后台,可进入任务列表查看),所以在已有进程的
2018-02-07 16:26:06
784
原创 Android性能优化 -- 应用启动优化之DelayLoad
对于应用启动优化,其实核心思想就是在启动过程中少做事情,具体实践的时候无非就是下面几种: 1. 异步加载; 2. 延时加载; 3. 懒加载。 我们这篇博客主要学习一下一种延时加载(DelayLoad)的实现及其原理。DelayLoad的实现是非常简单的,但是原理比较复杂,其中还涉及到Looper、Handler、MessageQueue、VSYNC等。一
2018-02-06 11:34:03
1400
原创 Android性能优化 -- Memory Monitor工具检测内存泄露
这里我们通过一个例子来学习Memory Monitor工具的使用。示例package com.android.test;import android.content.Context;public class UserManger { public static UserManger instance; private Context mContext;
2018-02-02 09:01:24
713
原创 Android 从setContentView谈Activity界面的加载过程
Android窗口 先来了解下Android系统的窗口布局。当我们设置窗口的Theme为可见样式时,Android的窗口如下图: 查看Activity的源码,Activity中有一个私有成员Window(mWindow),而Window是一个抽象类,它提供了绘制窗口的一组通用API(如下第一段代码);PhoneWindow继承自Window,是Window的具体实现类;
2018-01-31 16:05:37
879
原创 Android性能优化 -- Systrace工具
Systrace简介 一般来说,我们的机器以60帧/秒显示时,用户会感觉机器很流畅,如果显示时出现丢帧的情况,需要知道当前整个系统所处的状态,这个时候Systrace便是最佳的工具选择。 Systrace是Android4.1中新增的性能数据采样和分析工具。它可帮助开发者收集Android关键子系统(如Surfaceflinger、WindowManagerService等fr
2018-01-30 10:43:18
16722
原创 Android性能优化 -- TraceView工具
TraceView是什么 TraceView是Android SDK中内置的一个数据采集和分析工具,它可以加载trace文件,用图形的形式展示代码的执行时间、次数及调用栈,找出最需要优化的点。 trace文件是log信息文件的一种,可以通过代码,Android Studio,或者DDMS生成。 TraceView从代码层面分析性能问题,针对每个方法来分析,比如当我们发
2018-01-26 13:31:39
602
转载 Android性能优化 -- 内存管理机制
1、初识内存优化在Android的性能优化的各个部分里,内存的问题绝对是最令人头疼的一部分,虽然Android有垃圾自动回收机制不需要手动干预,但也正因为此,出现内存问题,如内存泄漏和内存溢出等,如果对内存管理机制不熟悉,会更加难以排查问题。因为内存方面的知识较多且不易理解,内存优化部分就分两篇文章进行,本文主要是关于Java、Android的内存分配、回收、GC等理论知识。2、内存分
2018-01-24 09:27:28
611
原创 Android应用管理四 -- APK包的安装、卸载和优化(PackageManagerService)
http://www.oneplusbbs.com/thread-759852-1-1.htmlhttp://blog.youkuaiyun.com/kc58236582/article/details/53393570什么是ODEX?Android应用程序中有一个叫做classes.dex的文件,这是Java源码经过ADT的编译后会转换出来的。它是Android系统中可以在Dalvik虚拟机上直接运行的文件
2018-01-23 17:52:03
1752
转载 Android7.0 Doze模式
在Android M中,Google就引入了Doze模式。它定义了一种全新的、低能耗的状态。在该状态,后台只有部分任务被允许运行,其它任务都被强制停止。这里我们就来分析一下Android 7.0中Doze模式相关的流程。基本原理基本原理 Doze模式可以简单概括为: 若判断用户在连续的一段时间内没有使用手机,就延缓终端中APP后台的CPU和网络活动,以达到减少电量消耗的
2018-01-18 17:23:09
6451
1
转载 Android事件分发机制
UI界面组成/** * Abstract base class for a top-level window look and behavior policy. An * instance of this class should be used as the top-level view added to the * window manager. It provides sta
2018-01-15 18:15:28
485
转载 Java虚拟机内存管理(二)--垃圾收集器及内存分配策略
概述 Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由JIT编译器进行一些优化,但在本章基于概念模型的讨论中,大体上可以认为是编译期可知的),因此这几个区域的内存分配和回收都具备确定性,在这几个区
2018-01-11 14:51:59
425
原创 HashMap的理解
HashMap为什么是线程不安全的? 一直以来只是知道HashMap是线程不安全的,但是到底HashMap为什么线程不安全,多线程并发的时候在什么情况下可能出现问题? HashMap底层是一个Entry数组,当发生hash冲突的时候,HashMap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。 java
2018-01-10 17:30:08
413
转载 避免后台进程被杀死的几种方法
Android的几种进程前台进程 即与用户正在交互的Activity或者Activity用到的Service等,如果系统内存不足时前台进程是最后被杀死的。可见进程 可以是处于暂停状态(onPause)的Activity或者绑定在其上的Service,即被用户可见,但由于失去了焦点而不能与用户交互。服务进程 其中运行着使用startService方法启动的S
2018-01-09 10:54:03
15664
转载 Android多线程--Android中常见的四种线程池
前言 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用,减少创建和销毁线程的性能开销。其次,能控制线程池中的并发数,否则会因为大量的线程争夺CPU资源造成阻塞。最后,线程池能够对线程进行管理,比如使用ScheduledThreadPool来设置延迟N秒后执行任务,并且每隔M秒循环执行一次。 下面通过介绍线程池中的真正实现者--ThreadPoolExecutor来引
2018-01-09 10:50:34
520
转载 实现线程同步的几种方式
为什么要使用同步 Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程调用,从而保证了该变量的唯一性和准确性。 Java提供了一种内置的锁机制来支持原子性。每个Java对象都可以用作一个实现同步的锁,称为内置锁。线程进入同步代码块之前自动获取到锁,
2018-01-09 10:41:08
6349
原创 Android广播管理一--Broadcast机制介绍
在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制;这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用。 在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间
2018-01-09 10:25:50
1192
原创 Android广播管理二--广播注册(registerReceiver)流程分析
前面分析了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制。因此,使用这种消息驱动模型的第一步便是订阅消息;而对Android应用程序来说,订阅消息其实就是注册广播接收器。 接下来,我们继续分析Android应用程序是如何注册广播接收器的,以及把广播接收器注册到哪里去的。 在Android的广播机制中,ActivityManagerServi
2018-01-09 10:17:07
6015
原创 Android广播管理三--广播发送(sendBroadcast)流程分析
应用进程处理广播scheduleRegisterReceiver处理非串行化动态广播BroadcastQueue.performReceiveLocked() 上面讲到调用deliverToRegisteredReceiverLocked方法时,会调用performReceiveLocked方法,我们再看一下该方法 void performReceiveLocked
2018-01-08 17:27:43
10433
2
原创 Android组件管理--应用程序启动流程
Activity的启动流程相对复杂一些,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等。前言我们先看一下源码中对Activity的描述,如下:An activity is a single, focused thing that the user can do. Almost all activ
2018-01-02 16:12:37
1499
转载 Android多线程--IntentService的使用及原理
IntentService概述 这里我们看下HandlerThread在IntentService中的应用,建议先看下上一篇关于HandlerThread的介绍(点击打开链接),有助于理解IntentService。先来看下IntentService的特点: (1)、它本质是一种特殊的Service,继承自Service并且本身就是一个抽象类; (2)、它可以用于在后
2017-12-08 09:59:33
373
转载 Android多线程--HandlerThread的使用以及原理
如果已经理解了Android的消息机制(Handler、Looper、Message、MessageQueue),再来看HandlerThread就很容易了,参考如下:http://blog.youkuaiyun.com/kitty_landon/article/details/53410183源码解析 最直观的方法就是分析源码,先把源码贴出来。/** * Handy cl
2017-12-07 10:08:12
379
转载 Android内存优化--OOM
Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心。 Android内存管理机制 Android系统的Dalvik虚拟机扮演了常规的内存垃圾自动回收的角色,Android系统没有为内存提供交换区,它使用paging与memory-mapping(mmapped)的机制来管理内存,简要概述一些Android系统中重要的内存管理基
2017-12-06 17:48:12
632
转载 Java虚拟机内存管理(一)--Java内存区域与内存溢出异常
概述 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不在需要为没哟个new操作去写配对的delete/free代码(C/C++语音这样操作),不容易出现内存泄露和内存溢出问题,由虚拟机管理内存,这一切看起来都很美好。 不过,也正是因为Java程序员把内存控制的权利交给了Java虚拟机,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将
2017-11-30 19:50:31
411
转载 连接Java和C/C++层的关键--Android的JNI
JNI的作用 JNI是Java Native Interface(Java本地接口)的缩写。是从Java继承而来的,在Android中JNI的作用大大增强了。Android作为一种嵌入式操作系统,有大量和驱动、硬件相关的功能必须在native层实现,另外一些注重性能、功耗的功能使用C/C++来实现也优于Java来实现。因此,在Android开发中,无论是应用开发,还是系统开发都离不开JN
2017-11-23 14:37:13
867
原创 android平台的几个编译命令----make,mmm,mm,mma
在android源码根目录下,执行以下三步即可编译android:1. . build/envsetup.sh #这个脚本用来设置android的编译环境;2. lunch #选择编译目标 3. make #编译android整个系统android平台提供了几个命令用于编译,分别为:1. make: 不带任何参数则是编译整个系统,编译时间比较长,初次编译使用此命令
2017-11-09 10:35:03
10038
1
转载 Ubuntu中vi命令的编辑模式下方向键和退格键不能正常使用
在Ubuntu中,进入vi命令的编辑模式,发现按方向键不能移动光标,而是会输出ABCD,以及退格键也不能正常删除字符。这是由于Ubuntu预装的是vim-tiny,而我们需要使用vim-full,解决方法很简单,只需要以下两步: 步骤一,输入下述命令以卸载vim-tiny:sudo apt-get remove vim-common 步骤二,输入下述命令以安装vim-
2017-07-03 10:02:41
759
原创 Android面试常见问题及解答
性能优化性能优化包含了性能设计和性能优化两个阶段.通过充分利用底层实现机制,诸如:局部算法、代码写法、编程语言技巧、界面Layout优化、控件的选择、编译器选项等,围绕性能关键流程去优化代码细节。内存泄露主要原因:内存泄露:程序中存在对无用对象的引用,导致GC无法回收。内存超限:保存了多个耗用内存过大的对象(如Bitmap)。常见导致内存泄露的问题:注册没取消造成内存泄
2017-05-10 10:15:38
1047
原创 Android性能优化 -- 自启动管理
自启动管理简介Android手机上安装的很多应用都会自启动,占用资源越来越多,造成系统卡顿等现象。良好的自启动管理方案管理后台自启动和开机自启动,这样就可以节约内存、优化系统流畅性等。自启动管理流程分析自启动管理的实现贯穿了应用APK(AutoRun.apk)以及framework的ActivityManagerService等。实现流程比较复杂,下面分阶段地介绍整个流程。
2017-04-11 15:56:39
10639
原创 Android HAL层简要分析
新的HAL框架Hal Stub框架分析Hal Stub的框架比较简单,主要记住三个结构体、两个常量、一个函数,简称321架构,定义在:/hardware/libhardware/include/hardware/hardware.h;/hardware/libhardware/hardware.c。三个结构体struct hw_module_t;
2017-04-07 17:09:09
909
原创 Linux C常见函数
1、snprintf()intsnprintf(char *str, size_t size, const char *format, ...)所需头文件:#include功能:将可变个参数(...)按照format格式化成字符串,然后将其复制到str中。(1) 如果格式化后的字符串长度 ,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');(2)
2017-04-07 14:55:11
451
转载 #ifndef/#define/#endif使用详解
想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?其实“被重复引用”是指一个头文件在同一个cpp文件中被inclu
2017-04-06 17:30:03
512
原创 Android N 进程间通信--Binder
Android的Build系统是基于GNU Make和shell构建的一套编译环境。Android是一个庞大的系统,它包含了太多的模块,各种模块的类型也有十多种。因此,为了管理整套源码的编译,Android专门开发了自己的Build系统。这套系统定义了大量的变量和函数,无论编写一个产品配置文件还是一个模块的Android.mk文件,都不用直接和GNU Make打交道,只需要理解Android提供的
2017-04-06 15:59:20
695
原创 功耗优化--对齐唤醒
概况Android手机上安装的很多应用都会频繁唤醒手机(唤醒系统、唤醒屏幕),造成手机耗电等现象。良好的对齐唤醒管理方案,就是对后台应用待机时不频繁唤醒,智能节省电量。实现原理:APK作为该功能的入口,勾选应用后,将勾选的应用写入黑名单,并通知framework黑名单内容变化;framework接收到通知后,自动获取黑名单中的应用,保存到列表中;在framework调用接口中检测应用是
2017-03-29 21:15:33
7097
原创 Android7.1 亮度自动调节
1、代码主要涉及到frameworks/base/services/core/java/com/android/server/display 目录下的AutomaticBrightnessController.java。2、AutomaticBrightnessController.java中的一些变量mScreenAutoBrightness:屏幕亮度级别是由自动亮度算法决定的,实际的亮
2017-03-28 15:01:51
12640
2
Power-Saving Optimizations
2015-09-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人