android profiler 简书,(三)Android 性能优化 Network Profiler

小酌鸡汤

读书不觉已春深,一寸光阴一寸金。

为什么应分析应用的网络活动?

当您的应用向网络发出请求时,设备必须使用高功耗的移动或 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)来吧,一起预览一下吧:

cfb65dd056ee

profiler概览

(4)点击NETWORK分类栏,就可以进入到network profiler详情页:

cfb65dd056ee

network-profiler详情页

窗口详细说明:

窗口1:性能分类切换按钮,包括:cpu、memeory、network、energy。

窗口2:页面调整按钮集合,包括:缩小,放大、重置、暂停、开始等。

窗口3:事件时间轴,显示Activity的生命周期不同状态,用户交互事件,如点击,旋转等。

窗口4:网络计数图例:

Receiving:接收到的数据包大小

Sending:发送的数据包大小

Connections:网络请求类型计数(同一个链接多次请求,按1计数)

窗口5:网络图形化显示窗格。

(5)随时查看网络通信情况(在时间轴上拖动以选择要查看的区域):

cfb65dd056ee

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界面如下:

cfb65dd056ee

网络优化模拟界面

(三)现在操练起来吧……

小编的扩展链接

参考链接

采菊东篱下,悠然见南山

cfb65dd056ee

举手之劳,赞有余香! ❤ 比心 ❤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值