导航:首页 > 操作系统 > androidcpu时间

androidcpu时间

发布时间:2022-12-09 16:17:05

A. android获取系统cpu信息,内存,版本,电量等信息

1、CPU频率,CPU信息:/proc/cpuinfo和/proc/stat

通过读取文件/proc/cpuinfo系统CPU的类型等多种信息。

读取/proc/stat 所有CPU活动的信息来计算CPU使用率

下面我们就来讲讲如何通过代码来获取CPU频率:

复制代码 代码如下:

package com.orange.cpu;

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.io.InputStream;

public class CpuManager {

// 获取CPU最大频率(单位KHZ)

// "/system/bin/cat" 命令

// "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" 存储最大频率的文件的.路径

public static String getMaxCpuFreq() {

String result = "";

ProcessBuilder cmd;

try {

String[] args = { "/system/bin/cat",

"/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" };

cmd = new ProcessBuilder(args);

Process process = cmd.start();

InputStream in = process.getInputStream();

byte[] re = new byte[24];

while (in.read(re) != -1) {

result = result + new String(re);

}

in.close();

} catch (IOException ex) {

ex.printStackTrace();

result = "N/A";

}

return result.trim();

}

// 获取CPU最小频率(单位KHZ)

public static String getMinCpuFreq() {

String result = "";

ProcessBuilder cmd;

try {

String[] args = { "/system/bin/cat",

"/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq" };

cmd = new ProcessBuilder(args);

Process process = cmd.start();

InputStream in = process.getInputStream();

byte[] re = new byte[24];

while (in.read(re) != -1) {

result = result + new String(re);

}

in.close();

} catch (IOException ex) {

ex.printStackTrace();

result = "N/A";

}

return result.trim();

}

// 实时获取CPU当前频率(单位KHZ)

public static String getCurCpuFreq() {

String result = "N/A";

try {

FileReader fr = new FileReader(

"/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq");

BufferedReader br = new BufferedReader(fr);

String text = br.readLine();

result = text.trim();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return result;

}

// 获取CPU名字

public static String getCpuName() {

try {

FileReader fr = new FileReader("/proc/cpuinfo");

BufferedReader br = new BufferedReader(fr);

String text = br.readLine();

String[] array = text.split(":s+", 2);

for (int i = 0; i < array.length; i++) {

}

return array[1];

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

}

2、内存:/proc/meminfo

复制代码 代码如下:

public void getTotalMemory() {

String str1 = "/proc/meminfo";

String str2="";

try {

FileReader fr = new FileReader(str1);

BufferedReader localBufferedReader = new BufferedReader(fr, 8192);

while ((str2 = localBufferedReader.readLine()) != null) {

Log.i(TAG, "---" + str2);

}

} catch (IOException e) {

}

}

3、Rom大小

复制代码 代码如下:

public long[] getRomMemroy() {

long[] romInfo = new long[2];

//Total rom memory

romInfo[0] = getTotalInternalMemorySize();

//Available rom memory

File path = Environment.getDataDirectory();

StatFs stat = new StatFs(path.getPath());

long blockSize = stat.getBlockSize();

long availableBlocks = stat.getAvailableBlocks();

romInfo[1] = blockSize * availableBlocks;

getVersion();

return romInfo;

}

public long getTotalInternalMemorySize() {

File path = Environment.getDataDirectory();

StatFs stat = new StatFs(path.getPath());

long blockSize = stat.getBlockSize();

long totalBlocks = stat.getBlockCount();

return totalBlocks * blockSize;

}

4、sdCard大小

复制代码 代码如下:

public long[] getSDCardMemory() {

long[] sdCardInfo=new long[2];

String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {

File sdcardDir = Environment.getExternalStorageDirectory();

StatFs sf = new StatFs(sdcardDir.getPath());

long bSize = sf.getBlockSize();

long bCount = sf.getBlockCount();

long availBlocks = sf.getAvailableBlocks();

sdCardInfo[0] = bSize * bCount;//总大小

sdCardInfo[1] = bSize * availBlocks;//可用大小

}

return sdCardInfo;

}

5、电池电量

复制代码 代码如下:

private BroadcastReceiver batteryReceiver=new BroadcastReceiver(){

@Override

public void onReceive(Context context, Intent intent) {

int level = intent.getIntExtra("level", 0);

// level加%就是当前电量了

}

};

registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

6、系统的版本信息

复制代码 代码如下:

public String[] getVersion(){

String[] version={"null","null","null","null"};

String str1 = "/proc/version";

String str2;

String[] arrayOfString;

try {

FileReader localFileReader = new FileReader(str1);

BufferedReader localBufferedReader = new BufferedReader(

localFileReader, 8192);

str2 = localBufferedReader.readLine();

arrayOfString = str2.split("s+");

version[0]=arrayOfString[2];//KernelVersion

localBufferedReader.close();

} catch (IOException e) {

}

version[1] = Build.VERSION.RELEASE;// firmware version

version[2]=Build.MODEL;//model

version[3]=Build.DISPLAY;//system version

return version;

}

7、mac地址和开机时间

复制代码 代码如下:

public String[] getOtherInfo(){

String[] other={"null","null"};

WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);

WifiInfo wifiInfo = wifiManager.getConnectionInfo();

if(wifiInfo.getMacAddress()!=null){

other[0]=wifiInfo.getMacAddress();

} else {

other[0] = "Fail";

}

other[1] = getTimes();

return other;

}

private String getTimes() {

long ut = SystemClock.elapsedRealtime() / 1000;

if (ut == 0) {

ut = 1;

}

int m = (int) ((ut / 60) % 60);

int h = (int) ((ut / 3600));

return h + " " + mContext.getString(R.string.info_times_hour) + m + " "

+ mContext.getString(R.string.info_times_minute);

}

B. 安卓手机应用CPU占用时间是如何计算的

cpu指标的查看方式有多种,最直接的就是android自带的DDMS可视化工具,也可以在IDE(Android Studio)的Monitor中实时查看。另外就是通过linux系统/proc/stat和/proc/<pid>/stat文件进行占用率的计算,也可以利用top命令或者mpsys cupinfo等命令实时查看当前cpu情况。我们接下来详细看下每一种方法是如何查看和获得cpu占用率数据

C. Android性能优化第(八)篇---App启动速度优化之耗时检测处理

应用的启动速度缓慢这是很多开发者都遇到的一个问题,比如启动缓慢导致的黑屏,白屏问题,大部分的答案都是做一个透明的主题,或者是做一个Splash界面,但是这并没有从根本上解决这个问题。那么如何从根本上解决这个问题或者做到一定程度的缓解?

1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会首先会创建一个新的进程分配给该应用,这种启动方式就是冷启动。

2、热启动:当启动应用时,后台已有该应用的进程,比如按下home键,这种在已有进程的情况下,这种启动会从已有的进程中来启动应用,这种启动方式叫热启动。

3、温启动 :当启动应用时,后台已有该应用的进程,但是启动的入口Activity被干掉了,比如按了back键,应用虽然退出了,但是该应用的进程是依然会保留在后台,这种启动方式叫温启动。

adb shell am start -W [PackageName]/[PackageName.MainActivity]

执行成功后将返回三个测量到的时间:

这里面涉及到三个时间,ThisTime、TotalTime 和 WaitTime。WaitTime 是 startActivityAndWait 这个方法的调用耗时,ThisTime 是指调用过程中最后一个 Activity 启动时间到这个 Activity 的 startActivityAndWait 调用结束。TotalTime 是指调用过程中第一个 Activity 的启动时间到最后一个 Activity 的 startActivityAndWait 结束。如果过程中只有一个 Activity ,则 TotalTime 等于 ThisTime。

总结:如果只关心某个应用自身启动耗时,参考TotalTime;如果关心系统启动应用耗时,参考WaitTime;如果关心应用有界面Activity启动耗时,参考ThisTime。

从我们Application开始到首页显示出来,这个过程,我们应该注意一些什么,将这个过程细分一下,会有下面的时间点需要注意。

Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量、布局、绘制显示在界面上。

因为上面这些阶段全部都是在主线程中执行的,任何不经意的操作都可能拖慢应用的启动速度。所以我们不应在Application以及Activity的生命周期回调中做任何费时操作,具体指标大概是你在onCreate,onResume,onStart等回调中所花费的总时间最好不要超过400ms,否则用户在桌面点击你的应用图标后,将感觉到明显的卡顿。但是有些 不得以的任务 又必须在UI显示之前执行。所以我们要将 任务 划分优先级。

对于首页渲染完成后,开始加载,或者延迟加载,延迟加载的目的就是界面先显示出来,然后加载,但是你觉得要延迟多久呢?在 Android 的高端机型上,应用的启动是非常快的 , 这时候只需要 Delay 很短的时间就可以了, 但是在低端机型上,应用的启动就没有那么快了,而且现在应用为了兼容旧的机型,往往需要 Delay 较长的时间,这样带来体验上的差异是很明显的。延迟加载有一种方式。

极力推荐用第二种,在窗口完成以后进行加载,这里面的run方法是在onResume之后运行的。关于这种懒加载机制,参考 Android应用启动优化:一种DelayLoad的实现和原理(上篇) ,给出了详细的解释。

通过上面我们知道一种懒加载机制,所以我们可以将Application中和首页的onCreate中的有些耗时任务,放到首页渲染完毕后加载。如何找出这些耗时任务,TraceView就派上用场了,TraceView的用法,移步我的前面的博客 Android性能优化第(六)篇---TraceView 分析图怎么看?

比如在首页的onCreate中我们进行了用户启动上报,这个进行懒加载是不是分分钟减少139毫秒呢?

在比如在Application里面用到了GSON,将String转化成json,我将这个移动到懒加载里面,是不是又减少了100毫秒呢?

在比如,有些Application中做了支付SDK的初始化,用户又不会一打开App就要支付,放在Application中加载干嘛?

此处我们这里举得例子是优化了139毫秒和100毫秒的,其实真正耗时的任务有的有1秒多,都被我优化完了,所以trace图中看不到了,就举个了这两个例子,还有SharedPreferences也是耗时大户,经过检测保存一个boolean变量耗时120+毫秒以上。

利用TraceView可以清楚我们每一个方法的耗时时间,极大的帮助了我们做优化工作。

五、优化思路总结
1、UI渲染优化,去除重复绘制,减少UI重复绘制时间,打开设置中的GPU过度绘制开关,各界面过度绘制不应超过2.5x;也就是打开此调试开关后,界面整体呈现浅色,特别复杂的界面,红色区域也不应该超过全屏幕的四分之一;
2、根据优先级的划分,KoMobileApplication的一些初始化工作能否将任务优先级划分成3,在首页渲染完成后进行加载,比如:PaySDKManager。
3、主线程中的所有SharedPreference能否在非UI线程中进行,SharedPreferences的apply函数需要注意,因为Commit函数会阻塞IO,这个函数虽然执行很快,但是系统会有另外一个线程来负责写操作,当apply频率高的时候,该线程就会比较占用CPU资源。类似的还有统计埋点等,在主线程埋点但异步线程提交,频率高的情况也会出现这样的问题。
4、检查BaseActivity,不恰当的操作会影响所有子Activity的启动。
5、对于首次启动的黑屏问题,对于“黑屏”是否可以设计一个.9图片替换掉,间接减少用户等待时间。
6、对于网络错误界面,友好提示界面,使用ViewStub的方式,减少UI一次性绘制的压力。
7、任务优先级为2,3的,通过下面这种方式进行懒加载的方式

8、Multidex的使用,也是拖慢启动速度的元兇,必须要做优化。后面有空专门写一篇Multidex。

相关链接:

Android应用启动优化:一种DelayLoad的实现和原理(上篇)http://androidperformance.com/2015/11/18/Android-app-lunch-optimize-delay-load.html

Android性能优化之加快应用启动速度http://www.open-open.com/lib/view/open1452821612355.html

手机淘宝性能优化全记录http://www.open-open.com/lib/view/open1452488209370.html

Android客户端性能优化(魅族资深工程师毫无保留奉献)http://blog.tingyun.com/web/article/detail/155#rd

Please accept mybest wishes for your happiness and success !

D. android cpu占用多少算高

应用在工作中占用cpu高点都不要紧,只要不是长时间占用就可以,即使峰值达到100%都不怕。
就怕持续占用CPU。
比如说一个美图软件,有任务(比如拍照,图像处理)的时候,需要占用CPU进行处理,此种情况占用CPU高点都没关系,瞬间峰值达到100%都不怕,只要它不长时间占用即可。但是在无任务的时候,CPU就应该降下来,如果不降下来,就是代码有问题。

E. Android:安卓系统中,处理器的一个时间片大概有多长时间

CPU分配的最小时间片断为2ms

F. 安卓CPU性能原地踏步的两年

2020年的骁龙865是高通最近几年最成功的旗舰SoC,同年的麒麟9000成为海思绝唱。随后2021年的骁龙888永久改变了安卓手机的散热配置,2022年的骁龙8 Gen 1更进一步,连用风扇主动散热的 游戏 手机都在继续升级散热。

当年骁龙810机型并未大批量铺货,所以公众其实还是第一次感受到移动SoC的热情如火,这是安卓手机GPU性能飞涨的两年,但也是安卓CPU原地踏步的两年。

下面故事概括就是一条条逻辑链:

iPhone用户和非手机圈用户,可能并不了解为什么安卓阵营哀嚎了两年,我们按时间顺序理一下,究竟发生什么事。毕竟大家习惯了手机性能以每年20%-30%幅度增长的日子,但实际上安卓阵营已经出现性能体验原地踏步的情况了。

故事从2020年底骁龙888发布说起。后者首发三星5nm工艺,也首发搭载arm首个真正的超大核架构Cortex-X1。骁龙888发布之前,微博大V数码闲聊站称骁龙888性能强,功耗低,大家对未来充满了期待。

极客湾视频

首发骁龙888的小米11在2021年元旦开卖,极客湾在1月6号的《骁龙888性能分析:翻车!》为骁龙888火热的一年拉开了序幕。骁龙888是否翻车,成为了2021年机圈最热门的话题之一。

2017年的骁龙835日常功耗在3W的量级,随后的骁龙845、骁龙855、骁龙865功耗“稳步增长”,来到了5W到6W区间。而骁龙888的X1大核,单颗功耗就能跑到3.3W,CPU多核功耗从骁龙865的5.9W直接飙到7.8W。其GPU部分的功耗和能耗比曲线也不普通,以致于早期很多人都认为骁龙888的GPU只是在骁龙865的基础上继续超频并导致功耗偏高。

因为骁龙888的功耗数据高得不正常,所以后来还出现了物理拆机,用“假电池排线”的物理方法强行测试功耗。虽然结果比软件测试功耗低2W,但整机功耗依然达到了10W级别,瞬时功耗迫近11W。

功耗的上涨,导致在“交互化跑分软件”《原神》中,骁龙888机型都能轻松突破45度,部分极端机型可以冲到近50度。3C数码产品有48度的温度线,以防止用户被“低温烫伤”,所以骁龙888机型几乎都遭遇了屏幕强制降低亮度,系统锁帧等现象( 游戏 手机除外)。

随后的事情,可能很多用户都有所听闻。天气转暖,先是大批用户反映骁龙888旗舰会有发热卡顿的问题,甚至会触发过热警告。随后一众厂商赶在夏天之前推送了降频固件,用限制性能输出的方法来降低发热,以压制骁龙888的热情。

紧接着就是出现大批量“骁龙888降频后性能不如骁龙865”的反馈和不满。最惨的小米,一来是首发的骁龙888,二来是早期执行“为发烧而生”的积极调度策略,夏天出现了小米11因高温烧Wi-Fi的事件。虽然后续有相当良心的换机政策和机型改进,但一朝被蛇咬的小米,随后成为温控和频率控制最保守的厂商。

时间可以冲淡一切,大家坦然接受了骁龙888的热情,甚至亲切地调侃“只有骁龙888还在冬季给我一丝温暖”。然后,骁龙8 Gen 1来了。

大米评测数据

一代新人胜旧人,称号也从“火龙”升级为“炎龙”。新的 X2大核,单核功耗刷新了骁龙888的纪录,从3.3W跃升到4W级别,新的A710大核也有2.1W(中核有3颗)。而新的Adreno GPU,在GFXBench曼哈顿3.0场景的功耗,也从骁龙888的8.2W跃升到10.9W。

这是手机SoC 历史 上从未出现过的功耗成绩,CPU峰值和GPU峰值功耗双双突破10W,俨然是平板电脑,甚至是轻薄本级的功耗级别了。苹果M1和骁龙8 Gen 1,以不同的方式达成了各自的“PC级”标准。

上一颗这么奔放的手机SoC还是2015年的骁龙810。但和7年前不同的是,现在的手机厂商有足够的技术储备,能短时间压住它的发热。骁龙8 Gen 1不羁的功耗表现,让包括三星在内的所有安卓厂商,都在发布会上强调自家的散热配置。“驯龙高手”从以前的调侃,变成所有安卓厂商的目标。

再叠加现阶段国内部分32位应用的效率问题(骁龙8 Gen 1新架构中,8颗核心里只能3颗中核支持32位应用),加剧了老旧应用中的发热和卡顿问题。要知道,一年里对手机发热最为友好的冬春季节即将结束,对温度更加敏感的夏天就在眼前了。

同样的发热问题,也出现在使用同款三星5nm/4nm工艺的Exynos 2100和Exynos 2200上(欧版韩版的三星Galaxy S21系列和欧版的S22系列)。后者是首个搭载AMD RDNA2 GPU的移动SoC,其不但GPU绝对性能没打过骁龙8 Gen 1和天玑9000,CPU部分也和骁龙8 Gen 1一样出现能耗比倒退。

同一条时间线上,在用户饱受发热之苦的2021年12月,联发科发布了第一个真正超越高通的SoC——天玑9000。联发科在量产机开卖前3个月就把工程机拿给媒体进行测试的操作,也是以前从未出现过的。

台积电4nm、更有诚意的堆料、测试机上压倒性的CPU和能效比,都让大家期待值拉满。“干翻X通!天下人苦X通久矣”的欢呼声不绝于耳。最终万众期待的天玑9000,由OPPO Find X5 Pro天玑版PPT首发,由Redmi K50 Pro物理首发。

联发科天玑9000量产机确实展现出碾压骁龙8 Gen 1的能耗比,但峰值功耗依然夸张,能耗比也不如工程机逆天。故有梗:联发科提前给测试机,是为了防止后续厂商调不好的时候赖芯片。至此,2022年3颗采用armv9新架构的新SoC,全部都在能耗比上“挂彩”。

还有一个小插曲。2021年的三星Galaxy S21 Ultra、一加9 Pro和OPPO Find X3系列等安卓旗舰搭载了更加省电的LTPO屏幕(可以动态调整屏幕刷新率的省电技术),而2022年旗舰更是大批量搭载更加省电的LTPO 2.0屏幕。这2代LTPO屏幕恰巧遇上骁龙888和骁龙8 Gen 1,它们省下的电根本不够SoC吃,故有“关于纳智捷发动机油老虎厂家去拼命优化轮胎省油的那些事儿”的梗。

“热”本身不致命,致命的是CPU性能也原地踏步。这里涉及能耗比(性能和功耗的比值)和热承载的概念:

骁龙8 Gen 1的CPU性能和骁龙888并没实质性提升。另外要注意,骁龙888的X1大核是2.8GHz的,而骁龙8 Gen 1的X2大核的3.0GHz的,同频率下的性能甚至还反向升级了。功耗增长,性能不涨,能效比那日常效果怎么样呢?

摆在厂商面前的选择有两个:放开骁龙8 Gen 1跑,续航和发热受累。或控制频率,保住续航和发热。从结果上看,所有厂商都选了后者。导致新骁龙8只有在GeekBench、GFXBench、3DMakr等极少数跑分应用能火力全开。

从2018年的骁龙845开始,安卓旗舰SoC的最高频只会在应用开启和信息加载等重负载场景出现,部分骁龙888机型在2021年夏天采用全局降频的调度,开启应用也无法调用最高频率。而到骁龙8 Gen 1这一代,除 游戏 手机和moto,已经没有国产厂商敢在日常开放最高频率。这是骁龙8 Gen 1旗舰的日常流畅度还赢不了骁龙888直接原因(即便是天玑9000的Redmi K50 Pro也得开性能模式才能冲到最高频,日常流畅度也无法和下面提到的天玑8100拉开差距)

跑分性能和日常性能的巨大差异,让今年 “跑分作弊”的问题愈发明显。跑分白名单是存在多年的设定,锤子手机时期的罗永浩就炮轰过安卓平台的跑分白名单问题:手机遇到跑分软件就疯跑,日常使用却降频卡顿。

但今年骁龙8 Gen 1在跑分和日常调度上的差距之大,确实也是史无前例的,进一步促进了“跑分无用论”,冲击到跑分工具的信任基础:跑分那么高,不还是卡?

三星因跑分作弊被GeekBench除名

但跑分平台才是最着急的那个,着名跑分平台GeekBench多年来一直有声讨跑分白名单的操作,三星、华为、一加、小米都是被炮轰的常客。

大米评测数据

那骁龙8 Gen 1日常调度下有多少性能呢?通过修改跑分工具的APK包名,让GeekBench伪装成普通应用绕开系统白名单,结果除开之前被除名的三星S22系列,小米、iQOO、真我、一加和系列都有明显的性能下降。

调度最保守的小米12 Pro,多核成绩下降12%,是早期骁龙865级别(对的,安卓CPU性能2年涨12%,而且只能在跑分白名单里);单核成绩下降35%,低于中端的骁龙778G。卢伟冰在K50电竞版发布会上说“破芯片”的梗,一定程度也得和严格的温控和频率调节有关。

不过热归热,必须承认骁龙8 Gen 1的GPU性能进步巨大,暴涨50%以上,其GPU能耗比还是高于骁龙888的。这两年来,无论是高通的Adreno,还是三星、联发科等使用ARM公版Mali架构的GPU,都有巨大的性能进步。例如,骁龙888的GPU有35%的提升,然后骁龙8 Gen 1的GPU又提升50%,一举把前两年被苹果A13/A14拉开的差距追了回来。

但遗憾的是,移动平台还没有能完全利用这批GPU性能的重要应用出现,《原神》等主流 游戏 的瓶颈一直都在CPU上,移动GPU的性能却在持续溢出。而GPU规模的增长,让其中低负载的功耗依然可观。在机身只能承载6W功耗的情况下,GPU和GPU“抢功耗”的情况非常明显,加剧了CPU的降频。

面对热情的芯片,手机厂商都不约而同地做出了一致的“联合优化”:降亮度、锁帧、降分辨率。而且这三板斧还从《原神》波及到负载不算高的《王者荣耀》、《和平精英》上,这样是“盛况”同样是 历史 上从未出现过的。

以前也有降低 游戏 渲染分辨率的设定(某GPU Tubro),厂商可以获得发布会上一条条笔直的 游戏 帧率曲线,并能有效降低 游戏 发热。红魔和黑鲨的骁龙8 Gen 1 游戏 旗舰还能对perfdog的帧率曲线进行“补帧”,做到真正的直线,从而让测试工具失去检测实际帧率的效果。

但降分辨率的代价也是显而易见的,顾名思义,就是画面糊了。但惨痛的现实是,厂商后期OTA或用户自行破解画面限制后,发现骁龙8 Gen 1旗舰的 游戏 体验依然赢不了2两年前的骁龙865(类比梗:不明白为什么有的家长会支持禁网络 游戏 ,这样别人不就发现你孩子没出息其实是因为笨了吗)。

现在安卓阵营的情况:好消息是骁龙865还能再战,坏消息也是骁龙865还能再战。形成了“骁龙870倒挂骁龙888,而骁龙888又倒挂骁龙8 Gen 1”的奇景。

联发科这边也出现了倒挂:22年3月刚发布的天玑8100,用着老一代的台积电5nm和老一代的A78架构,展现出 历史 最强的能耗比,在《原神》等大型 游戏 测试中,亲手把天玑9000击败,成为物理意义上的“年度”旗舰。天玑8100:高通870!接受我的挑战吧! 然后骁龙8 Gen 1和天玑9000应声倒下。

两代骁龙的热情原因,大家第一个怀疑的就是三星的5nm和4nm工艺。除了代工骁龙888和骁龙8 Gen 1,三星也用相同的工艺做了同样“火热”的Exynos 2100/2200,并为Google自研的Tensor(唯一搭载双X1超大核的SoC)代工。除了相似的工艺和架构,“热情”就是它们最大的共同点。

半导体的晶体管密度,是衡量工艺先进程度的重要指标。相同情况下,制程越先进,发热越低。芯片能用同等功耗输出更强的性能,或用更低功耗做到相同的性能。

根据Wikichip数据,三星5nm工艺节点的晶体管密度只有126.7MTr/mm2,4nm LPE是145.8MTr/mm2。但台积电上一代的5nm工艺就已经有171.3MTr/mm2,甚至台积电的N7P工艺都有113.9MTr/mm2。制程数字上,大家是齐头并进,但实际晶体管密度却有1到2代的代差。

如果仅仅只有制程的拖累,骁龙8 Gen 1或许不至于这么惨。今年的状况,是三星工艺和ARM新架构的“强强联手”的结果。

今年安卓阵营遇到了ARM推出amrv8十年后的第一次重大指令集更新——armv9。骁龙8 Gen 1、天玑9000、Exynos 2200三大产品都换成了X2+A710+A510架构。除去超大核X2的性能原地踏步,大核A710的能耗比也有较为明显的下降,而最应该提高能耗比的A510小核,只是续接了前代A55小核的能耗曲线,性能更强但功耗也更大,导致芯片低负载功耗也上涨了。

架构升级反而导致实际性能倒退的事情,7年前还发生过一次。那是遥远的2015年。那一年,“火龙”的名号还属于骁龙810。

当年的情况是,苹果在2013年出其不意地发布了首颗64位移动处理器——苹果A7。次年,高通用台积电20nm,在骁龙810上“强行使用”ARM的首个64位架构A57。后面的事情大家都知道了,骁龙808被迫成为“代理旗舰”,主流厂商跳过骁龙810,造成当年部分国产旗舰的断档。那一年也是三星唯一一年,没同时使用骁龙和自家Exynos芯片,那年的Galaxy S6系列和Galaxy Note5都只有Exynos 7420版本。

更雪上加霜的是,armv9架构中的X2和A510不再支持32位APP,国内大量“坚持”32位的落后APP只能在3颗A710大核上运行,造成了“3核有难、5核围观”的窘况。A710大核拉升了CPU的电压,导致性能低,但功耗却不低。

移动智能终端生态联盟4月6日公告

国内还有大量32位APP,甚至国产手机系统中部分自带APP都还是32位的。在骁龙8 Gen 1发布3个月后,OPPO、vivo、小米、应用宝和网络,终于在4月联手宣布不再允许单独上架32位APP,算是从根源上促进了国内APP的64位化。

而作为对比,苹果iOS在2015年就要求App Store内任何应用更新都必须包含64位版本,到2017年的iOS 11就强制禁用了32位应用。回过头来看,ARM为了中国国情,特意在A710上保留32位APP的支持,还真不知道算是好事,还是坏事了。

另外提一嘴ARM公司的插曲,英伟达在2020年9月和软银达成收购ARM的协议,在2022年2月宣布收购失败,随后软银宣布将在2023年推动ARM上市。时间上的“巧合”,让大家调侃ARM新架构不行,是因为“ARM忙着被收购,没心思搞架构”,但ARM公版架构的前景才是更加让人担忧的。ARM为备战IPO准备全球裁员12%-15%,CPU架构被苹果越抛越远,这是内忧。而外患自然是合作伙伴的“叛逃”。

在苹果全平台转向ARM平台的2年间,M1、M1 Pro、M1 Max、M1 Ultra轮番刷新大家对ARM阵营的认知。这和ARM官方架构的颓势形成鲜明对比,并证明ARM指令集也是可以做高性能产品的。而实际上高通也不是成心“挤牙膏”,高通在2021年1月以14亿美元的价格收购了芯片设计公司Nuvia,后者由三位从苹果离职的芯片专家创立。当中的Gerard Williams主持设计了苹果A13和之前的CPU,其也可能参与了A14和M1系列芯片的设计。所以外界普遍猜测,高通将会回到全自研架构。

PS:高通骁龙在2007开始就是自研架构,在2016年的骁龙835放弃了自研架构,开始以ARM公版架构为基础做魔改。而三星Exynos则是在2016年的Exynos 8890开始用自研的猫鼬大核架构,坚持到2020年的Exynos 990(第五代猫鼬M5),在2021年重归ARM公版怀抱。

2017年之前,国产旗舰的最大优点就是良心顶级+骁龙芯片。而这两年,国产旗舰的最大遗憾成了芯片。芯片好的手机不一定好,但芯片差的手机绝对差。任你屏幕、续航、充电、相机的外围堆料配置有多强,只要芯片差,那就是短板在漏水的木桶。

普罗大众从未如此深刻地体会到SoC芯片对手机的重要性。大家习惯了SoC是会不断进步(最起码不至于会倒退)。正如网友所说:2017年的骁龙835那会,按照处理器买手机的人,在网上被喷得一无是处。而到了2022年,所有人都按照处理器型号来买手机。

“安迪比尔定律”从未失效,新芯片提供的性能都会被新的软件吃掉。就算这两年安卓平台的CPU性能原地踏步,甚至有所倒退的情况下,国内软件也从未停止“前进的脚步”。QQ都已经内置虚幻引擎成为真正的“国产3A大作”,微信、淘宝们也从未停止新增“趣味”功能的脚步。而比“老旗舰因新版APP而变慢”更惨的是“新旗舰流畅度还赢不了老旗舰”。

“当苹果拿2个M1 Max合在一起,并给显示器上A13的时候,华为只能从仓库里找1年半前切割好的芯片,一次一次的屏蔽下去以苟延残喘”。

华为受到禁令影响,麒麟9000成为绝唱,这是不幸,但这个时机却是不幸中的万幸。华为遇上了安卓阵营“丢失的2年”:麒麟9000用了非常争气的A77架构,它后面就是骁龙888用的X1和挤牙膏用的A78架构,再过了一年是骁龙8 Gen 1上的X2+A710+A510。

而鸿蒙起步时的Android 10,同样是瓶颈前的一代。随后的Android 11和Android 12,其他国产系统可是吃了不少苦头。而和华为的运气形成鲜明对比的是魅族:联发科遇上了最好的魅族,魅族错过了最好的联发科。

放大到行业层面,2020到2022是国产旗舰冲高端的关键时间。华为让出高端空间的2年,国产旗舰进步巨大,大家用上了2K屏幕、充电以倍数秒杀苹果和三星、国产系统白花齐放、甚至拍照水平都已经不把iPhone放在眼内(当然,视频还是iPhone最强)。可以说,国产厂商把能把握的东西都准备好了,但结果遇上了2021年的骁龙888和今年的骁龙8 Gen 1。

我们看到的是海思在最风光最强盛的时候“被急流勇退”,我们心中的海思只有可惜,但绝不算可怜。以致网友调侃“高通这公司能处,麒麟被制裁它是真的会等,也真会激励发哥变强”,大家还以为是高通在帮华为拖住其他安卓厂商。而苹果看着安卓阵营内斗,库克含泪收割高端市场。

Counterpoint数据

在三星已成摆设的国内市场,只有苹果一个物理对手,其他品牌接不住华为放出的高端市场,这是个值得中国人铭记的耻辱:2021年,中国高端手机占比(售价>600美元),从2020年的44.6%下降到36.5%,全部安卓加起来都赢不了iPhone。截止4月6日,作为这批国产旗舰的门面,小米12系列首月销量是前代的41%。这里有疫情的影响,但芯片要背负多少责任?就得由大家自行判断了。

同样讽刺的是,拥有华为以前渠道的荣耀,以极高的速度崛起。从荣耀50到荣耀60,从Magic3到Magic4,产品力上是能感知到荣耀被耽搁的大半年的。但和其他旗舰一样用骁龙芯片的荣耀,用销量向我们证明,单纯的产品力在绝对的渠道力量面前其实是挺无力的。这样的事实,又何尝不是扇在产品经理脸上的响亮耳光。余承东说华为会在明年强势回归,我们也很好奇,那时候的荣耀,会什么样的身份出现?

手机市场每隔几年就会有“江郎才尽、已经看到天花板”的说法。2017年的小米MIX开启了全面屏时代,为智能手机续命2年;华为带起来的大底传感器和长焦镜头军备竞赛,又为国产旗舰提供了3年的发展期。

而现在的手机市场和国内A股一样茫然,大家看不到未来的路。A股只有上下两个走向,而且总该会看到底部,但国产手机却越发迷茫。几乎被穷尽的外观设计、进入瓶颈期的屏幕、充电和拍照、轮不到国产厂商控制的SoC,都在提醒我们,手机厂商貌似也没找到下一个发展方向。但此时此刻,唯一能确定的是,下一个风口不是折叠屏。

雷峰网雷峰网雷峰网

G. Android性能测试(内存、cpu、fps、流量、GPU、电量)——adb篇

3)查看进程列表:adb shell "ps",同时也能获取到应用的UID,方式如下(不需root权限):

u0_a开头的都是Android的应用进程,Android的应用的UID是从10000开始,到19999结束,可以在Process.java中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),u0_a后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值,所以,对于截图这个应用进程,它是u0_a155,按前面的规制,它的UID就是155 + FIRST_APPLICATION_UID = 10155。

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

使用 adb shell "mpsys meminfo -s <pakagename | pid>"命令,输出结果分以下4部分:

PS:在apk内调用运行获取其他app的内存数据则需要root权限

adb命令:adb shell mpsys gfxinfo <package | pid>

正常情况下帧率应该在16.67ms左右,1秒60帧,执行结果如下:

详细计算方法如下:

还有一个命令是: adb shell mpsys SurfaceFlinger --latency LayerName

其中LayerName在各个不同系统中获取的命令是不一样的
在Android 6系统直接就是SurfaceView
在Android 7系统中可以通过 mpsys window windows | grep mSurface | grep SurfaceView 然后通过数据截取到
在Android 8系统中可以通过 mpsys SurfaceFlinger | grep android包名获取到

执行命令结果如下:

计算方法比较简单,一般打印出来的数据是129行(部分机型打印两次257行,但是第一部分是无效数据,取后半部分),取len-2的第一列数据为end_time,取len-128的第一列数据为start_time
fps = 127/((end_time - start_time) / 1000000.0)
至于为啥要取第一列数据,这里不做过多介绍,欢迎参看这两篇文章
老罗的文章SurfaceView原理
Android性能测试之fps获取
至于为啥要处于1000000,因为命令打印出来的是纳秒单位,要转为毫秒进行计算,127就是因为命令一次打印出来127帧的数据而已

有两种方法可以获取
1) adb shell "top -n 5 | grep <package | pid>" ,第三列就是实时监控的CPU占用率(-n 指定执行次数,不需root权限),这边top命令执行需要2到3s左右,一般可以采用busybox 的top命令执行,效率会快很多

2) adb shell "mpsys cpuinfo | grep <package | pid>"
两种方法直接区别在于,top是持续监控状态,而mpsys cpuinfo获取的实时CPU占用率数据

adb命令:adb shell "mpsys batterystats < package | pid>" (Android 5.0后引入)
获取单个应用的耗电量信息,具体返回结果待研究

adb命令:adb shell "mpsys battery"
出现信息解读:
AC powered:false 是否连接AC(电源)充电线
USB powered:true 是否连接USB(PC或笔记本USB插口)充电
Wireless powered:false 是否使用了无线电源
status: 1 电池状态,2为充电状态,其他为非充电状态
level:58 电量(%)
scale: 100. 电量最大数值
voltage: 3977 当前电压(mV)
current now: -335232. 当前电流(mA)
temperature:355 电池温度,单位为0.1摄氏度

adb 命令:adb shell "mpsys< package | pid> | grep UID" [通过ps命令,获取app的UID(安装后唯一且固定)]
adb shell cat /proc/uid_stat/UID/tcp_rcv [cat为查看命令,读取tcp_rcv获取应用接收流量信息(设备重启后清零)]
adb shell cat /proc/uid_stat/UID/tcp_snd [cat为查看命令,读取tcp_snd获取应用发送流量信息(设备重启后清零)]
计算流量消耗步骤:

或者还有一种方式获取应用流量消耗:

首先判断类型:
cat /sys/class/thermal/thermal_zone*/type

只有红框框出来的是有效的
cat /sys/class/thermal/thermal_zone*/temp
获取CPU温度

mpsys battery | grep temperature 单位0.1摄氏度

获取/proc/stat文件内容(无权限限制)

总的cpu时间片是 total = user+nice+system+idle+iowait+irq+softirq
忙碌时间为 notidle = user+nice+system +iowait+irq+softirq
cpu使用率计算方法为,先取开始的total值和忙碌时间notidle,隔一段时间片,再取一次计算total2,notidle2, cpuuse = (notidle2 – notidle) * 100 / (total2 - total)%

PS:由于Android 8权限收紧,在Android 8系统手机内apk内读取文件内容为空,需要shell权限才可获取文件内容,下同

读/sys/devices/system/cpu/cpuX/cpufreq/scaling_cur_freq文件的值,X不定,看是几核手机,scaling_cur_freq是否存在也不一定,需要判断

至于为啥不取cpuinfo_cur_freq文件的值,原因是android 6,7系统获取的时候,这个文件shell没有读取权限,需要root权限

参考文章: https://blog.csdn.net/long_meng/article/details/45934899

Android 6,7系统可执行
mpsys window windows | grep "mCurrentFocus"

执行结果一般为类似:
mCurrentFocus=Window{81caaa5 u0 com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity}
按照一定规则把com.tencent.mobileqq提取出来即可

直接apk内读取文件即可,不需要shell权限(支持到Android8)
Gpu使用率获取:会得到两个值,(前一个/后一个)*100%=使用率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy

Gpu工作频率:
adb shell cat /sys/class/kgsl/kgsl-3d0/gpuclk
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq

Gpu最大、最小工作频率:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/min_freq

Gpu可用频率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies

Gpu可用工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_governors

Gpu当前工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/governor

H. Android应用查看CPU与内存占用说明

命令中的"应用包名"应该替换为你需要查询的包名.
执行命令后, 在输出的内容中, 第二项即应用的进程名, 例如:

那么 22411 即为该应用当前的pid.

其中的"应用的pid"为上一步获取到的pid
执行命令后, 命令行工具即会打印应用运行信息

命令中的"应用包名"应该替换为你需要查询的包名.
命令执行后过段时间即会打印内存占用大小.

I. 安卓手机CPU频率怎么看怎么检查查看

安卓手机CPU频率怎么查看呢?在这篇指南中,将为大家介绍一下具体的操作步骤。

阅读全文

与androidcpu时间相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:962
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:142
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:732
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:484
h3c光纤全工半全工设置命令 浏览:141
公司法pdf下载 浏览:381
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:349
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:890
app转账是什么 浏览:163