Android APP启动优化
启动状态应用有三种启动状态,每种状态都会影响应用向用户显示所需的时间;冷启动、温启动和热启动。在冷启动中,应用从头开始启动。在另外两种状态中,系统需要将后台的应用带入前台。建议始终在假定冷启动的基础上进行优化。这样做也可以提升温启动和热启动的性能。 冷启动 冷启动是指应用从头开始启动;系统进程在冷启动后才创建应用进程。发生冷启动的情况包括自设备启动后或系统终止应用后首次启动。 热启动 在热启动中,系统的所有工作就是将Activity带到前台。只有应用的所有Activity仍驻留在内存中,应用就不必重复执行对象初始化、布局加载和绘制。 温启动 温启动包含了在冷启动期间发生的部分操作;同时,它的开销要比热启动高。有潜在状态可视为温启动。例如: 用户在退出应用后又重新启动应用。进程可能未被销毁,继续运行,但应用需要执行onCreate()从头开始创建Activity。 系统将应用从内存释放,然后用户又重新启动它。进程和Activity需要重新启动,但传递到onCreate()的已保存的实例state bundle对于完成此任务有一定助益。 冷启动耗时统计在性能测试中...
深入理解并发编程和归纳总结
AQS什么是AQSAbstractQueueSynchronizer(抽象队列同步器) 是用来构建锁和其他同步组件的基础架构,比如ReentrantLock、ReetrantReadWriteLock和CountDownLatch就是基于AQS实现的。它使用一个int成员变量state标识同步状态,通过内置的FIFO(队列)来完成获取资源线程的排队工作。它是CLH队列锁的一种变体实现。它可以实现两种同步方式:独占式、共享式。AQS的主要使用方式是继承,子类通过继承AQS并实现它的抽象方式来管理同步状态,同步器的设计基于模板方法模式,所以如果要实现我们自己的同步工具类就需要其中几个可重写的方法,如tryAcquire、tryRelease、tryReleaseShared等等。这样设计的目的是同步组件(比如锁)是面向使用者的,它定义了使用者和同步组件交互的接口(比如可以允许两个线程并访问),隐藏了实现细节;同步器面向的是锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作。这样就很好地隔离了使用者和实现者锁需关注的领域。在内部,AQS维护一个共享...
JVM内存管理深度剖析
JVM与操作系统的关系 以HelloWord.java程序为例,简单介绍一下java程序的执行过程 HelloWord.java通过javac编译成字节码文件HelloWorld.class 通过类加载器ClassLoader将字节码文件加载到运行时数据区(这个会在后面介绍) 通过执行引擎执行并与操作系统交互 关于Java SE体系结构 JVM只是一个翻译工具 JRE提供了基础类库 JDK提供了工具 JVM运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 程序计数器 虚拟机栈 本地方法栈 Java堆 方法区(运行时常量池) 线程私有的:虚拟机栈、本地方法栈、程序计数器 线程共享的:堆、方法区 程序计数器和栈 程序计数器是JVM内存区域中 唯一不会OOM的内存区 局部变量表只能存储8大数据类型( byte[1]、short[2]、int[4]、long[8]、float[4]、double[8]、char[2]、boolean[1])+引用 一个线程有多个方法 一个方法一个栈帧 操作数栈:存放方法...
删除有序链表中重复的元素
前言 今天,小编来分享一道热门的面试算法题——删除有序链表中重复的元素。 问题描述给出一个升序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。 例如: 给出的链表为1 -> 2 -> 3 ->3 -> 4 -> 4 -> 5,返回1-> 2 -> 5. 示例示例1输入:{1,2,3} 返回值:{1} 示例2输入:{} 返回值:{} 思路 给链表加上表头,因为可能会出现第一个节点就需要删除 遍历链表,每次比较相邻两个节点,如果遇到了两个相邻节点相同,则新开内循环将这一段所有的相同都遍历过去。 在第2步中这一连串相同的节点前的节点直接连上后续第一个不相同值的节点。 返回时去掉添加的表头。 注意: 这道题删除的是所有重复的元素,也就是说凡是有重复出现的任何数就全部删除,并不是删除至只留下一个。 外层循环的条件cur.next != null && cur.next.next != null 内层循环的条件cur.next != null && cur.next.val == t...
AsyncTask的使用介绍
前言 今天,小编介绍一下Android中的老朋友——AsyncTask,很久没有见过它了,但是在前段时间小编在查资料的时候又见到了AsyncTask。小编现在就来简单介绍一下它的功能与使用。 在Android中,谈到异步消息处理我们首先想到的就是Handler,的确!Handler宛如Android的心脏一般不停地处理消息,支持着Android的运转。 但是,为了更加方便我们在子线程中对UI进行操作,Android还提供了另外一些好用的工具,比如AsyncTask。 AsyncTask简介借助AsyncTask,即使你对异步消息处理机制完全不了解,也可以十分简单地从子线程切换到主线程。当然,AsyncTask背后的实现原理也是基于异步消息处理机制Handler的,只是Android帮我们做了很好的封装。 由于AsyncTask是一个抽象类,所以如果我们想使用它,就必须创建一个子类去继承它。在继承时我们可以为AsyncTask类指定3个泛型参数: Params:在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。 Progress:在后台任务执行时,如果需要在界面...
后台默默的劳动者,Service
引言 前段时间,小编在修改bug的时候和Service打了不少交道。突然发现,已经很久没碰过Service了,有些东西记忆模糊,那么今天做一个Service总结,方便日后查看。 Service是什么?Service是Android中实现程序后台运行的解决方案,它非常适合执行哪些不需要和用户交互而且要求长期运行的任务。Service的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,Service仍然能够保持正常运行。 不过需要注意的是,Service并不是运行在一个独立的进程中,而是依赖于创建Service时所在的应用程序的进程。当某个应用程序进程被杀时,所有依赖于该进程的Service也会停止运行。 另外,也不要被Service的后台概念所迷惑,实际上Service并不会自动打开线程,所有的代码都是默认运行在主线程中。也就是说,我们需要在Service的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞的情况。 Service的基本用法定义一个Service MyService:我们将类的名字定义为MyService Ex...
Android性能优化:APK瘦身
前言 随着业务迭代,APK体积逐渐变大。项目中积累的无用资源,未压缩的图片资源等,都为apk带来了不必要的体积增加,而APK的大小会影响应用加载速度、使用的内存量以及消耗的电量。 了解APK结构在讨论如何缩减应用的大小之前,有必要了解下应用APK的结构。APK文件由一个Zip压缩文件组成,其中包含构成应用的所有文件,这些文件包括Java类文件、资源文件和包含已编译资源的文件。 APK包含以下目录: META-INF/:包含CERT.SF和CERT.RSA签名文件,以及MANIFEST.MF清单文件。 assets/:包含应用的资源;应用可以使用AssetManager对象检索这些资源。 res/:包含未编译到resources.arsc中的资源(图片、音视频等)。 lib/:包含特定于处理器软件层的已编译代码。此目录包含每种平台类型的子目录,如armeabi、armeabi-v7a、arm64-v8a、x86、x86_64和mips。 APK还包含以下文件。在这些文件中,只有AndroidMainfest.xml是必须的。 resources.arsc:包含已编译...
Android运行时权限
引言我们在应用开发中如果需要联网就需要在AndroidManifest.xml文件中添加网络访问权限。在我们新安装应用时,往往会弹出提示框问我们是否允许系统获取定位、读取联系人、读取短信等权限。那这些权限有什么用?区别是什么?为什么会有运行时权限这一说法……下面让小编来一一梳理并解答。 运行时权限 Android的权限机制并不是什么新鲜事物,从系统的第一个版本开始就已经存在了。但其实之前Android的权限机制在保护安全和隐私等方面起到的作用十分有限,尤其是一些大家离不开的常用软件,非常容易“店大欺客”。为此,Android开发团队在Android6.0系统中引入了运行时权限这个功能,从而更好地保护了用户的安全和隐私。 Android权限机制详解如下,监听开机广播需要开启广播接收的权限: 因为监听开机广播涉及了用户设备的安全,因此必须在AndroidManifest.xml文件中加入权限声明,否则我们的程序就会崩溃。 那么问题来了,加入了这句权限声明后,对于用户来说到底有什么影响呢?为什么这样就可以保护设备的安全了呢? 其实用户主要在两方面得到保护。一方面,如果用户在低于A...
模板
关于Hexo搭建遇到的小问题
OOM与内存优化
内存管理基础App内存组成以及限制Android 给每个 App 分配一个 VM ,让App运行在 dalvik 上,这样即使 App 崩溃也不会影响到系统。系统给 VM 分配了一定的内存大小, App 可以申请使用的内存大小不能超过此硬性逻辑限制,就算物理内存富余,如果应用超出 VM 最大内存,就会出现内存溢出 crash。 由程序控制操作的内存空间在 heap 上,分 java heapsize 和 native heapsize Java申请的内存在 vm heap 上,所以如果 java 申请的内存大小超过 VM 的逻辑内存限制,就会出现内存溢出的异常 native层内存申请不受其限制, native 层受 native process 对内存大小的限制 如何查看Android设备对App的内存限制 主要查看系统配置文件 build.prop ,我们可以通过 adb shell 在 命令行窗口查看 adb shell cat /system/build.prop 通过代码获取 ActivityManager activityManager = (Activi...








