标签 Android 下的文章

一个只有自己在用的新闻阅读器,终于改为使用OkHttp发起请求了。原来一直用Volley,但是改用OkHttp之后,做更多的请求定制,为后面添加更多功能做准备。记录一下一些知识点:

首先是Android官方教程,关于执行网络操作的部分。有教授使用HttpsURLConnection链接网络的方法。
Android官方教程 - 连接到网络
https://developer.android.com/training/basics/network-ops/connecting

然后是主线程不能发起网络请求的问题。主要是为了提高程序的性能,把不占用CPU的IO操作(例如网络请求)都移到子线程执行。网络请求执行结束后,调用runOnUiThread方法回到主线程更新UI。
Android 子线程更新UI了解吗?
https://juejin.im/post/5da14e8ae51d45782b0c1c20

最后是OkHttp的教程。其异步请求,用起来有点像jQuery的ajax方法。
1)okhttp代码
https://github.com/square/okhttp
2)OkHttp使用完全教程
https://www.jianshu.com/p/ca8a982a116b

本来一直在用Scrcpy,一个把手机屏幕显示在电脑屏幕的软件。作为一般的操作,可以接受。但是滑动太快,或者玩游戏,会出现马赛克。直到前几天发现了QtScrcpy,据称可以“吃鸡”!今晚终于在Lubuntu上编译出来,玩了下Minecraft,也看了下视频,非常不错~虽然已经在公司用了多天来划水。

详细的介绍,请查看项目的官方介绍。项目地址:https://github.com/barry-ran/QtScrcpy

应用场景:把手机屏幕的内容显示在电脑屏幕,支持 Windows、MAC、Linux 三大系统(其中 Linux 需要自己编译)。可以实现公司电脑上无痕划水(自备无限流量套餐、迷你蓝牙耳机,效果更佳),或者找个烂电脑作为手机伴侣(实现小屏转大屏)。

优点:
1)速度快! 720p可以玩游戏,1080p可以看电影。

2)有熄屏功能。手机画面投影在电脑上,手机屏幕同时可以关掉。

3)有功能完整的操作界面,基本的功能按钮都有,免得打命令。手机的输入可以直接用鼠标和键盘操作(跟 Scrcpy 一样)。

缺点:
1)输入法不能通过键盘选字、不能直接输入符号(这个缺点直接继承 Scrcpy )。直接用蓝牙键盘连手机的话,输入体验会好很多。

2)Linux上需要自己编译。装QtCreator、Android SDK、Android NDK……由于网络的问题,下载相关软件时折腾了一下。编译挺简单的,对于第一次接触QtCreator的我来说,一次编辑成功。对于没有编程经验的人来说,会有难度。但是这种人一般不会使用Linux。另外,QtCreator最好从 https://download.qt.io/archive/qt/ 下载安装包进行安装。

3)窗口模式不能随意调整大小(Scrcpy是可以的),只能固定大小,或者全屏。

4)手机声音不能通过电脑播放。不知道是不是我没找到设置的地方,所以需要配个蓝牙耳机。

在家使用还是有点浪费资源,毕竟要开两个机器来做一件事件。除了玩Minecraft PE,暂时想不到有什么应用场景。但是在公司划水的话,非常实用。

从G1时代开始,就了解到因为Android使用Linux内核,可以利用chroot运行大量Linux发行版。但是由于当时ARM CPU性能低下及内存不足,一般只能使用Terminal字符界面,或者ssh过去。然后升级过设备,并装上了“XServer XSDL”(Android上的Xserver)用来体验图形界面,但是手机屏幕太小,一弹出虚拟键盘就基本把桌面挡住了。后来想起X Window是基于客户端/服务器模式的,应该可以用PC电脑之类提供Xserver,显示手机上的Linux图形界面。最后终于弄明白了配置,出来的效果还是不错,至少可以用浏览器流畅播放视频了。

所需设备
S机,用于提供X Server的设备,最好是屏幕比较大的PC电脑(台式机或笔记本)。系统最好是Linux,装上X11。后来发现Windows也可以,因为有Xming。当然,Android也是可以,因为有XServer XSDL。这里只记录Linux的。

A机,Android设备(手机或平板),运行Linux发行版的X Client。Android上有很多装Linux的应用了,这里推荐Linux Deploy,因为这是github.com上的开源项目。装Linux的步骤不详述,这个应用已经做得很好了。

网络设置
只要两个设备在同一局域网内就可以了。下面列出几种方式:
1)使用有线/无线路由器组建局域网。路由器是性能瓶颈,特别是A机无线连接到路由。
2)A机分享无线网络,S机连过去。缺点是只能利用A机的移动网络上网,费钱……
3)S机分享无线网络,A机连过去。S机需要装个无线网卡,并成为性能瓶颈。
4)A机开启开发者模式,通过USB线连接S机。S机利用ADB命令的forward功能映射端口。ADB命令成为性能瓶颈。
5)A机分享有线网络,通过USB线连接S机。这个方案性能最佳,且使用设备最小,又不影响A机的网络。但A机可能会出现发热的情况。

X Server设置
这一步花了很多时间。理解后就是S机上的一个命令和一个配置文件,即如何启动X Server和设置验证。相关原理可查Google,这里设置X Server为:1.0(从0开始算,第2个服务),默认使用6001端口。
1)利用xhost设置可访问X Server的客户端IP。在S机上修改配置文件/etc/X1.hosts,若不存在则新建。把A机的IP地址填进去,并保存。
2)运行以下命令启动X Server:

sudo Xorg :1.0 -listen tcp

X Client设置
A机上需要装好桌面环境。推荐LXDE吧,轻量。启动前,连好网络,在Linux Deploy上设置:

图形界面 -> 勾选启用
图形子系统 -> 选X11
图形界面设置 -> 显示编号 -> 1.0
           -> X服务器地址 -> 填写S机的IP地址
           -> XServer XSDL -> 不要勾选
桌面环境 -> 选LXDE

然后启动Linux即可(实在太方便了)。对应的命令就是:

export DISPLAY=S机_IP:1.0
startlxde

总结
A机的性能越好,并且S机的性能越差,这个方案的实用性就越高。比起微软的“Continue on PC”,三星的DeX,Superbook等方案,便宜很多,并把旧电脑利用起来。使用过程中,不会影响A机的来电、通知等日常用途。但是目前来看,实用性确实不高。后面看看能不能用Raspberry Pi Zero + 显示屏 + 大容量移动电源来作为S机,以提高便携性。

通过一晚的测试与实验,终于用YUMI,把Android-x86 4.4.2 RC2装到U盘上,并且启动成功。记录一下吧:

1)打开YUMI并选择U盘,Step 2选“Try Unlisted ISO (via SYSLINUX)”,Step 3选ISO文件,如“android-x86-4.4-RC2.iso”。然后就等待YUMI自动处理完成。

2)进入刚弄好的U盘,找到文件 X:\multiboot\android-x86-4.4-RC2\isolinux\isolinux.cfg 并用编辑器打开。修改 kernel 和 initrd 的路径前缀为 /multiboot/android-x86-4.4-RC2 。具体修改后的文件内容如下:

default vesamenu.c32
timeout 600

menu background android-x86.png
menu title Android-x86 Live & Installation CD 4.4-RC2 
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffff00 #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ffffff00 #ff000000
menu color hotkey 7 #ffffff00 #00000000

label livem
    menu label Live CD - ^Run Android-x86 without installation
    kernel /multiboot/android-x86-4.4-RC2/kernel
    append initrd=/multiboot/android-x86-4.4-RC2/initrd.img root=/dev/ram0 androidboot.hardware=android_x86 video=-16 quiet SRC= DATA=

label vesa
    menu label Live CD - ^VESA mode
    kernel /multiboot/android-x86-4.4-RC2/kernel
    append initrd=/multiboot/android-x86-4.4-RC2/initrd.img root=/dev/ram0 androidboot.hardware=android_x86 video=-16 quiet nomodeset vga=788 SRC= DATA=

label debug
    menu label Live CD - ^Debug mode
    kernel /multiboot/android-x86-4.4-RC2/kernel
    append initrd=/multiboot/android-x86-4.4-RC2/initrd.img root=/dev/ram0 androidboot.hardware=android_x86 video=-16 vga=788 DEBUG=2 SRC= DATA=

label install
    menu label Installation - ^Install Android-x86 to harddisk
    kernel /multiboot/android-x86-4.4-RC2/kernel
    append initrd=/multiboot/android-x86-4.4-RC2/initrd.img root=/dev/ram0 androidboot.hardware=android_x86 video=-16 INSTALL=1 DEBUG=

PS. Android-x86项目越来越完善了,非常适合上网本安装。但要注意驱动的问题,特别是无线网卡!

在G1时代,入手了蓝牙耳机之后,就一直想把蓝牙耳机当成无线快门来用。虽然很屌丝,但是很实在的一个功能,特别是当年还一个人到处乱逛。

这几天终于启动这个项目。一开始的想法,肯定是参考一些音乐播放软件,利用BroadcastReceiver接受蓝牙耳机的按键事件,再广播一个Camera按键事件,实现从蓝牙的“播放键”到相机的“快门”的动作转换。但是,静态注册了BroadcastReceiver后,不起作用,怀疑是受其它音乐播放软件的影响,但也查不到原因。

后来灵机一动,想起直接修改Android的按键影射文件,把“播放键”直接改成“快门键”。于是修改 /system/usr/keylayout/AVRCP.kl 文件,把 key 200 MEDIA_PLAY WAKE 中的 MEDIA_PLAY 替换成 CAMERA。连上蓝牙后,测试通过,但还有个问题,就是相机不会先自动对焦后拍照,而是直接就拍照。然后就是写个Shell脚本(主要是sed命令吧)来自动修改影射文件。再然后就是写个app来实现这个功能了。当然,这是后话,希望不会成为屁话……

后面还有个想法,通过老G1来自动拍照,上传到服务器,实现监控功能。好吧~继续努力~

忘了当初是什么时候,为了在G1上运行脚本(或动态语言),发现了SL4A,记得那个时候还是叫做ASE。然后又发现了Beanshell这个运行Java语言的脚本环境,貌似挺好玩,于是在G1上都装上了,但是运行不了,弹出ClassNotFoundException。该问题一直解决不了,只好作罢。现在换上Nexus S后,前几天又找出这东西来玩,问题依然。今天找了一下,终于解决了!简单来说,就是权限问题。具体过程如下:

1)安装 SL4A 。先到该项目官方网站 http://code.google.com/p/android-scripting/ 下载当前最新版 sl4a_r4.apk ,并安装到手机或模拟器上。

2)安装Beanshell for Android。可以到SL4A官方网站下载当前最新版 beanshell_for_android_r2.apk ,安装到手机货模拟器上。或者运行SL4A,依次点击 菜单键(menu) -> View -> Interpreters -> 菜单键(menu) -> Add -> BeanShell ,就会自动下载 Beanshell 了。

3)打开 BeanShell ,点 Install 。安装完成后,就会在SL4A中看到 hello_world.bsh 脚本文件。

4)打开 SL4A ,运行  hello_world.bsh 脚本文件,就会看到报错。大概说找不到 /mnt/sdcard/com.googlecode.bshforandroid/extras/bsh/bsh-2.0b4-dx.jar 。

解决办法1:
进入Android的Shell环境(例如:超级终端、ConnectBot等),运行以下命令:
su
dalvikvm -classpath /mnt/sdcard/com.googlecode.bshforandroid/extras/bsh/bsh-2.0b4-dx.jar bsh.Interprefer

就可以进入BeanShell环境了。很明显,在root权限下运行,无视了一切权限问题。当然,这不是我们想要的。

解决办法2,也就是真正的解决办法:
手机上找到 /mnt/sdcard/com.googlecode.bshforandroid/extras/bsh/bsh-2.0b4-dx.jar 。打开 bsh-2.0b4-dx.jar ,解压 classes.dex 文件到 /data/dalvik-cache 下,并重命名为 mnt@sdcard@com.googlecode.bshforandroid@extras@bsh@bsh-2.0b4-dx.jar@classes.dex 。更改该文件的权限为 rw-r--r-- ,更改Owner为 1000 (即system),更改Group为 1000 (即system) 或 2000 (即shell) 或 与SL4A相同的Group。这样就可以了。测试发现最重要修改文件权限和Owner。

昨天终于在CentOS 5.4上把G1的USB Tethering(USB共享)搞定了。花了两个星期都处理不了的问题,其实就是驱动问题。去找了个驱动装一下就解决了。只需要执行一下以下脚本即可:

wget http://downloads.sourceforge.net/synce/usb-rndis-lite-0.11.tar.gz
tar zxf usb-rndis-lite-0.11.tar.gz
cd usb-rndis-lite-0.11/
make
./clean.sh
make install

执行前,最好现把以下文件备份一下,以防有什么问题:

/lib/modules/2.6.18-164.el5/kernel/drivers/usb/net/cdc_ether.ko
/lib/modules/2.6.18-164.el5/kernel/drivers/usb/net/rndis_host.ko
/lib/modules/2.6.18-164.el5/kernel/drivers/usb/net/usbnet.ko

G1用USB数据线接到电脑上,开启USB Tethering后,执行ifconfig -a就可以看到多了一个rndis0接口了。再执行一下脚本即可利用G1上网:

dhcp rndis0
ifconfig rndis0 up

如果只是想让G1与电脑处于同一局域网内,不执行上面的语句,而执行以下脚本:

ifconfig rndis0 192.168.77.100 netmask 255.255.255.0
ifconfig rndis0 up

其中IP地址的设置,可以先查看G1的usb0的IP地址,如192.168.77.254,再选一个同一网段的IP地址,如192.168.77.100。

参考的网页如下:

本来想在G1上装个WiFi密码破解软件。但是启动Debian失败,于是搞了几天,才发现启动脚本有问题。过程中找到相关文章,可以自己编译一个ARM版的Debian:Debian & Android Together on G1 - Jay Freeman (saurik)

成功运行Debian后,去下载了aircrack-ng-1.1的源码来装。后来发现装的Debian上已经附带aircrack-ng。

然后发现G1上的无线网卡tiwlan0不能以监听模式运行,就是iwconfig命令不能用,于是不能实现G1破解加密WiFi。再看看相关资料,说是驱动问题,不允许对无线网卡进行底层的设置。看来只能等高手写个驱动了。

看了看WiFi的加密,分为wep、wpa及wpa2三种。其中wep加密最容易破解,只要抓到足够的数据包就可以了。例如aircrack-ng就能轻松破解。也有个叫BT3的整体解决方案,包含虚拟机、Linux操作系统(Slax)和图形化软件,公司的同事演示过,对wep加密简直是“秒杀“。wpa和wpa2加密更安全,破解需花费更多时间。暂时没接触过。

过程中发现一篇关于把Android移植到真实机器环境的文章:KLDPWiki: Android Porting On Real Target 花了一个晚上把它看完,获益良多。简单来说是对Android有更进一步的认识。

还发现了Android上的VNC Server:Android VNC Server 此软件是在别人的基础上修改而来的,免去了安装驱动的要求,在G1的终端上敲下命令就可以了。最新版本实现了对触摸屏的支持。

PS. iPhone出来后,大家都学做界面;Android出来后,大家都学做系统了。