iOS的电量优化

作者: JackHZG | 来源:发表于2019-11-10 16:01 被阅读0次

iOS的性能优化越来越成为重点,电量优化也成为其中一个重点。引起电量优化的原因有很多,比如:页面有没有开启实时定位,网络请求是否频繁,定时任务是否间隔小等等。

获取电量

只有找到电量消耗的源头,我们才能真正地去解决它。在iOS中,我们可以通过IOKit framework来获取硬件信息,进而获取到电量消耗信息。IOKit是专门用于跟硬件或内核服务器通信的。
IOKit在Xcode中的使用如下:

  • 因为iOS下的不能直接添加IOKit,所以先创建一个Mac 项目,然后把这里的IOKit拷贝到iOS项目下


    Mac下项目里的IOKit
  • 把IOPSKeys.h,IOPowerSources.h头文件加入到使用的文件中
  • 最后,使用如下代码计算
#import "IOPSKeys.h"
#import "IOPowerSources.h"

- (double)getBatteryLevel{
    // 返回电量信息
    CFTypeRef blob = IOPSCopyPowerSourcesInfo();
    CFArrayRef sources = IOPSCopyPowerSourcesList(blob);
    CFDictionaryRef pSource = NULL;
    const void *psValue;
    // 返回数组大小
    int numOfSources = CFArrayGetCount(sources);
    // 计算大小出错处理
    if (numOfSources == 0) {
        NSLog(@"Error in CFArrayGetCount");
        return -1.0f;
    }

    // 计算所剩电量
    for (int i=0; i<numOfSources; i++) {
        // 返回电源可读信息的字典
        pSource = IOPSGetPowerSourceDescription(blob, CFArrayGetValueAtIndex(sources, i));
        if (!pSource) {
            NSLog(@"Error in IOPSGetPowerSourceDescription");
            return -1.0f;
        }
        psValue = (CFStringRef) CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey));

        int curCapacity = 0;
        int maxCapacity = 0;
        double percentage;

        psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey));
        CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity);

        psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey));
        CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity);

        percentage = ((double) curCapacity / (double) maxCapacity * 100.0f);
        NSLog(@"curCapacity : %d / maxCapacity: %d , percentage: %.1f ", curCapacity, maxCapacity, percentage);
        return percentage;
    }
    return -1;
}

诊断电量问题

根据获取线程的信息,去获取到哪个线程使用CPU最较高。然后有针对性地进行代码优化。获取多线程CPU使用率的代码如下:

#include <mach/mach_types.h>
#include <mach/task.h>
#import "SMCallStack.h"

// 轮询检查多个线程 CPU 情况
+ (void)updateCPU {
    thread_act_array_t threads;
    mach_msg_type_number_t threadCount = 0;
    const task_t thisTask = mach_task_self();
    kern_return_t kr = task_threads(thisTask, &threads, &threadCount);
    if (kr != KERN_SUCCESS) {
        return;
    }
    for (int i = 0; i < threadCount; i++) {
        thread_info_data_t threadInfo;
        thread_basic_info_t threadBaseInfo;
        mach_msg_type_number_t threadInfoCount = THREAD_INFO_MAX;
        if (thread_info((thread_act_t)threads[i], THREAD_BASIC_INFO, (thread_info_t)threadInfo, &threadInfoCount) == KERN_SUCCESS) {
            threadBaseInfo = (thread_basic_info_t)threadInfo;
            if (!(threadBaseInfo->flags & TH_FLAGS_IDLE)) {
                integer_t cpuUsage = threadBaseInfo->cpu_usage / 10;
                if (cpuUsage > 80) {
                    //cup 消耗大于 80 时打印和记录堆栈
                   //使用打印堆栈的方法
                    NSString *reStr = smStackOfThread(threads[i]);
                   //这里可以做堆栈存储的操作
                    NSLog(@"CPU useage overload thread stack:\n%@",reStr);
                }
            }
        }
    }
}

电量优化

通过上面获取到电量消耗的源头,就可以针对性地解决电量问题了。CPU是电量消耗的大头,平时开发中,我们需要注意对耗电量的优化,避免让CPU做多余的事情,比如:大量数据的计算,就可以放到后台来做。
除了CPU耗电,影响耗电的还有可能以下因素:

I/O操作
  • 尽量不要频繁写入小数据,一次性写入数据量大的,用数据库(如Sqlite、Realm)或者用Dispatch_io来读取大量重要数据。
  • 需要图片读写的,可以采用类似SDWebImage框架设计的方式:在图片读取缓存的时候,优先使用系统自带的NSCache,查找不到再通过I/O读取磁盘缓存图片,减少了电量消耗。
网络优化
  • 开发中如果多次请求的结果是相同的,尽量使用缓存。
  • 减少、压缩网络数据。有时候,新手后台工程师为了不影响原有业务,基本都是在原有上添加返回字段,故而导致数据越来越多。
  • 大量数据传输的,可以使用断点续传。
定位优化
  • 尽量降低定位精准度
  • 除非是必要实时定位的场景,否则不要开启实时定位。

除此之外,苹果还专门维护了一个电量优化指南,提出了从CPU、设备唤醒、网络、图形、动画、视频、定位、加速度计、陀螺仪、蓝牙等多方面的优化,可以按照电量优化指南,根据APP的情况去优化下。

参考链接
苹果电量优化指南
深入剖析iOS性能

相关文章

  • 21.性能优化

    关于iOS 性能优化梳理: 基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、 安装包瘦身、启动优化、网...

  • iOS App优化:基本工具、业务优化、内存优化、卡顿优化、布局

    关于iOS 性能优化梳理: 基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、 安装包瘦身、启动优化、网...

  • 性能优化

    关于iOS 性能优化梳理: 基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、 安装包瘦身、启动优化、网...

  • iOS 性能优化总结

    关于iOS 性能优化梳理: 基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、 安装包瘦身、启动优化、网...

  • iOS 电量优化

    耗电检测 1.普通检测 一般方法为非开发人员测试的方法,iOS12以上可在 设置->电池 查看每小时对应APP的耗...

  • iOS 电量优化

    最近观看 WWDC 2020 关于电量和性能调试的 session: Diagnose performance i...

  • iOS 电量优化

    一 优化CPU耗电 耗时长处理 对于大量复杂计算,应该把数据传到服务器处理,如果必须在APP内处理,可以通过GCD...

  • iOS的电量优化

    iOS的性能优化越来越成为重点,电量优化也成为其中一个重点。引起电量优化的原因有很多,比如:页面有没有开启实时定位...

  • 【iOS】iOS电量优化方案

    1、 网络方面的优化 请求前判断网络状态,网络不可用,不要尝试执行网络请求; 请求前设置合适的超时时间,避免长时间...

  • iOS电量优化之路

    https://github.com/BiBoyang/Study/wiki/iOS%E7%94%B5%E9%87...

网友评论

    本文标题:iOS的电量优化

    本文链接:https://www.haomeiwen.com/subject/itsobctx.html