MacBook Pro 2016 充电功率

前两天服役一年多的洋垃圾 Dell TB15 挂掉了, 表现是只能充电, 提示 usb 设备耗电过多被禁用.

查了几个拓展坞都在价格承受范围之外(流下了穷人的眼泪), 最后决定再买个电源配合之前买的华为 MateDock 用.
参考了充电头网 Macbook的好搭档 60~65W USB PD充电器推荐, 最后选择了网易智造的65W充电器.

测试结果如下:

充电器(标称功率) 充电线 系统详情功率 显示充电器详情
原装 (87W) 原装线 86W Y
原装 (87W) 微软 Dock 线 60W Y
网易智造 (65W) 原装线 65W N
网易智造 (65W) 微软 Dock 线 60W N
Dell TB15 (180W电源) - 58W N
原装 (87W) 原装线 -> 华为 MateDock 51W N

##结论

  • Dell TB15 供电 58W 使用一年多没有过供电不足的情况, 58W 在中等压力下其实已经够用.
  • 网易智造65W 充电器 + 微软 Dock 线 够用/实惠.
  • 华为 MateDock 外接显示器长时间使用温度 60+℃.
  • 充电功率与 充电器 和 充电线 都有关系.

电信阿里鱼卡 UC 免流原理

上个月和电信客服扯皮两周多终于把手机套餐改成了阿里鱼卡套餐。
从 59RMB (500MB+100分钟通话) 的高端套餐改成了 19RMB(1GB+100分钟+日租+阿里文娱应用免流) 低端套餐。
实在要吐槽一下电信改套餐的规定。改套餐明明一个电话或者App戳戳就能搞定事情,偏偏让你回归属地营业厅跑一趟。虽然最后手持身份证拍照异地受理了但体验实在是不好。

鱼卡UC浏览器免流大体实现是这样的

抓包

Wireshark抓包
注意这段 Proxy-Authorization: 1|15120022766*******|com.ucweb.iphone.lowversion|ca5fe4b11712e10ba745c2817*******
关于 Proxy-Authorization 见 https://developer.mozilla.org
即UC浏览器的请求都经过代理服务器。
对比几次请求可以发现 1|UID|UA|Key 这几段猜测规律

  • 1 不变
  • UID 标示用户ID
  • UA 浏览器UA
  • Key 由网站Host计算,应该是md5

反编译

反编译 Android 客户端,基本验证各字段的意义
UC浏览器拼接Proxy-Authorization

而 bcX 和 bcW 的获取过程断点获得调用栈如下

在浏览器激活免流的时候会获取相关字段(不清楚是否会定时更新)
请求 https://freeflow.uc.cn/freeflow/generatePhoneToken 获取一段密文,解密之后解析赋值给 bcX bcW
当开始网络请求时由对应 UID|Key|Host 计算 md5

获取Host

计算MD5

拼接Proxy-Authorization

密文解密之后的结构体

上面需要的 UID UA KEY Server Port都在里面

所以

SSL Pinning 还是必须的。

Android Method Trace 生成与解析

Android Studio 3.0 中的 Profiler 工具相比 2.0 版本有了很大的进步,这几天翻了下相关的源码记录如下.

生成 trace 文件

官方的文档里对于生成 trace 文件主要有两种

code

第一种是在代码中添加

1
2
3
4
5
// start tracing to "/sdcard/calc.trace"
Debug.startMethodTracing("calc");
// ...
// stop tracing
Debug.stopMethodTracing();

生成的trace文件

ddmlib

第二种是使用 ddms / Android Monitor 手动生成, ddms 的核心是一个叫 ddmlib 的库, 在 Android SDK 里 tools/lib/ddmlib-*.jar 可以找到.
网上关于 ddmlib 的文章不多, 可以参考一下. 隐藏Boss——ddmlib使用入门通过 ddmlib 使用 adb,构建框架基础库

命令行工具

翻着源码掉了 N 次坑写了一个命令行调用的 jar AndroidMethodTraceRunner
命令行中调用 $ java -jar mtr.jar -p com.your.package -o output.trace -t 10 可以 trace 10 秒钟, 运行需要 java8.
主要的两个坑:
AndroidDebugBridge.init(true); false 的话不能获取到 client
必须关闭 ddms 和 Studio 的 monitor / profiler, 否则会抢占 client 造成连接失败.

对于 ddmlib 有几个大体的概念
bridge - adb
device - 设备
client - 应用

主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//bridge
//**注意**, 生成 trace 需要连接 client, init(false) 会断开 client
AndroidDebugBridge.init(true);
AndroidDebugBridge bridge = AndroidDebugBridge.createBridge();
//device
IDevice[] devices = bridge.getDevices();
IDevice device = devices[0];
//client
Client client = device.getClient(packageName);
//start stop
client.startSamplingProfiler(10, TimeUnit.MILLISECONDS);
client.stopSamplingProfiler();

Android Studio

但是 Android Studio 3.0 中并没有使用 ddmlib
大体调用栈如下:

1
2
3
4
5
6
7
8
9
10
11
./idea/profilers-ui/src/com/android/tools/profilers/cpu/CpuProfilerStageView.java: myStage.startCapturing();
startCapturing
./tools/adt/idea/profilers/src/com/android/tools/profilers/cpu/CpuProfilerStage.java
com.android.tools.profilers.cpu.CpuProfilerStage#startCapturing
./tools/base/profiler/native/perfd/cpu/cpu_service.cc
grpc::Status CpuServiceImpl::StartProfilingApp
./tools/base/profiler/native/perfd/cpu/simpleperf_manager.cc
bool SimplePerfManager::StartProfiling

解析/读取 trace

GUI

ddms 或者 Android Studio 2.0 / Intellij IDEA 可以直接打开 trace 文件, 但是都没有 Android Studio 3.0 的 profiler 直观好用.

android-studio-3.0-profile)

android-studio-traceview

monitor

dmtracedump

todo

命令行工具

todo