安卓功耗优化

优化电池续航时间  |  Android 开发者  |  Android Developers

一、原理

PowerManager 用来控制设备的电源状态. 而 PowerManager.WakeLock 也称作唤醒锁, 是一种保持 CPU 运转防止设备休眠的方式.

  • WakeLock是什么

    WakeLock是Android框架层提供的一套机制,应用使用该机制可以达到控制Android设备状态的目的。这里的设备状态主要指屏幕的打开关闭,cpu的保持运行。简单的理解WakeLock是让系统保持”清醒”的一种手段.

  • WakeLock作用

    当手机灭屏状态下保持一段时间后,系统会进入休眠,一些后台运行的任务就可能得不到正常执行,比如网络下载中断,后台播放音乐暂停等。WakeLock正是为了解决这类问题,应用只要申请了WakeLock,那么在释放WakeLock之前,系统不会进入休眠,即使在灭屏的状态下,应用要执行的任务依旧不会被系统打断。

  • WakeLock有那些分类

    WakeLock是PowerManager的内部类,其代码路径位于:

    frameworks/base/core/java/android/os/PowerManager.java
  • WakeLock 分类如下:

    • PARTIAL_WAKE_LOCK: 灭屏,关闭键盘背光的情况下,CPU依然保持运行。
    • PROXIMITY_SCREEN_OFF_WAKE_LOCK: 基于距离感应器熄灭屏幕。最典型的运用场景是我们贴近耳朵打电话时,屏幕会自动熄灭。
    • SCREEN_DIM_WAKE_LOCK/SCREEN_BRIGHT_WAKE_LOCK/FULL_WAKE_LOCK:这三种WakeLock都已经过时了,它们的目的是为了保持屏幕长亮,Android官方建议用getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);方式替换。因为比起申请WakeLock,这种方式更简单,还不需要特别申请android.permission.WAKE_LOCK权限。
    • DOZE_WAKE_LOCK/DRAW_WAKE_LOCK: 隐藏的分类,系统级别才会用到。

如果是PARTIAL_WAKE_LOCK, 无论屏幕的状态甚至是用户按了电源钮, CPU 都会继续工作. 如果是其它的唤醒锁, 设备会在用户按下电源钮后停止工作进入休眠状态.

  • WakeLock的flag如下:
    • ACQUIRE_CAUSES_WAKEUP: 点亮屏幕,比如应用接收到通知后,屏幕亮起。
    • ON_AFTER_RELEASE: 释放WakeLock后,屏幕不马上熄灭。
    • UNIMPORTANT_FOR_LOGGING: 隐藏的flag,系统级别才会用到。
阅读更多

Android面试题 - LruCache

一、原理

LruCache 其实挺简单的,本质是对LinkHashMap的封装,然后通过设置maxSize来控制LinkHashMap的容量。

二、注意点

2.1 LruCache 是线程安全的

它的所有属性都是私有属性

image-20200907092730822

对私有属性的settergetter操作都是加了锁处理

image-20200907092920801
阅读更多

Android面试题 - AsyncTask

一、原理

AsyncTask 本质上是对handler和线程池对封装,在线程池中执行耗时任务,当任务完成或任务更新时,向主线程的Handler发送消息,在Handler中执行finish()onProgressUpdate()等方法。

阅读更多

沙箱机制下的应用间数据共享

通过android的沙箱机制,可以在不同的应用间共享代码、数据、或资源文件。
阅读本文前需要了解android的沙箱机制

一、代码共享


Context packageContext = createPackageContext("com.example.signatureapp", Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);

Context.CONTEXT_INCLUDE_CODE:

把参数包名对应的应用中的代码包含到Context中,这样当前应用才能访问context应用中的类,如果context对应的应用不能安全的加载到当前应用中,会报出SecurityException,如果想要加载另一个应用,访问它的数据,则这个标记必须设置

CONTEXT_IGNORE_SECURITY:忽略加载context对应的应用这个过程中的安全限制,总是允许加载,和CONTEXT_INCLUDE_CODE配合使用,代表不管是否安全,都要加载,一般使用要小心。

阅读更多

android 沙盒模型

一、Android延用的linux权限模型

1.1 android沙箱

Android 系统中,应用是在Dalvik 虚拟机实例三运行的,而每一个虚拟机都是一个独立都进程,而在linux中,每一个进程都是相互隔离的,Android 这种基于 Linux 的进程 “沙箱” 机制,是整个安全设计的基础之一。

因为Android是继承于linux,因此继承了linux用户管理的特点,并根据移动端的特点进行了优化。

Android 沙箱的核心机制基于以下几个概念:

1、标准的 Linux 进程隔离;

2、大多数进程拥有唯一的用户 ID(UID);

3、以及严格限制文件系统权限。

阅读更多