11
8
2018
4

与 Android 进行 WLAN Direct 连接

首先 iw list 看是否支持。如果支持,那就

iw dev wlan0 interface add p2p0 type __p2pdev

这样其实并不会多出一个叫 p2p0 的网络接口。iw dev 能看到多了个「Unnamed/non-netdev」设备。不执行这个也可以连接上 WLAN Direct,但是当前的 managed Wi-Fi 连接会断掉。执行之后再连接,managed 连接会持续,iw dev 里会有两个 Unnamed,不知道何故。另外这个 type __p2pdev 加上去了我就不知道怎么删除了。试了几个命令,结果搞得内核 oops 了……

然后是 wpa_supplicant 配置文件:

ctrl_interface=/run/wpa_supplicant_p2p
ap_scan=1

device_name=起一个名字
device_type=1-0050F204-1

driver_param=use_p2p_group_interface=1

wpa_supplicant 跑起来。注意这里的接口名还是那个 managed 接口的。

wpa_supplicant -i wlan0 -c p2p_config.conf

然后 wpa_cli 连过去操作:

wpa_cli -p /run/wpa_supplicant_p2p

首先用 p2p_find 开启搜索。这时候对端设备能够看到自己了。使用 p2p_connect 对端MAC pdc go_intent=0 连接,在对端接受连接即可。go_intent=0 是让对方作为 group owner,这样对端 Android 才会提供 DHCP 服务(否则要本地提供了)。

然后就可以给自己添加 IP 地址了。此时是可以用 dhcpcd 的,然而直接跑的话它会抢走默认路由,所以知道地址范围之后手动加一个好了:

ip a add 192.168.49.22/24 dev p2p-wlan0-1

Android 设备的地址是 192.168.49.1。

之后就可以用 adb connect 然后 scrcpy 了。

PS: Android 很喜欢四十几的 IP 段呢。USB 网络共享是 192.168.42.129/24,Wi-Fi 网络共享是 192.168.43.1/24,而 WLAN Direct 是 192.168.49.1/24。不知道蓝牙网络共享是多少呢。

PPS: scrcpy 在我的 XZ2C 上运行完美,但是在 MIUI 10 上是「只读模式」,只能看,所有交互操作无效。

参考资料

Category: 网络 | Tags: linux 网络 Android
8
4
2018
21

XZ2C: 没有 root 的日子(也还过得去)

现在手机两三年不换新,日子就没法过了!所以我明知没有 root 还是买了 Sony Xperia XZ2 Compact(XZ2C),用于替换之前使用的 Z5C。

嗯,还是 Compact 版本。尤其是尝试在地铁上操作小米 Note 3,结果发现为了避免自己跌倒或者手机被摔地上,我不得不使用嘴唇来点击部分区域的时候,我决定绝不放弃能够安稳地握紧的 Compact 版本了。

啊,我知道有单手模式的!XZ2C 底部那三个虚拟键的位置,向左或右滑,就可以启动了,很方便!然而,最需要此功能的小米 Note 3,使用的是实体触摸按键,中间还是个凹下去的指纹识别,我很难成功启动单手模式。而且由于手机过大,这个动作操作的时候,手只能握住手机的下半部分,重心还是悬在外边,列车适时地颠一下说不定就会脱手而出了。

XZ2C 比 Z5C 重了很多,背面还是弧面的,手感意外地很棒呢。指纹识别在背部,拿在手里的时候倒是很好按,也不会有小米那握不稳的问题。不过你们懂的,放桌面上的时候,不拿起来就按不了。而且双击唤醒屏幕被禁用了(除非已抬起手机,屏幕已显示时间),密码解锁也并不方便。双击唤醒大概还是可以启用的吧,不过 Z5C 拿在手里走路的时候,屏幕经常被会意外点亮不说,还会一不小心就把锁屏时钟给换了样式。所以就不用啦。

这指纹解锁速度比起 Z5C 的侧面那个小的,快了非常多。而且可以配上很好看动画效果啊!就是 Sony 宣传片里的那种,不过它竟然不仅仅是在主屏幕上呈现,在任何应用打开的时候也能出现呢。

哦还有,XZ2C 充电、看视频时都不会像 Z5C 那样烫了~

系统是 Android 8 Oreo。最棒的莫过于通知管理了!之前我一直希望某些不重要的通知出现,但是不要发出声音(比如微信的「加好友」通知),但是只能寄希望于应用本身提供这种设置。现在不用啦,系统通知管理可以直接设置了。而且应用还可以给通知分门别类,然后用户按需要给不同类别的通知不同的设置(比如 Telegram 就能精确到会话)。在通知出现的时候,长按选择「所有类别」打开设置的时候,对应的类别也会闪动一下,不用用户去猜这是哪个类别的通知。

其次是应用图标的长按功能,可以查应用信息,可以访问应用提供的快捷入口,也可以把这些入口添加到主屏幕,或者添加该应用的小部件。而且应用信息里可以直接打开 Google Play 了!我之前都只好去搜索应用名的。在 YouTube 上看到有人直接把应用图标拖到一个控件上就能打开商店,然而我并不知道那是什么应用。

还有很重要的一点是:运行很流畅!不只是我以前新手机刚到手的那种流畅,而且装个应用一两秒、开机启动完了我还没反应过来,超出了预期好多!当然并不是说开机刷一下子就完了,而是我没想到 Android 的开机能有这么快。

啊,最后进入正题:没有 root,只能找替代了。

首先是权限管理。Android O 的权限管理已经强大了不少,而且我已经把大部分国内应用转移到小米上了,所以还好吧。

时间显示秒。这个功能,在「系统界面调谐器」里已经有选项了。长按下拉通知出现的齿轮图标,直接它转动起来,然后就可以在「设置」里看到「系统界面调谐器」了。

互联网访问。放弃修补好的 fqrouter,发现现在的主流软件其实也挺不错的。只是偶尔需要手动切换节点了。另外就是 SSRR 这个东西,连接上的时候如果切换节点,有大概率导致网络故障(DNS 解析异常等)。需要重启手机才可解决。

绿色守护。被黑阈取代了。但我发现其实需要黑阈掉的应用也不多。我目前添加到黑阈名单里的有微信、彩云天气、企业微信、Inoreader、形色、高德地图等,基本上都是国产应用。微信一大堆服务在后台跑着,虽然支持 FCM(GCM 升级版),被黑阈干掉之后会收不到新消息(而 Telegram 和 Twitter 什么的好像都能)。

Wi-Fi adb。这个其实开机后接 USB 线,adb tcpip 5555 一下,就可以一直通过网络连接了。黑阈等需要通过 adb 执行命令的应用,也可以自行调用。

「去你大爷的内置浏览器」。现在火狐支持 Custom Tabs 了呢,所以大部分应用都能够调用火狐了。虽然 Custom Tabs 里是不加载扩展的,不过再选择在火狐中打开就可以了,大部分内容都缓存了,再加载一遍也是挺快的。Inoreader 有「webview」、「chrome tab」和「外置浏览器」三种方案,其中「chrome tab」其实就是「Custome Tabs」。Google 自家的大部分应用也会使用「Custom Tabs」,除了「Google 搜索」仍然坚持调用 Chrome,不过它可以设置为在外置浏览器中打开。「新闻与天气」也需要设置为在外置浏览器中打开,不然因为没加载扩展,会有大量广告辣眼睛的。微信当然是无解的,只能在需要时浪费些流量和时间手动选择在浏览器里再开一次了。

五笔输入法。这个之所以和 root 权限有关,是因为之前我都是拿 XPrivacy 禁用输入法的联网能力,所以什么百度啊触宝啊,我都能接受。现在没法断它网了,我自然是不会再用不开源又非系统自带的输入法了,尤其是触宝这种,一联网立马弹出好几个广告的。一开始找到叫「五笔输入法」的试验品。功能很简洁,但不愧是试验品,不能输入中文标点也就算了,一次输入英文还不能超过四个字母……然后想起 trime——rime 在 Android 平台上的版本。使用感受是:我从未经历过如此简单的码表导入!把我的 fcitx 码表导出,然后一行命令调整一下格式就可以了!然后把码表和五笔输入方案推到内部存储设备上,「部署」一下,我终于可以在手机上使用我自己的码表了!

ssh、备份和调试。这个没办法。通过 termux 能很方便地启动个 sshd,但是权限很有限,比如只能只读访问外置 SD 卡。所以我通过 adb 起了一个 dropbear 来同步这些内容。系统分区没办法访问,只能依靠 Google 和 Sony 的在线备份功能了。

啊对了,Sony 的「Xperia 换机助手」真是垃圾啊。首先,很多应用不能带数据迁移。其次,我这里一次传输只能传一项内容!不然就会出现连接错误。好不容易在论坛上找到的方案,一次只传少量数据,所以短信和通讯录什么的都可以过来,小一些的应用也能过来。大的应用就没办法了。

还有些小功能。通话振动。这也是个 Xposed 模块,就是电话接通的时候振动一下。属于锦上添花的功能,没了就没了吧……还有 Xposed Torch 也是。不能长按音量键开手电筒,那就划开通知点按钮好了。微X模块,很好用,但也不是非要不可。

整理下来,因为没有 root 而失去的功能并不是很多,最严重的是没有完整、增量的备份了。其它的,相对于运行流畅所带来的体验提升,其实并没有那么重要。这次我真的是换了手机才知道旧手机已经全面卡顿了……

Category: Android | Tags: Android 手机 SONY
4
6
2018
16

小米 Note 3 令人失望地方

小米 Note 3 入手的时候简单写过一篇文章。现在用了一些天了,有些新的体会,也是我最不满意的地方。

双摄像头看上去很厉害,但是照片大小只有1-2MB,不像我的 Z5C 一样有5-6MB。为什么呢? 在手机上,因为小米相册放大倍数有限,根本看不出来差别。但是传输到电脑上之后可以很明显地看出差别:

小米 vss Z5C

从图中可以看到,小米拍摄的照片(左)不仅比我的 Z5C 的(右)分辨率要低,而且有偏色、模糊不清(照片拍摄的是 Paperlike HD 的 Floyd 模式,所以那些沙粒一样的效果是本来就那样的;背景色有点偏绿也是肉眼所见之状态)。

这意味着,用于记录的时候,比如拍摄白板、幻灯片、小区通知,习惯了 Z5C 之后,用小米很可能在需要的时候才发现根本看不清(我已经有好几张记录用的照片现在才发现基本上是毁了)。

小米摄像头另外有一个大问题:在光照很强的时候(比如晴天室外),摄像头会有反光,在照片中呈现出一个偏绿色的亮点

摄像头反光亮点

之前已经提到过,这扬声器的设计挑握持姿势,很讨厌很讨厌:我左手握持的时候,为了保证手机不在遇到碰撞不稳等情况的时候意外滑落,我会用小指托住底边,刚好堵住扬声器的孔……

小米云同步能是能同步,但是很不及时。一般情况下,我 Z5C 拍好照片过一会儿,就可以在 Google Photos 上看到照片了。小米不知道怎么回事,经常看不到照片,需要手动打开相册然后等一会儿才会有。

啊对了,小米右上角那个天气,也是要点开才会更新的样子……

Category: Android | Tags: Android 小米 手机
3
24
2018
23

小米 Note 3 入手体验

为了对付诸如支付宝、淘宝、摩拜等在我的 Z5C 上特别卡的手机软件,我入手了一台小米 Note 3。

最初的感觉是:很滑,手感很不错。下面指纹识别很方便。

有点大,单手不容易按到对面。因为下巴上都是按键,所以放桌面边缘时不容易拿起来,会误触那些键。不过作为备机,在家的时候放桌面上就好了,解锁直接按,不需要经常拿起来。

没有拍照键,但是可以设置音量当快门用。有快速启动,但是是在系统设置的「手势及快速启动」中配置的。另外有个「街拍模式」,就是拿着手机,长按快捷键开始连拍或者摄像,而屏幕没有任何显示。

拍照默认带水印,可以在选项里关掉。前置摄像头拍照时默认带美颜(i.e. 别当镜子用)。还带了性别和年龄检测,以及我没太搞懂的「魔镜」评分功能。

云存储会存储原始品质的照片,免费空间只有5G,不像 Google 是 10G,并且可以无限量存储高品质照片。黑屏的时候似乎并不会同步照片,反正我等了好久,在网页端没看到。等再次打开相册时,它告诉我正在同步呢。

自带手电筒功能,可配置成亮屏后长按菜单键启动。不能像我那个 Xposed 模块那样,直接从黑屏状态启动。不过也没多大差别。

音质好不好不清楚,反正是够响。不过扬声器位于下边缘右边,手挡到的话会非常影响音质。我用过的 Z5C、Z3C、LT26i 上均没有发现这种事情,倒是我第一个智能手机 E15i 是这样,扬声器在背面,听歌时得俯卧着。

充电很快。剩余一半多的电,开始充电时 5.7V 0.9A,后来到了 6.6V 0.7A。不过使用小米充电器,我的Z5C更快,系统显示充电电流为 1.9A。我原来的充电器给 Z5C 充电时只有 0.9A 的,快了一倍。不过发生了一件令人悲伤的事情——忘记取下我的USB电流电压测量仪,它工作太久,累坏了……

SIM 卡槽需要使用配备的捅针去捅出来。不过需要的时候,最好同时配备一只汉子,或者女汉子,因为真的要用很大力,偏偏捅针就一个圈,细细的,底端也是面积极小的边缘,皮肤不够糙的话很难使上劲。当然也可以想办法,比如把针插好,然后对着桌面使劲磕几下,卡槽就会出来个边了。这体验比起 Z5C 用指甲一剥即开的体验,是有趣不少。

不插SIM卡无法安装未知来源的应用(apk 文件),也不知道这是什么鬼逻辑。小米商店里的东西还比较多的,条码扫描器、Elixir 2、Telegram 都有。HE 的 Network Tools 没有,不过可以去百度那边搜到。Google 应用说是因为授权问题没有,会提供位于百度上的版本。我没试过能不能安装,反正安装了也用不了……

默认浏览器默认为MIUI自己的浏览器,如要更改,需要去「设置」->「更多应用」->右上角菜单「默认应用设置」里修改,不会像 Android 原生系统那样让用户自行选择,也不能通过默认浏览器应用信息里的「取消默认操作」来重置。

主页是类似于 iOS 的:没有下边的「所有应用」界面,只有混杂在一起的应用图标和小部件。最让人受不了的是,应用图标被加了个半径非常大的圆角矩形,还带个白底

顶栏默认不显示通知图标。这样也好,因为放一天之后我一看,近十条没什么用的通知呢……可以设置显示网速,不过不知道是下行速率还是总和。可惜不能显示时间显示秒数。

总体来说,功能挺丰富,但是有些混乱,界限不清。比如两种设置快捷键的途径(相机内、设置内,其实 Android 系统原生快捷键比如截屏也是可以用的,但是设置里是没有的),比如两种设置默认应用的方法。比如到处都是的推广。应用商店里几乎搜任何东西都能看到知乎,搜 Network Tools 能看到 RealCalc。「游戏」应用里竟然有「直播」。建立个放应用的文件夹都能给你推荐应用。说得好听点,叫「紧密集成」,说不好听,就叫「高耦合」。

哦对了,这机器需要保持干燥。也就是说,我洗澡时想听歌还是得带上我的 Z5C。

2018年04月06日更新:续篇《小米 Note 3 令人失望的地方》

Category: Android | Tags: Android 手机 小米
1
5
2017
17

我使用的 Xposed 模块

开始使用 Xposed 之后,我对我的手机又多了一份拥有感,然后呢,装的模块越来越多了。以下是我正在使用的模块的列表,以及我为什么使用它们。链接我就懒得放了,想要安装的读者可以自己去 Xposed Installer 里搜。

绿色守护。装上这个我才敢装各种国产应用。它的 Xposed 模块用于功能增强,最重要的一点是,它可以切断唤醒途径。这样就不会总也杀不死那些耗电又耗流量的应用们了。

去你大爷的内置浏览器。我发现 Android 6 里,好多 Google 家的应用都开始默认使用内置浏览器了呢……不过国外的应用一般都是可以选择在内置浏览器里打开,还是外部浏览器里打开的。我更喜欢在外置浏览器里打开,一来减少相同的缓存和数据文件,节约存储空间,因为缓存共享而加快加载速度,二来能够使用自己的配置(比如广告拦截),并且能够使用最新的浏览器特性。上次听说了一个很棒的浏览器特性来着,然后就有人告诉我微信里不支持……当然了,微信这种应用,为它的内置浏览器增加了接口,有些网页必须在它里边打开。所以这个模块是有白名单的。

微信防撤回模块。顾名思义啦。

Android通话振动。Android 4.0.4 有一个很贴心的功能:在拨出电话接通时,它可以振动一下,告诉用户已经接通了。所以就不用一直把电话放在耳边等着啦,有时候等着等着,因为某些原因呼叫终止了还傻傻地等着……不知道为什么,后来的版本就没有这个功能了。还好我们有 Xposed。这个模块不仅把接通时振动给加回来了,还可以挂断时振动,以及如果对话费敏感的话,可以定时振动。

App Settings。目前我用来强制QQ轻聊版出现在最近使用的应用列表中。以后还可能需要强制某些中文翻译拙劣的应用使用英文语言。

Battery Stats Plus。这是一个同名应用带的模块。用于电池使用统计。

Xposed Torch。不需要解锁屏幕然后点来点去的手电筒。在锁屏状态下长按音量上键就可以启动了,再按一下音量下就关闭了。方便好用~

XPrivacy。权限管理。也是使用国产应用时必备的功能。虽然 Android 6 里,很多权限都像 iOS 那样在运行的时候询问了。但是呢,流氓总有流氓的手段,你要拒绝授权?那好,一切功能免谈,你卸载我吧。

XuiMod。我用来让右上角的时间显示秒数的。

哇已经装了九个模块了呢。其实我是不希望用这么多 Xposed 模块的,毕竟是打补丁嘛。可是呢,毕竟不是自由软件,只能这样了。也幸好我们还能打补丁。

Category: Android | Tags: Android Xposed
1
2
2017
6

在 Android 上运行 sshd

新的 Z5C 到手。拿 root 装软件。然后发现一个很重要的事情:我之前在 Z3C + Android 4.4.4 上用得好好的 Rooted SSH/SFTP Daemon,在登录的时候报了这么个错:

CANNOT LINK EXECUTABLE: "/system/lib/libc++.so" is 32-bit instead of 64-bit
page record for 0xXXXXXXXXXX was not found (block_size=32)

网上搜了一下,解决方法是有的,要重新编译 dropbear。可我之前研究过,我这软件使用的 dropbear 是一个修改版,和我用的这个 app 一样,好久没更新了……

于是想找个新的 sshd。之前我是使用的 SSHDroid。后来它需要付费版才能使用密钥认证了……而我的要求就两点:可以以 root 身份登录,并且支持密钥认证。在 Play 商店里能找到的 sshd 我都试过了一遍,竟然没一个能满足这么基本的需求的…………

之所以需要以 root 身份登录,而不是登录之后再获取 root,是因为跑命令时 su 之后很容易出现奇怪的问题,和缓冲、终端控制有关。

于是我只好失望地放弃使用 app,转到自己熟悉的领域——Linux 系统,编译一个 sshd adb 进去跑好了。

一开始使用的是 socat + tinyssh 的方案。这个方案我之前在光猫上实现过,tinyssh 的代码很少,很容易编译和修改。socat 直接用之前编译的版本就可以了。因为 Android 毕竟不是完整的 Linux userland,所以得把 tinyssh 改一改,主要是用户主目录和默认 shell 的部分。我就直接硬编码进 root 的配置了。然后写个 shell 脚本来启动:

#!/system/bin/sh

export ANDROID_ROOT=/system ANDROID_DATA=/data
PATH=/system/xbin:/su/xbin:/su/bin:/sbin:/vendor/bin:/system/sbin:/system/bin
socat tcp-l:PORT,reuseaddr,fork exec:'tinysshd /data/tinyssh/keydir' &

这样就可以了。只支持 Ed25519 密钥登录,挺好的。

然而,用着用着就发现有点小问题:socat 对经由网络的数据进行转发,有点低效;tinyssh 不支持连接复用,在一个会话中收到新的连接请求时会直接退出;还没有 scp 命令……

一开始我去 dropbear 那边编译了一个 scp。编辑好配置文件、开始 make 的时候,敲「make PROGRAMS=scp」就可以编译出一个 scp 命令了。然后我就想,既然都用上 dropbear 了,要不就都用了吧。于是把 dropbear 也编译出来了。不是很顺利,主要是以下几个事:

  • 改路径。各种路径,host key 的,pid 文件的,默认 PATH,还要禁用掉 lastlog 和 syslog 什么的
  • 改用户信息。默认 shell、主目录。不要检查 /etc/shells。刚刚发现我还不小心把其中两行代码交换了,是说怎么退出的时候会段错误呢 _(:з」∠)_
  • dropbear 的构建系统不支持 out-of-tree 构建,也就是不能像我习惯的那样,「mkdir build-android」然后进去「../configure」 :-(

另外就是,dropbear 不支持 Ed25519 key,于是我只好用 RSA key 了(DSS 有问题;openssh 的 ECDSA 实现也有问题) :-(

弄好之后同样写个 shell 脚本方便调用:

#!/system/bin/sh

export ANDROID_ROOT=/system ANDROID_DATA=/data
/system/xbin/dropbear -R -p PORT

然后,启动服务的事情。我发现改 /init.rc 不管用。这个是 initramfs,每次重启之后就恢复原状了……我懒得去重新打 initamfs 的包了,就每次重启系统之后接上 USB 线,然后 adb shell 进去跑脚本……还好 Z5C 跟 Z3C 不一样,USB 口在外边,很好插。

终于把 remote root shell 弄好了,接下来就是各种 rsync 和 scp 传文件改配置什么的了,一是复制各种软件的配置文件和数据,二是备份,三是把文件拿电脑上研究、编辑,方便啊!Sony 有个「换机助手」软件,但是它不能在加密了的手机上使用……

最后,还留下了一个问题:同样的环境,同样是 Wi-Fi 传输,我的电脑和 Z3C 之间传输速度能达到 4MiB/s,但是 Z5C 却只有 300KiB/s 左右的样子……

Category: Android | Tags: ssh Android 交叉编译
6
7
2015
18

Linux 系统接收通过蓝牙传输的文件

首先安装 bluez 包。我用的版本是 5.30。其次安装 blueman。

启动蓝牙服务:

systemctl start bluetooth.service

然后使用 blueman-manager 之类的命令启动 blueman。这时会在系统托盘看到蓝牙图标。点右键选择「添加新设备…」,完成配对。

然后,如果是要往手机发文件的话,是没有问题的,但是收的话,会失败。原因是,默认接收文件前会先询问用户要不要接收,而 blueman 不知道怎么搞的根本没反应……

解决方案是:直接启动一个默认接收文件的 obexd 就好了:

killall obexd
/usr/lib/bluetooth/obexd -r tmpfs -n -a

-r指定收到的文件存哪里,默认是 $XDG_CACHE_DIR 下的 obexd 目录,即默认是 ~/.cache/obexd。这里的路径是相对于用户主目录的。

-n是不要以守护模式运行,会把日志输出到终端而不是系统日志。

-a就是重点——接收所有文件——了。

obex 这套东西的文档在/usr/share/doc/bluez/dbus-apis/下有。

Linux 下遇到点问题还真是折腾,声称完成某一功能的软件一大堆,结果装好了,要么根本不知道怎么用(gnome-bluetooth、bluedevil),要么适用版本不匹配(obexpushd、ArchWiki 等网上的过时信息),要么有 bug 用不了(blueman)。

不过好的一点是,不涉及闭源的软件和协议,而又有足够的时间和能力的话,问题总是能够解决的。不像 Windows 或者 Android,遇到问题两眼一摸黑,只能不断地重试和重装,看看人品会不会爆发一下。

最后,折腾好久终于传输成功的照片:

雨后彩虹

北京好不容易下了场大雨,没想到雨后还出现了彩虹~

Category: Linux | Tags: linux Android 蓝牙
3
27
2014
7

火狐远程调试初体验

开始啦

首先要启用远程调试功能。在桌面端火狐里按快捷键Ctrl-Shift-K调用开发者工具,点左上角的「设置」按钮,勾选「启用远程调试」。移动端火狐也通过「设置」页启用远程调试。

启用远程调试

设置端口转发。使用 USB 连接并且在 Android 设备上启用了 adb 的话,可以使用如下命令来转发:

adb forward tcp:6000 tcp:6000

我使用 Wi-Fi 网络连接。因为移动端火狐只监听了 127.0.0.1 这个地址,所以外边连不上去。我使用 socat 命令来转发一下。我编译的 Android 版 socat 程序可在这边下载

socat tcp-listen:6000,fork,bind=192.168.1.XXX,reuseaddr tcp:127.0.0.1:6000

桌面端在「Web 开发者」菜单里选择「连接…」,然后填入移动端的 IP 地址。如果使用 adb 进行端口转发的话使用默认的「localhost」就可以了。

连接到远程设备

开始连接之后,被连接的火狐(这里即移动设备上那个)会弹窗询问是否允许。确认之后就可以看到远程设备的标签页以及 chrome 页面(即截图里那个「主进程」)了。

选择连接到的标签页

然后就跳出来一个新的开发者工具窗口了。我这里选择的是火狐自己那个 chrome 页面(「主进程」):

调试移动端火狐

大家可以看到,我在 Android 上的火狐上也安装了 Adblock Plus 哦~

小惊喜

桌面端火狐启用远程调试chrome 调试后,可以在「Web 开发者」菜单里看到「浏览器工具箱」这么一项。它会开启一个-P参数为default-chrome-debugger-chrome参数为chrome://browser/content/devtools/framework/toolbox-process-window.xul的新火狐实例,通过远程调试接口连接到当前火狐实例上,实现对火狐顶层 chrome 窗口的调试。不过直接执行在 htop 里看到的命令并不能开启调试器,大概是因为这时候需要被调试的火狐不知道有人要调试它吧。虽然火狐自带的开发者工具功能比较弱,不过能对顶层 chrome 窗口进行调试还是很不错的 :-)

参考资料

Category: 火狐 | Tags: 火狐 Android
3
8
2014
9

编译 Android 版 htop

编译完 lsof,却发现 htop 还是不能用……另开一个终端 strace 之,才知它竟然在调用 /bin/sh 而不是 /system/bin/sh。检查之,原来这个 htop 来自 Terminal IDE,是一个静态链接的版本,大概是使用 glibc 的吧,所以才会去标准位置寻找命令解释器。

编译过程:

path+=/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin
mkdir android-build && cd android-build
CFLAGS='-I/ldata/media/temp/android/installed_binaries/include/ncurses -I/ldata/media/temp/android/installed_binaries/include' LDFLAGS=-L/ldata/media/temp/android/installed_binaries/lib CC='arm-linux-androideabi-gcc --sysroot=/opt/android-ndk/platforms/android-18/arch-arm' ../configure --host=arm-linux-gnu --prefix=/system --bindir=/system/xbin --disable-unicode
rm ../config.h

然后修改当前目录中的 config.h 文件,注释掉 HAVE_NATIVE_AFFINITY 行,添加两个 syscall 的定义,即:

// #define HAVE_NATIVE_AFFINITY 1
#define SYS_ioprio_get __NR_ioprio_get
#define SYS_ioprio_set __NR_ioprio_set

继续 make 即可。

编译好的 htop 可由此下载

Category: Android | Tags: Android 交叉编译
3
8
2014
3

编译 Android 版 lsof

Android 自带的那个 lsof 实际上是 toolbox 里的,功能十分单一,除了显示出所有进程的所有打开的文件外就什么都不能做,连说明也没有 :-( 于是为了 htop 用着爽一点,还是自己编译一个吧。

首先弄个 GNU 工具链。Android NDK 的没有 tcp.h 头文件,会报 TCP_LISTEN 等标识符未定义。

  • 我使用 crosstool-NG 1.19.0 编译的 gcc 4.8.1。适用于 Arch Linux x86_64。第一次编译工具链,没想到在 crosstool-NG 的帮助下一次就编译好了,所以是未作静态链接的版本,其它版本的 Linux 可能无法运行。
  • zshaolin 使用的工具链 gcc 4.4.6。它是使用 crosstool-NG 1.13.2 编译的。

编译过程。使用了静态链接,最终文件大小 741K。

path+=/ldata/txtfiles/soft/arm-lilydjwg-linux-gnueabi/bin
LSOF_CC=arm-lilydjwg-linux-gnueabi-gcc LSOF_CFGF='-DHAS_STRFTIME -DHASNORPC_H -DGLIBCV' LSOF_VERS=3.0.8 ./Configure -n linux
make
arm-lilydjwg-linux-gnueabi-gcc -o lsof -static dfile.o dmnt.o dnode.o dproc.o dsock.o dstore.o arg.o main.o misc.o node.o print.o proc.o store.o usage.o util.o -L./lib -llsof
arm-lilydjwg-linux-gnueabi-strip lsof

编译好的 lsof 可由此下载

Category: Android | Tags: Android 交叉编译

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com