macOS Catalina(10.15.5)用蓝牙PAN共享Wi-Fi上网

今天有需要共享上网进行抓包分析报文的情况。

研究了一下MacBook Pro(macOS Catalina(10.15.5))如何通过蓝牙PAN(Bluetooth PAN)来共享笔记本连接的Wi-Fi网络出来,让手机通过共享出来的蓝牙热点来上网的方法。

由于蓝牙PAN(Bluetooth PAN)本质属于局域网转发,起到一个简单网关的作用。因此我们需要设置蓝牙设备的IP地址跟需要共享的Wi-Fi网卡相同。

具体操作如下:

继续阅读macOS Catalina(10.15.5)用蓝牙PAN共享Wi-Fi上网

利用Ubuntu 18.04恢复群晖(Synology)NAS Raid1(DSM 6.x)硬盘数据

如果 Synology NAS 出现故障,则可以使用计算机和 Ubuntu live CD 轻松恢复其硬盘上存储的数据。确保 Synology NAS 硬盘上运行的文件系统是 EXT4 或 Btrfs,然后按照以下步骤恢复数据。此处我们以 Ubuntu 18.04 版本为例。

继续阅读利用Ubuntu 18.04恢复群晖(Synology)NAS Raid1(DSM 6.x)硬盘数据

在Android Studio 4.X下查看窗口布局层次Hierarchy Viewer/Layout Inspector

在Android开发的时候,又是需要检查窗口布局层次,观察布局是否显示正确。

早期版本是使用Hierarchy Viewer ,最新的Android Studio 4.X下,我们使用 Layout Inspector,具体操作参考下图:

继续阅读在Android Studio 4.X下查看窗口布局层次Hierarchy Viewer/Layout Inspector

屏幕旋转的适配问题以及遇到的一些坑

在手机APP开发的时候,一般默认会适配竖屏,游戏开发除外。但是在Android平板电脑开发中,屏幕旋转的问题比较退出,可以这样说,平板电脑的最初用意就是横屏使用的,比较方便,用户会经常旋转我们的屏幕。

这里主要针对平板开发中的一些问题做一些总结。

1. 防止屏幕旋转之后,Activity的销毁问题

为了适配屏幕,Activity默认在屏幕旋转之后会销毁并且重建,但是这种情况会造成用户输入数据的丢失(需要开发者手动去保存和恢复,会带来一定的工作量),Activity毕竟是重量级的组件,它的销毁和重建会使得性能的下降,因此我们需要防止Activity的销毁和重建。

做法

在清单文件中为Activity添加一些配置,configChanges属性添加orientation|screenSize:

通过上述的配置可以防止Activity的销毁和重建。

注意:这里的 screenSize 经常被我们遗漏。一般我们都是设置 orientation , 当屏幕方向改变的时候不要重新创建。那么 screenSize 什么时候发生呢? 目前最常见的就是 系统导航方式 变化的时候,目前Android手机支持 手势导航 / 屏幕内三键导航 两种模式。这两种模式的不同就是在屏幕底部是否出现 Back/ Home / Menu。这样导致应用的显示高度发生变化,从而触发 screenSize

注意,辅助功能 里的 无障碍 模式下 导航模式 会被切换到 屏幕内三键导航 模式,从而引起窗口的重新绘制。

2. View屏幕旋转适配

除了制作横屏和竖屏两份布局文件的方法之外,如果我们的View是动态添加到Window的,屏幕旋转之后,我们的界面以及View需要做一些变动以适应屏幕。

我们可以复写Activity的onConfigurationChanged方法,并且在里面修改一些东西。

这里举个例子,如说我们的ListView右边有一个字母索引控件,这个控件是直接new出来并且是直接覆盖在ListView上面的。当屏幕旋转之后,这个字母索引控件的位置需要刷新(重新布局以及绘制)。因为这个控件是在我们的ListView的右侧,并且竖直方向居中。这时候我们就需要动态获取屏幕上的ListView的宽高,然后才能计算出字母控件应该布局的位置。

但是这里我们会遇到一些坑

直接通过View的getWidth方法或者先measure然后通过getMeasuredWidth方法获取到的宽都是错误的,获取到的是屏幕旋转之前的值,如下面的代码所示。但是我需要的是ListView实时的宽高值,这时候我们只能手动去计算。例如我们要获取ListView的高度,那么我们可以先拿到Window的总高度,然后减去状态栏、Toolbar的高度来获取(这里只是一个例子,具体做法需要具体分析)。

屏幕旋转的不确定性问题

最近又遇到屏幕旋转相关的新的问题,因此记录下来。我们知道,在Activity、View、Fragment等旋转的时候,如果你在清单文件中配置不重新创建的话,就会调用onConfigurationChanged方法。

但是问题来了,这个问题有一些不确定性因素,比如说当你的页面或者View被遮挡住(Stop)的时候就不会回调onConfigurationChanged这个方法。这比较略坑,会带来一些UI的偶发性问题。

解决办法就是我们自定义一个广播接受者专门用来接受onConfigurationChanged这个广播,这样子就可以确保,无论什么情况下,系统ConfigurationChanged的时候你的代码都会被执行。

自定义的ConfigurationChangeReceiver如下,这里提供一个静态方法方便注册。

接下类在Activity或者Fragment中的正确位置注册(onAttachedToWindow、onDetachedFromWindow):

记得反注册,防止内存泄漏哦。

参考链接


屏幕旋转的适配问题以及遇到的一些坑

alien:.deb与.rpm包转换工具

deb 与 rpm 是GNU/Linux 流行的软件包格式。我们“alien”可以在rpm\dpkg\slackware tgz\deb\slp 格式见进行转换。

Debian/Ubuntu 可使用下面命令安装alien:

从RPM转到DEB

举例:假设在目录/tmp 有myprogram.rpm 文件,使用下面命令转换:

这时,在/tmp 目录下就会发现有 myprogram.deb ,这时就可以使用dpkg安装:

继续阅读alien:.deb与.rpm包转换工具

Android默认调试签名证书

今天遇到了需要手工用调试签名重新签名APK文件的一个需求。

Android默认调试签名证书位置

Windows:

macOS Catalina:

证书密码 :android

签名脚本:

参考链接


使用mitmproxy + python做拦截代理

本文是一个较为完整的 mitmproxy 教程,侧重于介绍如何开发拦截脚本,帮助读者能够快速得到一个自定义的代理工具。

本文假设读者有基本的 python 知识,且已经安装好了一个 python 3 开发环境。如果你对 nodejs 的熟悉程度大于对 python,可移步到 anyproxy,anyproxy 的功能与 mitmproxy 基本一致,但使用 js 编写定制脚本。除此之外我就不知道有什么其他类似的工具了,如果你知道,欢迎评论告诉我。

本文基于 mitmproxy v4,当前版本号为 v4.0.1

继续阅读使用mitmproxy + python做拦截代理

Cannot resolve symbol KeyEventCompat(android.support.v4.view.KeyEventCompat找不到)

今天我把support版本升到了28.0.0  发现V4包  下的KeyEventCompat 类找不到了

com.android.support:appcompat-v4:28.0.0

那是因为KeyEventCompat类被取消了 hasNoModifiers() 方法已经被KeyEvent实现了

修改为:

参考链接