精华内容
下载资源
问答
  • Android功耗

    2017-01-11 23:02:44
    这个栏目里要讲的Android功耗是在项目开发的时候,碰到的功耗问题,主要是底层出发来排除Android功耗问题。Android功耗问题在项目开发过程中是最容易发生扯皮的时候,而很不幸,一有功耗问题大家都爱把问题往驱动...

            这个栏目里要讲的Android功耗是在项目开发的时候,碰到的功耗问题,主要是底层出发来排除Android功耗问题。Android功耗问题在项目开发过程中是最容易发生扯皮的时候,而很不幸,一有功耗问题大家都爱把问题往驱动开发这边丢。

            没办法,唯一解决这种问题的办法就是,自己都去学学,把问题整明白。碰到问题是自己的问题就解决了,不是自己的你得给人家讲清楚理由,给出不能解决的理由。

    这个栏目会有装载的文章,也会有自己碰到的解决的。如有疑问或想讨论的技术问题,可以在我微博上给我发私信,微博地址在博客左边栏目中。



    展开全文
  • Android功耗分析

    2019-09-04 14:25:39
    Android功耗分析(1)功耗分析方法和优化 Andorid功耗分析(2)高通平台功耗优化基础 Android功耗分析(3)高通功耗问题分析 Android功耗分析(4)MTK平台待机功耗分析流程 Android功耗分析(5)功耗调试方法 ...
    展开全文
  • android 功耗测试详解

    2017-08-23 15:40:54
    android 功耗测试详解
  • Android 功耗优化

    2019-11-07 19:45:03
    功耗优化- ...android 功耗优化- https://blog.csdn.net/zhangbijun1230/article/category/7618452 MTK 驱动- https://blog.csdn.net/zhangbijun1230/article/cat...

    功耗优化- https://blog.csdn.net/zhangbijun1230/article/category/7541658
    android 功耗优化- https://blog.csdn.net/zhangbijun1230/article/category/7618452
    MTK 驱动- https://blog.csdn.net/zhangbijun1230/article/category/7494418
    高通驱动- https://blog.csdn.net/zhangbijun1230/article/category/7494419
    手机modem开发- https://blog.csdn.net/zhangbijun1230/article/category/6500603

      Android App耗电发热分析,adb shell dumpsys batterystats ;
      这个命令可以打印出于电池消耗相关的信息,可以通过,adb shell dympsys batterystats > D:/batterystats.txt ;

    Android功耗评测系列之——软件评测方案原理- https://www.cnblogs.com/Yanss/p/10146839.html
    processAppUsage()方法中,一个应用的总功耗在这里体现出来了:
    cpu;Wakelock(保持唤醒锁); 数据天线(2G/3G/4G);WIFI;蓝牙;传感器;相机;闪光灯;

      量测电流波形需要采样精度高,而且能保存整个电流变化为文件形式的专业工具。
    PowerMonitor- https://www.msoon.com/LabEquipment/PowerMonitor/

    Android功耗值测量- https://www.jianshu.com/p/bf4cf01c4450
     设备制造商必须提供组件功耗配置文件/frameworks/base/core/res/res/xml/power_profile.xml
     要测定电源配置文件的值,请使用测量设备使用功耗的硬件,并执行所需信息的各种操作。测量这些操作期间的所用功耗并计算值(根据需要从其他基线所用功耗中获得差异)。
     对于运行Android 7.0的设备,系统会收集低能耗(LE)扫描和蓝牙网络流量(如RFCOMM和L2CAP)的数据,并将这些活动与启动应用程序相关联。

    android 功耗 android 功耗分析方法和优化- https://blog.csdn.net/zhangbijun1230/article/details/80164118
    - 高通平台
    一般情况下的底电流参考数据上限是:
    512M RAM < 1.5mA; 1G RAM < 2mA; 2G RAM < 2.6mA

      通过top命令,可以查询到cpu占用较高的应用。如果一个应用一直在占用cpu,而此时并没有打开该应用,那么该应用很可能会导致待机异常。adb shell 

    CPU/GPU的动态调频调压可以优化手机的功耗表现。该影响是整体性的,系统性的。
    CPU降频主要通过两种方式实现,都可以达到降频的目标:
      1、设置CPU工作在powersave模式。设置该模式后,CPU将一直工作在最低频率(300000hz)。此时手机最省电,但是有可能会出现手机运行变卡顿。
      2、限制CPU最高频率,以限制CPU的运行频率上限。在超级省电模式下,CPU工作的宗旨是:CPU工作频率低+运行不卡,两项都要保障。

      在android系统的耗电量排行里,cpu的耗电占 了比较大的一部分比例,也就是说,cpu的使用率和使用频率将直接或间接的影响电量的分配和使用,但很遗憾,android-sdk中没有为 android的开发者提供类似cpu管理的功能,但是当下很多省电类应用或专业的cpu管理软件都提供了cpu的降频甚至是超频的功能。
      CPU进入WFI后,整个系统就依靠一颗SCP:SPM来控制睡眠/唤醒的流程,它会去关注各个子系统的状态,SPM =System Power Manager。

      Android的定时任务有两种实现方式,Timer类和Alarm机制。Timer有一个明显的短板,不适合长期后台运行的定时任务。为了能让电池更加耐用,每种手机都会有自己的休眠策略,Android手机就会在长时间不操作的情况下自动让CPU进入到睡眠状态,这就有可能导致Timer中的定时任务无法正常运行。而Alarm机制则不存在这种情况,它具有唤醒CPU的功能,即可以保证每次需要执行定时任务的时候CPU能正常工作。重点来了:从Android 4.4之后,Alarm任务的触发时间将会变得不准确,有可能会延迟一段时间后任务才能得到执行。这不是bug,而是系统在耗电性方面进行的优化。系统会自动检测目前有多少Alarm任务存在,然后将触发时间将近的几个任务放在一起执行,这就可以大幅度的减少CPU被唤醒的次数,从而有效延长电池的使用时间。
       除了常规的异步网络、多线程技术、本地缓存等等之外,Android省电开发还有一个重要的方面是:wifi比蜂窝数据,包括2G(GPRS)、3G更省电:a)尽量在Wi-Fi下传输数据,当然这是废话,不过可以考虑在有Wi-Fi的时候做预加载,比如应用中心的zip包、手Q web类应用的离线资源等;b)非Wi-Fi下,尽量减少网络访问,每一次后台交互都要考虑是否必须。虽然WiFi接入方式已经占到移动互联网用户的50%,但是是有些手机设置为待机关闭WiFi连接,即便有Wi-Fi信号也只能切换到蜂窝数据;

      在Dalvik中,应用每次运行,字节码都需要通过即时编译器转换为机器码,这回拖慢应用的运行效率,而在ART环境中,应用在第一次安装时,字节码就会预先编译成机器码,使其成为了真正的本地应用。这个过程叫做预编译。这样的话,应用的启动和执行都会变得更加快速。但是ART的缺点是预编译完的机器人占用了更大的存储空间,应用的安装需要更长的时间。但是牺牲空间时间换取省电速度,在Android应用中还是可以接受的,毕竟性能的提升,运行速度的变快,体验更流畅,电池续航更久显得更重要。
      经测试,谷歌最新的Android L系统与上一版本相比续航能力可以提升36%。

     Project Volta省电模式、BatterySaver省电模式;
     Android 5.0的省电模式是通过JobSchedulerAPI以及自动调节屏幕亮度、刷新率来达到省电的效果,而且还使用了Project Volta量化每个应用的耗电量,在手机快没电的情况下主动降低CPU的主频或者关闭通讯模块,以获得更长的待机时间。还配备了一个Battery Bistorian电池历史记录功能,可让详细显示设备的耗电情况。

    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,TAG);
    wl.acquire();//为了保证任务不被系统休眠打断,申请WakeLock
    // 开始我们的任务
    wl.release();//任务结束后释放,如果不写该句。则可以用wl.acquire(timeout)的方式把释放的工作交给系统。

    Android battery historian功耗分析- https://github.com/google/battery-historian
    google已经做了工具用于可视化的显示这个报告:battery-historian
    Android battery historian功耗分析之环境搭建- https://www.jianshu.com/p/5abd53abcc1e

    如何确定阻止进入suspend的原因;系统没有进入suspend,主要的原因是因为系统有锁导致.
    锁一般分为:APP透过PowerManager拿锁,以及kernel wakelock.

     Android系统为了进行电源管理,设计了PowerManagement框架,其中包含BatteryState服务。BatteryStats 会不断地收集信息,并存储这些信息以便在重新启动后继续使用。该服务不会直接跟踪电池中消耗的电流,而是通过收集计时信息来估算不同组件所消耗的电量。

    BLE是蓝牙4.0标准的一部分,旨在解决传统蓝牙连接慢、能耗大的问题,Google在Android 4.3(API 18)中引入了对BLE的支持。BLE连接使用GAP(Generic Access Profile)协议,通信使用GATT(Generic Attribute Profile)协议。GATT又以ATT为基础,所有的LE服务都以ATT作为应用层协议。
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
        <uses-permission android:name="android.permission.BLUETOOTH" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

        <uses-feature
            android:name="android.hardware.bluetooth_le"
            android:required="false" />
        <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
        <uses-feature android:name="android.hardware.location.network" />

    -- 所有便携式的Android设备都会对设备的功耗提出要求,尽量在最快的运行速度的情况下,降低电池的消耗,降低设备温度。
      根据行业内部默认水准,我列出如下几条功耗要求:(Android智能手表/智能手机,四个方向调节设备功耗)
    1 设备整机(插SIM卡,拔除USB线)待机功耗的最小电流调节之3mA左右
    2 设备连接后台数据的情况下待机每小时平均功耗 < 10mA(严格的说是 7mA)
    3 依据设备电池容量限制设备充电功耗
    4 设备通话10分钟~20分钟后的温度一般限制在45度以下

    -- 手机功耗,总结的两个方向:
      1 硬件方向:逐步拔出外设,比如 TP LCD Camera等基本外设,这种方式简单粗暴,很容易定位功耗消耗源所在,比如我遇到的问题就是TP在待机的时候消耗电池,是某个引脚漏电。
      2 软件方向:
      第一部分:抓取Android电池消耗记录,查看CPU唤醒源。此处要介绍一个工具Battery Historian,这是一款由Google提供的Android系统电量分析工具. 在网页中展示手机的电量消耗过程, 输入电量分析文件, 显示消耗情况. 最后提供一些电量优化的方法,关于此工具的安装方式,网上或者我在另一个博客中有详细说明,需要的话请挪步查看。此处会介绍此工具的使用方式以及功能。
      第二部分:关核降频

    -- Android App功耗浅析- https://blog.csdn.net/happy_develop_/article/details/70154172
    App功耗浅析,主要原因:
    (1)http请求(GZIP压缩)
    (2)json数据解析(json解析效率主要是解析耗时),大量的数据解析
    (3)数据库读写操作
    (4)SD卡读写操作
    (5)程序的执行的timer定时器(例如IM中的心跳包,用系统的Alarm优化)
    (6)网络切换(wifi会比手机的数据移动网络更加省电)

    展开全文
  • android功耗高通平台 分类:功耗1、底电流调试(Rock Bottom Current Optimization)底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data文档...

    android

    功耗

    高通平台

     分类:功耗

    1、底电流调试(Rock Bottom Current Optimization

    底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data文档或者release note。一般情况下的底电流参考数据上限是:

    512M RAM < 1.5mA; 1G RAM < 2mA; 2G RAM < 2.6mA

     1.1校准RF

    保证RFPAAntenna switchTunerAPTGPIO工作在正常状态

     1.2飞行模式

    开启飞行模式、关闭GPS、关闭自动旋转屏幕、关闭自动亮度调节、关闭其他特效效果设置

    开启飞行模式,可以基本避免蓝牙、wifiNFC、网络、FM等的一般影响;

    关闭GPS,可以基本排除开启GPS对底电流的影响;

    关闭自动旋转屏幕,可以基本排除sensor的影响;

    关闭自动亮度调节,可以基本排除距离感应到的影响;

    关闭其他特效效果设置,如指纹识别、黑屏手势、智能体感、手势隔空操作。。。。。。

     1.3使用perf_defconfig

    修改device/qcom//AndroidBoard.mk。如果KERNEL_DEFCONFIG := _defconfig,那么改成KERNEL_DEFCONFIG := -perf_defconfig

    同时,kernel代码改用/kernel/arch/arm/configs/-perf_defconfig

    是平台名称或者项目名称

     

    1.4移除debugging APKs

    /system/app/Logkit.apk

    /system/app/com.qualcomm.qlogcat.apk

    /system/xbin/qlogd

     

    1.5把应用尽量删除

    在设置-->应用,禁用正在运行的应用

     

    1.6去掉CPU占用高的进程

    adb shell

    top

    查看CPU占用,去掉在休眠模式下CPU占用大于0的进程。kill掉该进程,若kill不掉则rm掉相关应用。对于占用CPU高的kwork,需要查找驱动原因。

     

    1.7手动移除所有可以移除的外设

    手机连上安捷伦电源,手机开机,然后让手机进入待机状态。手动移除TPLCM、前camera、后camerasensorSD卡、SIM卡等可以手动移除的外围器件,同时观察并记录底电流变化。

    直接移除WLAN芯片可能会导致开不了机,所以在移除WLAN之前,先对软件做如下处理:

    # mount -o rw,remount -t vfat /dev/block/bootdevice/by-name/modem 

    # cd /firmware/image 

    # rm wcnss.* 

    # reboot 

    或者

    #lsmod

    #rmmod WLAN

    移除其他可以移除的芯片(sensorNFC。。。)

     

    1.8移除驱动模块

    /kernel/arch/arm/configs/-perf_defconfig中把sensorTPLCMcamera等的驱动模块移除;

    或者在对应驱动的Makefile里面,移除驱动代码

    然后编译bootimage,烧入手机观察底电流变化

     

    1.9配置不用的GPIO

    将不用的GPIO置为输入、拉低;配置成SPII2CGPIO,若不用,置为悬空

    boot_images/core/systemdrivers/tlmm/config/platform/TLMMChipset.xml,修改GPIO配置。该处配置GPIO的初始状态,驱动有可能会修改GPIO

    对比项目原理图与平台参考原理图,项目原理图中多出的NC GPIO要处理掉。

     

    1.10检查power相关的NV items

    需要跟CE确认。一般如下:

    1027 = 0

    1895 = 0

    1892 = 0

    1962 = 0

    4679 = 16

    4201 = 0

    3851 = 0

    3852 = 6

    7157 = 1

    69745 rxd_enable = 0

    WCDMA NV:

    NV3581 = 0

    NV3852 = 6

     

    1.11排查GPIOLDO、总线

    对比项目原理图与平台参考原理图,排查硬件不一样的GPIOLDO、总线配置。

    量测各GPIOLDOI2C在休眠时候的电压,需用万用表准确测量。

    休眠时各路I2C GPIO的电压是多少v,用万用表准确测量。

    如果条件允许,测量所有LDO在休眠前和休眠后的准确电压。

    对于LDO,调试方法如下:

    1adb shell关闭LDO

    如关闭L3

    cd /sys/kernel/debug/regulator/8916_l3/

    echo 0 > enable

    2LDO太多设备用到,不适合用adb shell来关。可以这样调试:

    cat /sys/kernel/debug/regulator/8916_l6/consumers 

    shell@msm8916_32:/sys/kernel/debug/regulator/8916_l6 $ cat consumers 

    Device-Supply EN Min_uV Max_uV load_uA 

    0-000c-vio Y 1800000 1800000 0 

    0-0068-vi2c N 1800000 1800000 0 

    5-0038-vcc_i2c Y 1800000 1800000 0 

    1a98000.qcom,mdss_dsi-vddio N 1800000 1800000 100 

    1a98300.qcom,mdss_dsi_pll-vddio N 1800000 1800000 100 

    8916_l6 N 0 0 0 

    这样就可以看到是哪些设备请求了LDO6。然后 找到对应的代码,在休眠时关掉LDO,唤醒时再打开。 

    0-000c: 挂在I2C0上地址为0xc 

    5-0038: 挂在I2C0上地址为0x38 

    查看这两个设备的驱动代码是否有执行regulator_enable

    3)通过寄存器地址关闭LDO

    LDO6的地址是0x14546,则关闭方法是:

    # cd /sys/kernel/debug/spmi/spmi-0 

    # echo 0x14546 > address 

    # echo 1 > count 

    # cat data 可以读寄存器 

    # echo 0x00 > data LDO6

    4)关闭MPP

    在休眠前关闭MPP1MPP2MPP3MPP4 

    PM8916的寄存器地址分别是0xA0460xA1460xA2460xA346 

    在关闭前先cat data以查看原来的值。 

     

    GPIO状态读取的方法如下:

    1GPIO dump

    为了得到休眠时的GPIO状态,增加下面的打印

    rpm_proc/core/power/sleep/src/lpr_definition_uber.c 

    #include "tlmm_hwio.h" 

    void deep_sleep_enter(void) 

    uint64 sleep_duration; 

    ... 

     

    SWEVENT(SLEEP_DEEP_SLEEP_ENTER_COMPLETE, sleep_mode.deep_sleep_mode, sleep_duration); 

    // For test 

    int num; 

    int i=11; 

    volatile uint32 cfg ,inout, val; 

     

    num = 122; //8916 only. Need modify for 8974/8x10/8x26 etc. 

     

    cfg = *(volatile uint32*)HWIO_TLMM_GPIO_CFGn_ADDR(i); //(0x61000000 + i * 0x1000) 

    inout = *(volatile uint32*)HWIO_TLMM_GPIO_IN_OUTn_ADDR(i);//(0x61000004 + i * 0x1000) 

    val = ((cfg << 16)&0xffff0000) | (inout&0xffff); 

    SWEVENT(SLEEP_GPIO_DUMP, i, val); 

    mpm_sw_done(sleep_mode.deep_sleep_mode, sleep_duration); 

    } while(FALSE); 

     

    增加for test下面这一段代码。

    然后再修改

    rpm_proc\core\power\sleep\build\SConscript 

    if 'USES_QDSS_SWE' in env: 

    QDSS_IMG = ['QDSS_EN_IMG'] 

    events = [['SLEEP_DEEP_SLEEP_ENTER=320','deep sleep enter. (sleep mode: %d) (count: %d)'], 

    ['SLEEP_DEEP_SLEEP_EXIT','deep sleep exit (sleep mode: %d)'], 

    ['SLEEP_NO_DEEP_SLEEP','bail early from deep sleep. (sleep mode: %d) (reason: %d)'], 

    ['SLEEP_RPM_HALT_ENTER','rpm halt enter'], 

    ['SLEEP_RPM_HALT_EXIT','rpm halt exit'], 

    ['SLEEP_MPM_INTS','pending mpm interrupts at wakeup: (interrupt_status_1 %d), (interrupt_status_2 %d)'], 

    ['SLEEP_DEEP_SLEEP_ENTER_COMPLETE','deep sleep exit complete (sleep mode: %d)'], 

    ['SLEEP_DEEP_SLEEP_EXIT_COMPLETE','deep sleep exit (sleep mode: %d)'], 

    ['SLEEP_MPM_WAKEUP_TIME','mpm wake up time (wakeup time: 0x%0.8x%0.8x)'], 

    ['SLEEP_GPIO_DUMP','gpio [%d] configuration is %d'],

    ['SLEEP_EVENT_LAST=383','sleep last event placeholder'] 

    增加SLEEP_GPIO_DUMP这一项。 

    编译烧写rpm.mbn

    让机器休眠,进入download,抓dump,然后将如下日志发给平台技术支持分析。 

    CODERAM.bin 

    MSGRAM.bin 

    DATARAM.bin 

    以及新编译出来的RPM_AAAAANAZR.elf。  

    2GPIO寄存器读取

    RPM可能不是很方便,也可以用busybox来读取寄存器,例如读GPIO11: 

    Physical Address for GPIO_CFG11 = 0x100B000 

    root@android:/data/busybox # ./busybox devmem 0x100B000 32 

    ./busybox devmem 0x100B000 32 

    0x00000203 

    GPIO_PULL = "11" PULL_UP 

    FUNC_SEL = "0000" FUNCTION GPIO 

    DRV_STRENGTH = "000" DRV_2_MA 

    GPIO_OE = "1" Output Enable 

     

    1.12 rpm dump

    rpm dump,然后把log提供给平台技术支持。

    方法如下: 

    1ps_hold接地

    在休眠状态下,接ps_hold到地少于200mS,机器会进入紧急下载状态,插入USBQPST会自动得到memory dump,然后上传以下几个文件: 

    CODERAM.bin 

    MSGRAM.bin

    DATARAM.bin 

    以及RPM_AAAAANAZR.elf(必须与机器的编译时间一致匹配的elf) 

    2)改resetdownload key

    发这些命令改resetdownload key: 

    # cd /sys/kernel/debug/spmi/spmi-0 

    # echo 0x844 > address 

    # echo 4 > count 

    # cat data 

    00840 -- -- -- -- 0F 07 04 00 

    # echo 0x00 0x00 0x01 0x00 > data 

    # cat data 

    00840 -- -- -- -- 00 00 01 00 

    # echo 0x00 0x00 0x01 0x80 > data 

    # cat data 

    00840 -- -- -- -- 00 00 01 80 

    然后长按下键,会进入download。之后抓取log方法同上。

    如果进不了download,需要确认: 

    CONFIG_MSM_DLOAD_MODE=y 

    另外也有可能与nv 4399905有关系。

     

    1.13检查rpm_stats

    检查rpm_stats是否进入vdd min或者xo/no shutdown。使用下面的命令检查rpm lower power mode count:

    cat /sys/kernel/debug/rpm_stats

    如果vmincount0,则表明设备从来没有进入vdd minnon-zero则说明设备进入过vdd_min

    RPM Mode: xosd

    count:0

    time in last mode(msec):0

    time since last mode(sec):794

    actual last sleep(msec):0

    RPM Mode:vmin

    count:11

    time in last mode(msec):0

    time since last mode(sec):359

    actual last sleep(msec):110000

     

    1.14使用Trace32

    可以dump出来完整详细的gpio/clk/pmic信息,排除休眠时候的状态异常。

     

     

    2、待机电流优化(Standby Current Optimization

    2.1通过adb log排查

    adb logcat -v time > YearMounthDayHourMinute_logcat.txt   //main log

    adb logcat -v time -b events > YearMounthDayHourMinute_logcat_event.txt   //event log

    adb logcat -v time -b radio > YearMounthDayHourMinute_logcat_radio.txt    //radio log

    adb shell dmesg > YearMounthDayHourMinute_dmesg.txt                 //kernel log

    可以采用功耗问题时间追踪表来精确追踪功耗异常。

    可以使用如下命令来打开指定文件的kernel log(以qpnp-adc-tm.cqpnp-adc-common.c为例):

    adb shell mount -t debugfs none /sys/kernel/debug

    adb shell "echo 8 > /proc/sys/kernel/printk" 

    adb shell "echo 'file qpnp-adc-tm.c +p' > /sys/kernel/debug/dynamic_debug/control"

    adb shell "echo 'file qpnp-adc-common.c +p' > /sys/kernel/debug/dynamic_debug/control"

    adb shell "echo 8 > /proc/sys/kernel/printk"

     

    为指定的函数开启log,以qpnpint_handle_irq为例:

    adb shell "echo 'func qpnpint_handle_irq +p' > /sys/kernel/debug/dynamic_debug/control" 

     

    *#logkit#*调出logkit apk,可以保存logcatdmesgcrashQXDMGPU log等日志信息到手机里面。

     

    2.2 top

    通过top命令,可以查询到cpu占用较高的应用。如果一个应用一直在占用cpu,而此时并没有打开该应用,那么该应用很可能会导致待机异常。

    adb shell

    top

    “该场景下CPU使用率”是User+System+IOW+IRQ

    “模块相关的CPU占用率”是模块相关进程占用CPU使用率的总和

     

    2.3正在运行

    设置-->应用-->正在运行,可以看到正在运行的应用或者服务。禁止掉应用或者服务,观察待机电流变化。

     

    2.4 wakeup debug mask

    调试wakeup问题,可以使能debug功能,然后抓取logLog中会增加一些debug信息。

    mount -t debugfs none /sys/kernel/debug  

    echo 1 > /sys/kernel/debug/clk/debug_suspend  

    echo 1 > /sys/module/msm_show_resume_irq/parameters/debug_mask  

    echo 4 > /sys/module/wakelock/parameters/debug_mask  

    echo 1 > /sys/module/lpm_levels/parameters/debug_mask  

    echo 0x16 > /sys/module/smd/parameters/debug_mask  

     

    2.5 wakelock  

    1wakeup_sources  

    kernel wakelockuserspace wakelock都有可能阻止系统睡眠。所有的wakeup_sources均保存在sys节点/sys/kernel/debug/wakeup_sources里面。 

    该文件包含了如下信息:

    1the total amount of time a wakeup source has prevented suspend  

    2the amount of time a wakelock has been active since the last activation etc. The unit of time is milliseconds. 

     

    2active_since

    active_since值可以用来确认wakelock是否正在阻止休眠。如果该值不是零,那么这个wakelock正在工作并且阻止休眠。

     

    3、获取wakeup_sources的命令

    adb root 67754400

    adb remount

    adb shell 

    cat /sys/kernel/debug/wakeup_sources > /data/wakeup_sources.txt

    adb pull /data/wakeup_sources.txt

    获得wakeup_sources.txt以后,通过Excel打开,active_since不为0的项为wakeup source。以表2为例,msm_dwc3对应的active-since481756>0,这意味着msm_dwc3驱动在阻止系统睡眠,下一步需要检查msm_dwc3驱动代码及相关log

     

    表格 2 Wakeup source opened in Excel

     

    4power:wakeup_source_activate and power:wakeup_source_deactivate events

    当一个wakeup sourceacquire或者release时候,power:wakeup_source_activatepower:wakeup_source_deactivate event将随即被写到trace buffer里面,这样可以记录wakeup sourcedriver使用的频率。

    开启该功能的方法:

    echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event

     

    The power:wakeup_source_activate and power:wakeup_source_deactivate events are written to the trace buffer any time a wakeup source is acquired or released and it can provide information on how often a wakeup source is being used by a driver.  

    To enable these events, you can enable following:  

    echo "power:wakeup_source_activate power:wakeup_source_deactivate" > /sys/kernel/debug/tracing/set_event 

    Once the above done, the traces will be present in /sys/kernel/debug/tracing/trace. 

     

    2.6 powertop

    powertop用来看CPU的运行统计以协助调试power问题。powertop的用法如下:

    powertop --h

    Usage: powertop [OPTION...]

    n -d, --dump read wakeups once and print list of top offenders

    n -t, --time=DOUBLE default time to gather data in seconds

    n -r, --reset Reset PM stats data

    n -h, --help Show this help message

    n -v, --version Show version information and exit

    获取powertop log的方法:

    1. 通过USB连接手机到电脑

    2. adb shell,然后执行如下命令:

    sleep 10 && /data/powertop [-r] -d -t 30 > /data/powertop.log & 

    3. 拔掉USB线,等待10秒后开始功耗测试

    4. 插上USB  

    5. adb pull /data/powertop.log  

     

    2.7 CPU freq log 

    打开CPU freq change log

    mount -t debugfs none /sys/kernel/debug  

    cd /sys/kernel/debug 

    echo -n 'file acpuclock-8x60.c +p' > dynamic_debug/control 

    echo -n 'file acpuclock-krait.c +p' > dynamic_debug/control

     

    查看cpu freq stats: 

    cat /sys/devices/system/cpu/cpu0/cpufreq/stats 

    cat /sys/devices/system/cpu/cpu1/cpufreq/stats 

    cat /sys/devices/system/cpu/cpu2/cpufreq/stats 

    cat /sys/devices/system/cpu/cpu3/cpufreq/stats 

     

    To lock cpu freg: 

    echo the same freq to following sys mode will lock cpu freq to the setting freq. 

    /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq 

    /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq

     

    To enable/disable specific freq for ACPU 

    ACPU freq table is defined in acpu_freq_tbl_* structure of specific platform. 

    arch/arm/mach-msm/acpuclock-.c 

    For 8974, it is defined in arch/arm/mach-msm/acpuclock-8974.c. the first column of following table used to enable/disable freq in the row: 1:enable, 0:disable  

    static struct acpu_level acpu_freq_tbl_2p3g_pvs0[] __initdata = { 

    { 1, { 300000, PLL_0, 0, 0 }, L2(0), 800000, 72 }, 

    { 0, { 345600, HFPLL, 2, 36 }, L2(1), 800000, 83 }, 

    { 1, { 422400, HFPLL, 2, 44 }, L2(2), 800000, 101 }, 

    { 0, { 499200, HFPLL, 2, 52 }, L2(2), 805000, 120 }, 

    { 0, { 576000, HFPLL, 1, 30 }, L2(3), 815000, 139 }, 

    { 1, { 652800, HFPLL, 1, 34 }, L2(3), 825000, 159 }, 

    { 1, { 729600, HFPLL, 1, 38 }, L2(4), 835000, 180 }, 

    { 0, { 806400, HFPLL, 1, 42 }, L2(4), 845000, 200 }, 

    { 1, { 883200, HFPLL, 1, 46 }, L2(4), 855000, 221 }, 

    { 1, { 960000, HFPLL, 1, 50 }, L2(9), 865000, 242 }, 

    { 1, { 1036800, HFPLL, 1, 54 }, L2(10), 875000, 264 }, 

    { 0, { 1113600, HFPLL, 1, 58 }, L2(10), 890000, 287 }, 

    { 1, { 1190400, HFPLL, 1, 62 }, L2(10), 900000, 308 }, 

    … 

    { 1, { 1958400, HFPLL, 1, 102 }, L2(19), 1040000, 565 }, 

    { 0, { 2035200, HFPLL, 1, 106 }, L2(19), 1055000, 596 }, 

    { 0, { 2112000, HFPLL, 1, 110 }, L2(19), 1070000, 627 }, 

    { 0, { 2188800, HFPLL, 1, 114 }, L2(19), 1085000, 659 }, 

    { 1, { 2265600, HFPLL, 1, 118 }, L2(19), 1100000, 691 }, 

    { 0, { 0 } } 

    }; 

     

    2.8 Hoplug cores 

    Core 0 cant be hotplugged, Core 1/2/3 can be hotplugged, 

    To remove core : 

    echo 0 > /sys/devices/system/cpu/cpu1/online 

    echo 0 > /sys/devices/system/cpu/cpu2/online 

    echo 0 > /sys/devices/system/cpu/cpu3/online 

     

    To add back core: 

    echo 1 > /sys/devices/system/cpu/cpu1/online

    echo 1 > /sys/devices/system/cpu/cpu2/online

    echo 1 > /sys/devices/system/cpu/cpu3/online

     

    2.9 Scaling governor

    To check scaling governor

    cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

     

    To set new governor

    echo  > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

    比如:

    echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

     

    2.10 Mpdecision

    Use Mpdecison daemon to start/stop/enable debug with commands below: 

    Start mpdecison: 

    start mpdecision 

    Stop mpdecison

    stop mpdecision

     

    Enable mpdecision debug 

    start mpdecision --debug 

     

    2.11 Power feature enable/disable 

    Following sys node can be used to enable the lower resource, 

     

    echo 2 > /sys/module/lpm_resources/enable_low_power/l2 

    echo 1 > /sys/module/lpm_resources/enable_low_power/pxo 

    echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_dig 

    echo 1 > /sys/module/lpm_resources/enable_low_power/vdd_mem 

    echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu1/power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu2/power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu3/power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu0/power_collapse/idle_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/suspend_enabled

    echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/suspend_enabled

    echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/suspend_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/suspend_enabled

    echo 1 > /sys/module/pm_8x60/modes/cpu0/standalone_power_collapse/idle_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu1/standalone_power_collapse/idle_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu2/standalone_power_collapse/idle_enabled 

    echo 1 > /sys/module/pm_8x60/modes/cpu3/standalone_power_collapse/idle_enabled 

    echo 0 to above sys node will disable related low power mode. 

     

    2.12 Check system alarm  

    get android alarms and statistics: 

    adb dumpsys alarm > alarms.txt

     

    enable android debug message in logcat: 

    setprop persist.alarm.debug 1

     

    2.13 Kernel timer check

    Sys node /proc/timer_stats can be used to check kernel timer stastics, customer can use following command to get timer statics in specific scenario: 

    echo 0 > /proc/timer_stats && sleep 10 && echo 1 > /proc/timer_stats && sleep 30 && cat /proc/timer_stats > /data/timer_stats & 

     

    OEMs need to provide file /data/timer_stats to salesforce case for check. 

     

     

    3、其他功耗项的优化

    3.1屏幕对功耗的影响

    屏幕亮度等级不同,功耗不同。亮度越低,功耗越低。调低屏幕默认背光亮度等级和屏幕最高亮度设置时候的背光亮度等级,可以优化手机整体功耗表现。

    LCD背光等级的设备节点:

    /sys/class/leds/lcd-backlight/brightness

    默认背光等级和最高亮度背光等级需要同时考虑到用户体验和功耗表现,需要一起评估。

    另外,调试LCDfps帧率,也可以优化功耗。

     

    3.2 CPU/GPU DVFS

    CPU/GPU的动态调频调压可以优化手机的功耗表现。该影响是整体性的,系统性的。

    CPU降频主要通过两种方式实现,都可以达到降频的目标。

    1、设置CPU工作在powersave模式。设置该模式后,CPU将一直工作在最低频率(300000hz)。此时手机最省电,但是有可能会出现手机运行变卡顿。

    例如:将CPU0置为powersave模式,命令为:

    echo "powersave" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

    例如:将CPU1置为powersave模式,命令为:

    echo "powersave" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor

    ex780共有4CPUCPU0~CPU3),都可以这样处理

    2、限制CPU最高频率,以限制CPU的运行频率上限

    CPUCPU0~CPU3)可以选择的频率值如下所列,即这些数值都可以用作CPU的频率上限。选择的频率上限可以根据实际场景需要来设置。在超级省电模式下,CPU工作的宗旨是:CPU工作频率低+运行不卡,两项都要保障。

    CPU可以选择的频率:

    300000 422400 652800 729600 883200 960000 1036800 1190400 1267200 1497600 1574400 1728000 1958400 2265600 2457600

    例如:将CPU0的频率上限设置为960000

    echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

    例如:将CPU0的频率上限设置为422400

    echo 422400 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

     

    GPU相关调试与CPU类似,设备节点路径/sys/devices/fdb00000.qcom,kgsl-3d0/kgsl/kgsl-3d0

     

    3.3 CPU占用率

    应用对cpu的占有率,如果占有率过高,则该应用一般会导致功耗较大。

    adb shell

    top -m 6 

     

    3.4游戏功耗

    可以从下面几个方面优化:

    降低屏幕背光亮度等级;

    采用CPUGPU动态调频调压,并调低CPUGPU频率下限;

    采用thermal-engine.conf 

     

    3.5 Camera功耗偏大

    降低camera帧率;

    降低屏幕背光亮度等级;

    采用CPUGPU动态调频调压,并调低CPUGPU频率下限;

    采用thermal-engine.conf 

    展开全文
  • Android 功耗分析之wakelock生活总是让我们遍体鳞伤,但到后来,那些受伤的地方一定会变成我们最强壮的地方。—海明威WakeLock是什么WakeLock作用WakeLock有那些分类WakeLock的设置过程WakeLock用法WakeLock相关问题...
  • Android 功耗问题debug处理(主要是睡眠时“大”电流问题的debug方法示例)1. 在手机进入sleep后,被上层apk唤醒的debug方法请抓取相应的待机的mobilelog,从kernel_log中分析,如果log中可以查找到wake up by RTC请...
  • android功耗高通平台 分类:功耗1、底电流调试(Rock Bottom Curren...
  • android 功耗分析主要步骤
  • 标签:android功耗高通平台 分类:功耗1、底电流调试(Rock Bottom Current Optimization)底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的Current Consumption Data...
  • android 功耗 高通平台 底电流在手机飞行模式下调试。每个平台的底电流数据可能不一样,具体可以参考release出来的CurrentConsumptionData文档或者releasenote。一般情况下的底电流参考数据上限是:1、底电流调试...
  • 软件评测方案中,所有Android功耗的统计都是通过代码进行估算,没有任何实体电路和硬件设备参与统计汇报。 这个配置文件存储在Android设备的以下路径中: /frameworks/base/core/res/res/xml/power_profile.xml ...
  • 最近几年中,Google在一直极力的改进Android系统的续航能力。在本文中,我们将看到Andrdoi自5.0到8.0这几个版本中对于功耗方面的改进。 前言 移动设备的续航时间无疑是所有用户都非常在意的。我们都希望自己的...
  • Android功耗调试汇总

    2021-01-26 16:32:26
    (1)runtime PM机制 系统在非睡眠状态时,设备在空闲时可以进入runtime suspend状态同时不依赖系统wake_lock机制;非空闲时执行runtime resume使得设备进入正常工作状态。 主要代码放在Runtime.c (drivers\base\...
  • 主要内容 功耗优化:关于一些对功耗的检测及优化 内存优化:关于一些对内存的常见优化手段及检测工具 功耗优化 耗电原因 CPU:wakelocks 网络、无线、蓝牙等 ...从 API 23 开始, Android 提...
  • android功耗的工作

    2017-11-17 17:15:06
    总结了一下做手机功耗的相关经验知识,做成思维导图。发现这图极不对称,待机的内容一大堆。实际上功耗大部分问题是待机相关,调试待机问题的知识也是非常多。其他场景的功耗问题,一般都是功耗分解然后对比。但是...
  • 最近几年中,Google在一直极力的改进Android系统的续航能力。在本文中,我们将看到Andrdoi自5.0到8.0这几个版本中对于功耗方面的改进。 前言 移动设备的续航时间无疑是所有用户都非常在意的。我们都希望自己的手机...
  • android 功耗调试方向

    2019-07-24 23:14:57
    1.熄屏后cpu降频率; 2.待机用2G驻网; 3.关闭logcat 日志功能; 4.对齐唤醒 5.关闭所有io口
  • 高通功耗问题分析高通官方提供了一篇文档extensive_power_debug_guide_(simplified_chinese功耗调试).pdf  用来分析中断功耗问题。本文结合该文档简单的总结了AP端功耗问题分析手段。首先是官方功耗分析流程图...
  • android功耗相关资料

    千次阅读 2016-12-14 14:48:08
    引用其他优秀资料,如有侵权,请联系我,删除 ...android耗电统计算法 :  http://gityuan.com/2016/01/10/power_rank/ 基于Android 6.0的源码剖析 一、 概述 Android系统中的耗电统计分为软件排行榜和硬
  • Android 功耗(6)---整机功耗测试

    千次阅读 2018-05-02 11:35:34
    手机功耗测试之一:三张图看懂整机功耗测试一、手机功耗分析二、模块功耗主要功耗场景和优化点三、测试功耗
  • android省电和提高效率     一.Android省电开发之性能优化      我之前博客有在总结,just a little,http://blog.csdn.net/wtyvhreal/article/details/44172125   二.Android省电开发之CPU降频 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,360
精华内容 944
关键字:

android功耗