读书不觉已春深,一寸光阴一寸金。
为什么应分析应用的网络活动?
当您的应用向网络发出请求时,设备必须使用高功耗的移动或 WLAN 无线装置来收发数据包。无线装置不仅要消耗电力来传输数据,而且还要消耗额外的电力来开启并且不锁定屏幕。
使用网络性能剖析器,您可以查找频繁出现的短时网络活动峰值,这些峰值意味着,您的应用要求经常开启无线装置,或要求无线装置长时间不锁定屏幕以处理集中出现的大量短时请求。这种模式说明您可以通过批量处理网络请求,减少必须开启无线装置来发送或接收数据的次数,从而优化应用,改善电池性能。这种方式还能让无线装置切换到低功耗模式,延长批量处理请求之间的间隔时间,节省电量。
为什么要用 network profiler?
network profiler可以在时间轴上显示实时网络活动,显示发送和接收的数据,以及当前连接的数量。这让您可以检查应用程序如何和何时传输数据,并适当地优化底层代码。
network profiler有哪些缺陷和不足?
目前Network Profiler 仅支持 HttpURLConnection 和 OkHttp 网络连接库。
如果您使用的是 HttpURLConnectionAPI,则不会在分析器的 Request 标签页中看到标头,除非您使用 setRequestProperty 方法将其添加到您的代码中。
如果网络性能剖析器检测到流量值,但无法识别任何受支持的网络请求,您会收到以下错误消息:
**Network Profiling Data Unavailable:** There is no information for the
network traffic you've selected.
请求失败不会有对应的信息显示
现在,就一起实操体验profiler吧!
(1)profiler实操环境(可选项,用自己的环境和代码也一样)
SamplePop环境如下:
Android Studio 4.0
Gradle version 6.1.1
Android API version 30
(2)打开profiler
profiler打开位置:View -> Tool Windows -> Profiler
当然也可以直接运行程序并启用profiler监控:Run -> Profiler
(3)来吧,一起预览一下吧:
profiler概览
(4)点击NETWORK分类栏,就可以进入到network profiler详情页:
network-profiler详情页
窗口详细说明:
窗口1:性能分类切换按钮,包括:cpu、memeory、network、energy。
窗口2:页面调整按钮集合,包括:缩小,放大、重置、暂停、开始等。
窗口3:事件时间轴,显示Activity的生命周期不同状态,用户交互事件,如点击,旋转等。
窗口4:网络计数图例:
Receiving:接收到的数据包大小
Sending:发送的数据包大小
Connections:网络请求类型计数(同一个链接多次请求,按1计数)
窗口5:网络图形化显示窗格。
(5)随时查看网络通信情况(在时间轴上拖动以选择要查看的区域):
network-profiler选取片段查看
对各个窗口进行说明:
1.事件时间轴:可以拖动选择想分析的数据部分。
2.数据展示类别:
Connection View:列出了在时间轴上选定时段内从您应用的所有 CPU 线程发送或接收的文件。对于每个请求,您可以检查大小、类型、状态和传输时长。 您可以通过点击任意列标题来对此列表排序。您还会看到时间轴上选定时段的明细数据,从而了解每个文件的发送或接收时间。
Thread View:显示您应用的每个 CPU 线程的网络活动。您可以在此视图中检查应用的哪些线程负责每个网络请求。
3.网络通信列表信息:网络请求的总耗时 = 橙色线条(请求) 和 蓝色线条(返回)。
4.具体某个网络通信详细信息:请求信息,反馈信息,调用堆栈等等。
(六)SamplePop示例代码:
(一)模拟Get请求,先看下代码:
public class NetworkProfilerActivity extends AppCompatActivity {
private static final String TAG = "NetworkProfilerActivity";
private static final int MESSAGE_TYPE_GET = 1;
SafeHandler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_network_profiler);
mHandler = new SafeHandler(this);
public void onNetworkMonitorGet(View view) {
Log.d(TAG, "onNetworkMonitorGet: ");
new Thread(networkGet).start();
private static class SafeHandler extends Handler {
private WeakReference reference;
public SafeHandler(Activity activity) {
super(activity.getMainLooper());
reference = new WeakReference<>(activity);
@Override
public void handleMessage(@NonNull Message msg) {
Log.d(TAG, "SafeHandler handleMessage: " + msg.what);
Activity activity = reference.get();
if (null != activity) {
Log.d(TAG, "SafeHandler handleMessage: do work!");
switch (msg.what) {
case MESSAGE_TYPE_GET:
String getInfo = (String) msg.obj;
((TextView) activity.findViewById(R.id.network_get_result)).setText(getInfo);
break;
default:
break;
Runnable networkGet = new Runnable() {
@Override
public void run() {
String getResult = get();
Log.d(TAG, "networkGet run: getResult = " + getResult);
Message message = Message.obtain();
message.what = MESSAGE_TYPE_GET;
message.obj = getResult;
mHandler.sendMessage(message);
private String get() {
String message = "";
try {
URL url = new URL("https://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept-Encoding", "identity");
connection.setConnectTimeout(10 * 1000);
connection.connect();
InputStream inputStream = connection.getInputStream();
byte[] data = new byte[1024];
StringBuffer sb = new StringBuffer();
int length = 0;
while ((length = inputStream.read(data)) != -1) {
String s = new String(data, Charset.forName("utf-8"));
sb.append(s);
message = sb.toString();
inputStream.close();
connection.disconnect();
} catch (Exception e) {
Log.e(TAG, "get: ", e);
return message;
(二)NetworkProfilerActivity界面如下:
网络优化模拟界面
(三)现在操练起来吧……
小编的扩展链接
采菊东篱下,悠然见南山
举手之劳,赞有余香! ❤ 比心 ❤
小酌鸡汤读书不觉已春深,一寸光阴一寸金。为什么应分析应用的网络活动?当您的应用向网络发出请求时,设备必须使用高功耗的移动或 WLAN 无线装置来收发数据包。无线装置不仅要消耗电力来传输数据,而且还要消耗额外的电力来开启并且不锁定屏幕。使用网络性能剖析器,您可以查找频繁出现的短时网络活动峰值,这些峰值意味着,您的应用要求经常开启无线装置,或要求无线装置长时间不锁定屏幕以处理集中出现的大量短时请求。这...
Android
Profiler
分为
三
大模块: cpu、内存 、网络。基本的使用在上一篇文章有讲到。这里详细说一下。cpu分析器CPU
Profiler
CPU分析器可帮助您实时检查应用程序的CPU使用情况和线程活动,并记录方法跟踪,以便您可以优化和调试应用程序的代码。要打开CPU
Profiler
,请按照下列步骤操作:
点击 View > Tool Windows >
Android
Profile
涨姿势:利用
Android
Studio自带的
Network
Profiler
来查看网络请求的请求和响应内容
官网链接:https://developer.
android
.com/studio/profile/
network
-
profiler
base on
Android
Studio 3.5.2 (3.0之后的版本就有了)
效果图...
Android
studio的分析工具分为:CPU、Memory、
NetWork
、Energy.
CPU
Profiler
:
从
Android
profiler
面板选择指定设备和应用程序进入到CPU
Profiler
界面,我们能够直观的看到CPU的使用情况和线程的情况.
分别介绍下相关标号的CPU
Profiler
的相关功能:
1. 事件时间轴:表示当前分析的应用程序随着用户交互在不同活动的变化...
DEX文件编译比较花费时间。这在OTA或者工厂首次烧入程序后非常明显。
可以在BoardConfig.mk文件中使能编译预优化,在编译时将会为APK/jar做Dex优化(dex2oat):
WITH_DEXPREOPT := true
如果完全的编译预优化,则system.img的大小将会增加500MB。由于ASLR特性,预优化的DEX文件将被转化并拷贝到data分区,所以
关于
性能优化
的问题,可能一直有遇到,也一直在解决,但是在中小厂和自我要求一般的场景下,我们很少去实实在在的做
性能优化
;
在开发中我时不时点一点
Profiler
, 一直没去细究,但近期想继续提升一下自己 ~
故此,我抽时间对
Android
Studio 内的
Profiler
总结心得(OS:在看过 官网 对Proiler的文档,我都在怀疑有没有记录此篇Blog的必要,不过最终还是动笔了,当二次自省吧 ~)
基础了解CPU分析内存分析网络分析能耗分析
Profiler
性能分析工具,包含以下.
确保您拥有最新版本的 Mirror。
如果您还没有,请成为 GitHub 赞助商。
访问 Mirror
Network
ing Discord。在信息频道中,您将学习如何加入 github_sponsors 频道。
在 github_sponsors 频道中,固定消息将指导您如何下载分析器。
在您的项目中安装unity package。
Android
Studio
Profiler
中确实没有专门针对网络的模块,但可以通过其他模块来观察应用程序的网络行为。其中,CPU、内存和磁盘 I/O 模块可以帮助您确定应用程序中的网络问题。
此外,您还可以使用
Android
Device Monitor 工具来监视设备的网络流量。在
Android
Studio 中,可以通过选择 "View" 菜单中的 "Tool Windows" 选项来访问它。然后,在 "
Android
" 中选择 "
Android
Device Monitor"。
在
Android
Device Monitor 中,选择您要监视的设备,然后单击 "Start" 按钮。然后,选择 "
Network
" 选项卡,即可查看设备的网络流量。