Author Archives: nitrohsu

Android共享热点IP问题引发的“血案”

今天一朋友问Android手机的Wi-Fi共享热点IP能不能修改,他那边一直是192.168.43.*,自己记得在设置里面没有这个选项,便回复了他不能修改。后来猜测Android源码可能为了刻意避开常用局域网路由器192.168.0/1/2.*段,特意设置的其他网段,但会不会存在与基站代理在一个网段后冲突自我协调的机制呢?(当然这个可能性很低,一般基站的代理服务器分配的都是10.*段的内网地址),既然有了这个问题,那索性看看源码怎么设置的。

  • 涉水

首先想到的是到StackOverFlow上看看有没有相关问题,搜索得之,

http://stackoverflow.com/a/31238229/4865380

确实有人提到修改Hotspot网关的问题,给出的具体源码是在WiFiStateMachine.java中硬编码了192.168.43.1这个网关地址,这就解释了为什么共享出去的IP地址都是192.168.43.*了。手机用户想修改它,duang然是不可能了。

  • 挣扎

从AOSP的master中去查找上文提到的platform/framework/base/wifi/java/android/net/WiFiStateMachine.java却消失了踪影,寻寻觅觅发现已经被移到platform/framework/opt/net/wifi/service/java/com/android/server/wifi/WiFiStateMachine.java。一看就对源码分析不熟悉,这些模块搬家的消息都不知道,其实从5.0之后opt/net/wifi之后就有了,部分代码被迁移到这里。

但是,但是,这个文件里面再也没有发现startTethering()方法,而且硬编码的代码也被移除了,难道5.0之后热点网关IP的配置又被更改了?继续跟踪文件diff发现有一次提交提到AP:

https://android.googlesource.com/platform/frameworks/opt/net/wifi/+/d4f347f7de30834317dd1561dc806eccb1c4f277

这次提交说明有关于AP热点配置在WiFiStateMachine.java中的代码被迁移到SoftAPManager,然后通过SoftAPManager来集成,同时也提到了AP这块代码放在WiFiStateMachine代码不够清晰。

  • 继续挣扎

既然知道了代码迁移过程,那就需要跟着去寻找SoftAPManager。这个文件和WiFiStateMachine.java在同一包下,打开文件一看还是没有发现对于IP地址的硬编码部分,只能再次寻求log,这个文件的修改历史记录比较少,其中最老的一条对应于上文提到的AP状态管理通过SoftAPManager。通过历史查看这次修改发现了从WiFiStateMachine.java迁移过来的硬编码IP地址的代码。既然在创建时代码还存在,那么次新一条的历史记录就更加让人着迷了:

时隔上次迁移到SoftAPManager.java的三个月后,这块逻辑又要被搬家了,归宿就是Tether模块,这么一波三折到底是Android源码,修改的简直是猝不及防。

  • 上岸

上面提交记录中,提到的Tethering&TetherInterfaceStateMachine在platform/frameworks/base/services/core/java/com/android/server/connectivity/下面,关于硬编码的部分被迁移到TetherInterfaceStateMachine.java

硬编码IP的方式并没有改变,至此终于将代码的变化追踪完了,结果还是一套硬编码方式。当然乐在于真正找到了答案。

我们为什么结婚

年前在家看到一篇文章写到在21世纪我们怎么还需要婚姻这样一种组织约束,是不是已经过时了,是不是需要重新定义家庭和群体组织关系?后来还想再读一遍,结果找不到原来的链接了。。。正逢过年恐婚族和催婚族撕逼大干一场的时候,这样的话题才会燃起这样老生常谈的硝烟。

6岁那年,大病初愈,刚从医院回来还不能走路,只能在床上大小便,奶奶一边照顾着我一边给上小学的姐姐做三餐,到现在我还记得那个黑漆漆的屋里,高高的床铺旁边就是灶台,下雨天一边是倒吹烟一边是雨水的滴答。直到有一天,奶奶找我妈死活找不到,我爸也出去找,还是没找到,也没人告诉她去了哪里。无奈到第二天,同村的人告诉我爸,我妈回娘家了,准备离婚。那时的我也搞不懂什么是离婚,为什么妈妈不在身边,我爸为什么着急,对我来说,那一切都是茫然。后来一切如我妈所愿-离婚收场。至于为什么离婚,到现在我也没有问过奶奶或者我爸,生活的每一天都在眼前,6岁时不懂,16岁,26岁,一切尽在眼前。谈起此事,很多朋友会问,和妈妈再也没有联系了吗?我说没有,一点都没有,从未谋面,不再见面,她只是我妈,生下我的妈。后来的几十年老爸再也没有娶,他对妈妈或许到今天他也只有恨。如果问我,恨吗?不恨也不爱,无感。我能感受母爱吗?能,20多年用敏感的神经感触到了比一个单一家庭更多的关怀和爱,要感谢的人太多太多,怀着感恩前行~对一个难以维系的家庭来说离婚是最快捷也是最解脱的方法,如果你忍受家庭暴力,忍受丈夫出轨,忍受贫穷的伤害,忍受失望大过于希望,那为什么不选择离婚来结束这份守护、责任、感情?

有人说他窝囊,有人谣传她出轨,到最后他们两个终于离婚了。一个爱喝酒,一个爱打扮,爱喝酒的不耍酒疯,爱打扮的不惹老牛,这样的离婚怪罪于谁?七嘴八舌的街邻还是深埋心底的不合,他是老大,家里为了娶媳妇,最终选择了换亲这一风俗,自己的姐姐换来了自己的媳妇,老二老三继续光棍,最终老大也是成了光棍,婚还是离了,选择了在孩子成人之后,换句话说,好聚好散。后来的男人继续酗酒,但最终还是倒在了酒瓶底下,大病一场,在自己人生的弥留之际见证了自己儿子的婚礼,妈妈虽然远嫁他乡,但在自己儿子的婚礼上作为母亲接受了儿媳的一杯酒,而他最终却不治身亡。

等待是漫长的,尤其是面对生死的手术室,那个场面到现在依然历历在目。当时只有我爸和家里妹子,当班手术护士在催促着抓紧转手术室,所有人都很紧张,只有手术推车上的我是镇定自若。老爸耳朵背,听不清也听不懂护士的话,事情又特别着急,而且在那样的氛围下人的心情又是焦虑紧张,最后妹子哭了,真的很无助,既没有见过这种场面,也没有经历过如此重大的事情,眼泪瞬间就下来了,我赶忙安抚,但我已经躺在了手术推车上不能动,妹子一边收拾着东西一边和护士把我往手术室走。一边是帮不上忙的父亲,一边是无助泪如雨下的妹子,而我就像是被押上刑场的犯人,纵然我有一万只手和一万个脑袋也无能为力,只能静静的看着天花板一个个的飘过,一盏盏灯慢慢掠过,一步步地靠近麻药的终点。

醒来是漫长的,后期是痛苦的,不只是病痛还有一个之前健康人现在五花大绑一样的无奈,妹子之前都是家里照顾着疼爱着,从来没有这样照顾着一个病人,有时也会烦躁,作为一个处女座的病人有时还会这里不合适那里不合适总是挑毛病,只是妹子的一个白眼,最后我也只能无奈接受,谁让自己陷在是无行为能力的人,哈哈哈。要说处女座的奇葩之处,确实有可怕的地方,对于家里物品的堆放、购物的挑剔、审美的要求真是被自己而折服,妹子又是一个比较随性的人,不会有那么多事情考虑到,但自己看到后就会不自觉地开启了叨逼叨逼叨模式,最终收获的是你的要求你收拾,你既然有时间叨叨为啥不用这段时间整理等等,想想这也在理,索性我自己收拾,最后还能收获手动点赞,哈哈哈,不忍受和行动并存,或许这就是处女座的终极模式。

之前时常的晒晒菜谱晒晒厨房的成果,但是真要接受人民检阅的时候你才会发现,世界上好像只有你一个在吃素,只有你一个在少盐少油菜量刚刚好,结果就被喷地无地自容。八成熟的蒜苔炒肉、基本无油的炒白菜梗,在你吃起来蛮有味道的菜到了妹子那里竟然难以下咽,unbelievable,一个人的饭菜怎么都好,一桌人的饭菜真的是众口难调,我姐看到端到桌上的菜,一度怀疑买的菜不够吗?山东人确实是实在吗?放点辣椒可以吗?多放点盐能不能行?嗯,世界都在变,我只是偶尔的炒好了一道一家人可以吃的菜。

恋爱是一个过程,结婚只是一个起点。于她,早已不再是恋人或者老婆,已然变成了生命中不可缺少的那一部分,希望未来的几十年里,我们彼此是朋友、伙伴、爱人。

 

Android 物联网SDK

原文链接

支持库

主要包含两方面的支持:外部器件 IO API用户驱动API

  • 外部器件 IO API实现了相关的工业标准协议和接口,可以让App与传感器和制动元件进行通信。支持的接口主要有:GPIOPWMI2CSPIUART

https://developer.android.com/things/sdk/pio/index.html

  • 用户驱动API扩展自Android framework的Service组件,它允许App注入硬件事件到framework层,其他的Apps就可以通过标准的Android API来访问这些事件信息。

https://developer.android.com/things/sdk/drivers/index.html

与AndroidOS相比的变更

  • 应用变化

Android Things中系统应用将不复存在,Content Provider也消失了,所以在开发应用时就不要通过Intent调用如下API了:

CalendarContract
ContactsContract
DocumentsContract
DownloadManager
MediaStore
Settings
Telephony
UserDictionary
VoicemailContract

  • 显示不再是必须

Android Things的应用与传统的应用开发一样,提供了相同的UI工具集来支持显示,在图形模式下窗口会以*真实*全屏的方式显示,没有状态栏和导航栏,即便你从底部滑动也不会出现,整个屏幕完全交由用户操控。

当然了,Android Things的显示屏并不是必须的。在一个无屏的设备上App的activities还是主组件,framework依然会分发输入事件到获得焦点的前台activity上。应用不能通过其他应用的组件(比如service)来接收键盘事件或者移动事件。

  • 主Activity支持

Android Things自动运行一个App在manifest中定义的”home activity”作为系统启动后入口,这个activity必须包含一个由CATEGORY_DEFAULT和IOT_LAUNCHER组成的intent-filter。

为了方便开发,这个activity还需要包含一个CATEGORY_LAUNCHER的intent-filter,这样Android Studio才能在发布和调试时作为默认activity来启动。

  • Google Services支持的变化

Android Things支持一系列的Google APIs。在这里需要用户输入和授权的API都不支持。下表列出了支持的API和不支持的API:

支持的APIs 不支持的APIs
Cast
Drive
Firebase Analytics
Firebase Cloud Messaging (FCM)
Firebase Crash Reporting
Firebase Realtime Database
Firebase Remote Config
Firebase Storage
Fit
Instance ID
Location
Nearby
Places
Mobile Vision
AdMob
Android Pay
Firebase App Indexing
Firebase Authentication
Firebase Dynamic Links
Firebase Invites
Firebase Notifications
Maps
Play Games
Search
Sign-In
  • 权限

运行时授权在这里不能够提供支持,因为没有UI来提供授权对话框的显示,所以App开发者需要在manifest中将所有权限列出。所有正常和高危权限均会在安装时统一授予。

  • 通知

由于没有系统级别的状态栏和UI窗口支持,所以通知服务不会支持,在App中要避免调用NotificationManager。