博文

Android 实现模糊效果的一些笔记

不知从 ios 的那个版本起有了毛玻璃效果,于是这东西就成了 Android UI 设计师们爱用的效果之一。实现这个效果,技术的核心是对图像的模糊处理。 当然,技术上需要做到什么程度,取决于要实现的效果如何。如果需要模糊的对象是固定的,而且是整个图像一起模糊掉,那么最简单的办法还是在开发阶段就计算好模糊的图片——photoshop 的滤镜能达到的效果永远比工程师重复发明轮子在用户手机上算要来的好。然后把这模糊图放在清晰图的上面,通过控制模糊图 ImageView 的透明度来实现渐变毛玻璃效果。在布局不是特别复杂的情况下,这样做的效率还可以接受(实在想优化的话就自己在 Canvas 上画吧)。 如果需要在手机端计算模糊图,那么 这篇文章 和 这篇文章 是很好的补习资料,常见的 Box blur 和 Gaussian blur 的原理讲的很清楚。实际上,Gaussian blur 因为涉及的基本都是浮点计算,执行时间是 Box blur 的数倍。以 note2 为例,自行计算一张 radius=16 的 720x1280 的 Gaussian blur 图片,Java 版本需要约 1 分钟,c++ 版本最快也要约 20 秒(纯 cpu 单线程,多线程的边界情况处理器来很麻烦所以没折腾成),而 Box blur 同样的图片虽然可以在几秒内完成,但对于某类图片(比如带明显横竖条纹的)的模糊效果非常差,即使两次 Box blur 出来的效果也还是差强人意。自行实现模糊的另一个要命的问题是内存。例如  StackOverflow 的这个 FastBlur 答案 (很多讲模糊文章都引用了这个答案),虽然速度上还不错,但是内存消耗的实在是有点粗放,只适合做小图片处理。 据说 API 17 以上 Android 提供了 RenderScript 来可以利用 GPU 做模糊计算。去年底的时候我参考 这篇 折腾过,不过没成功。一是 API 17 这个门槛实在是高(貌似通过 android-support-v8 也可以,但也非常折腾),二是 RenderScript 调试起来实在困难。总之 RenderScript 这条路我没走通。前阵子 又有一篇文章 带了示例代码,有兴趣的同学可以继续尝试。需要注意的是像这种高大上的解决方案,兼容性有待验证(Android 设备的又一...

Android 应用卸载监控的实现方法

不再主业折腾 Android 了,这段时间会陆续把之前折腾过的东西记录一下,免得日后忘记。 对于产品经理和运营来说,知道哪个用户,什么时候,为什么会卸载你的 app 可能是很重要的事。虽然我觉得挺扯蛋——看看国内那些应用在卸载时弹出的页面,可选原因 12345,列的比用户想的都全面周到——这分明就是在说,我也知道自己干了很多坏事让你们不爽,可我干的坏事是如此之多以至于我实在弄不清你们的底线在哪里。 好吧,在我朝可以有理想,但是不能太理想主义。所以本文只从技术角度讨论一些实现细节。 首先来看 这篇文章 ,基本勾勒出了实现卸载监控所需的技术框架。这篇文章有以下几个关键字: JNI Android 应用被卸载之前,其运行实例就会被停止掉。因此必须要有代码能够脱离应用的生命周期管理。这个入口就是 JNI。进入 c 的世界,想象空间完全不是 Android API 可以比拟。 fork 对于卸载监控这个需求来说,JNI 是入口,为的就是进入 fork 这一环。fork 本身是比 Java 更为历史悠久的系统调用,在这里负责生成监控进程,是整个逻辑中非常关键的一环。至少要把 fork 示例的执行逻辑 搞懂(系统补习的话当然是建议读 APUE 相关章节,后面 exec 也会用到)。 inotify Linux 特有的文件监控 api, IBM 这篇 介绍的很好。 UserSerial 这个是 Android 4.2+ 引入的安全机制,原文说的很清楚,这里不再赘述。 但是这篇文章的实现方案两个明显不足: fork 出来的进程仍旧是一个带着 dalvik 的庞大进程(内存 20MiB+) 通过进程父子关系较容易找到卸载监控进程 所以,针对上述不足,可以继续改良实现方案: exec 将 inotify 部分的逻辑抽离到独立的可执行文件中,fork 出来的监控进程,可以通过 exec 这个独立的可执行文件来将自己变成一个非常轻量级的监控进程(内存占用只有 KiB 级别),同时也可以通过参数将伪装自己的进程名字。其实 fork + exec 的组合在传统的 unix 多进程编程中非常常见。 两次 fork 为了断绝父子进程关系,可以通过两次 fork 的技巧。主进程 A 通过 JNI 调用,进行第一次 fork,其父进程 A ...

风光月霁

就在刚刚,部门赶在财年结束前达成了关键业务指标。来往群里大家喜悦之情溢于言表。我也很欣慰。 毕竟这是动荡了几乎整整一年以来,难得令人愉悦的瞬间。这段时间以来,战略调整,项目更迭,拥抱各种变化。带领一个并无甚 android 开发经验的团队在湍流中站稳脚跟并形成战斗力,颇为不易。 此刻,前路空前明朗,团队欣欣向荣。对上对下,再无牵挂和遗憾,该是我可以抽身的时候了。 感谢团队的伙伴们。你们很优秀。送别的礼物我很喜欢。

lyman 的 2013 游戏总结

2013 年是动荡的一年。而我就如大时代中一个小小水滴,时沉时浮,一刻不得歇息。在那些辗转反侧夜晚,有识之士们大概会沉思 xx 的未来向何处去闻鸡起舞洗冷水澡;蒲松龄老先生会浮白载笔仅成孤愤之书;我则吃着零食玩着游戏,等待船到桥头自然直。(不要学我,我的脂肪肝大抵就这么吃出来的) 本年度完成的游戏: Battlefield 3 (1 月 11 日) 没啥印象了。没有玩 Bad Company 那种画面惊艳的感觉,也没有 CoD 4 那么令人难忘的任务关卡。中规中矩吧。这游戏的重心肯定是在对战上面。像我这样只玩单机部分的奇葩肯定会被人看成奇葩。 Shank 2 (1 月 17 日) 跟前作一样就是图个爽快。要不是这作加了女性角色跟前作简直一样。 Anomaly Warzone Earth (2 月 25 日) 逆塔防这个想法挺有创意。杀时间效果明显。难得的是支持 linux 而且居然 intel 集显也跑得起来(仅仅是能跑)。准备续作时继续支持一下这个工作室。 Mark of the Ninja (3 月 31 日) 非常赞的游戏,2d 潜入的玩法让人眼前一亮。精神分裂的故事也很不错。 Saint Rows: The Third (5 月 13 日) 本来以为就是类似 GTA 的仿制品,但是实际上圣徒系列非常有自己的风格。情节设计的夸张有趣,难度也适中,反正当年我玩 GTA 是没坚持下来。但是这作我玩的不亦乐乎。 Darksider (6 月 3 日) 中规中矩。 Sleeping Dogs (6 月 20 日) 这就是无间道的游戏版,综合素质还是不错。格斗系统看似复杂但是实际上最后会收敛到几个最实用的招式上面去,虽然游戏后半程稍显呆板,但仍然爽快。故事尚可,流程偏短,最让人记恨的是作为一个 GTA 类的黑社会游戏怎么可以没有香艳场景呢? Deus Ex: Human Evolution (7 月 14 日) 好评无数,慕名而来。只是 3d 潜入类我不是太适应,第一视角时间稍长一点就会头晕,玩的比较辛苦。所以连资料片都没通。 Tomb Raider 2013 (7 月 27 日) 今年最惊喜的作品。带入感非常强,视频攻略当成电影看基本没问题,而且还是个不错的电影。本作对于古墓系列的意义基本等效于丹尼尔·克雷格对于 007 系列的意义。...

亡也忽焉

图片
辍笔两月有余,已然破了自己心中每月至少一篇的规矩。虽有部门更迭在先,乔迁新居在后,忙了个不亦乐乎,现下回想起来,却也并非是挤不出时间,终究还是因为懒。 然而 『来往』事件 一出,一片哗然,又牵涉一家上下的生计,却教我如何置身事外。 这招『八仙过海』,本是事出紧急,性命攸关,败中求胜的法门。当年 入朝作战的第九兵团指挥员就曾深悔未用此招 。 只是这招威力固强,自损也大。在我看来,是需慎之又慎、志在必得的搏命一击。倘若不中,后果不堪设想。这层道理想必集团高层洞若观火。然则依旧猛然打出这么一记,想是推算到了不忍卒睹的未来。 只能说,以眼下大阿里的如日中天,高层有如此忧患意识,可赞;手段如此雷厉风行,可叹。 兴也勃焉,亡也忽焉。Nokia 就是好榜样。今日集团如此决断,壮举还是混招,我既看不清楚,也觉断言尚早。只是颇感惋惜。四年前阿里云开张,曾看见集团沉淀技术的希望。然而四年如白驹过隙,阿里云分分合合,(此处省略若干字)。而今危机重现,却还是只能以八仙过海这种人民战争的营销招数硬拼,较之美帝谷记乃至国内业界健者,差距不可以道里计。 寄人篱下,终于不能免俗。 扫描如下二维码,或 直接访问此处 ,应可安装『来往』客户端。 来往 id: lymanrb 用『来往』客户端扫描上二维码,或直接搜索好友『lymanrb』,可加我为好友。 不胜感激。

记一个奇怪的 android bug

莫名其妙摇身成为 android 开发是个挺神奇的事情,有机会的话以后再细说。 今天的问题是发现自己的应用在三星的 Galaxy S4(GT-I 9505)上行为诡异: 应用启动之后界面没显示出来,屏幕仍保持启动前的样子 通过 Toast 可以看得出来应用还是启动了的,而且可以操作,也就是说,除了界面没显示,应用是可以操作的 查了一圈 log 也没看到什么有价值的信息,最后只能祭出二分法排查。最后元凶是这么一行: getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED); 这行是为了拦截 home 键加上的。无论怎么看都跟前述故障八杆子打不着。去掉之后,应用行为一切正常——幸亏我这个应用里拦截 home 键不是硬需求,可以等以后绕不开了再深入研究背后的故事。 这几天的感受,三星的 android 手机适配起来问题比 MTK 还要多,特记此备忘。

不忘初心

自从去年下半年,工作似乎就开始慢慢偏离了轨道。至于今年以来各种救火,真是使尽了浑身的解数,也几乎耗干了最后一点激情和梦想,结局却依然惨淡(人还在阿里,事情不便说太细)。 在大公司打拼,要对得起手下的兄弟姐妹,要样子做足给上面数级领导,要盘算不能让用户太过反感,要头破血流的赶进度,有时还要盯防友军的明枪暗箭。其实做这样的小头目,真跟当良心未泯的伪军差不多。要对得起手下的弟兄,要样子做足给皇军,要盘算不能太坑害老百姓,要头破血流的跟八路斗,有时候还要盯防友军的明枪暗箭。 其实心里也跟明镜似的,自己何德何能,能带领团队走出  death match  的泥沼。大概这就是形势比人强吧。 四年前,曾对 R 君说「三年之后,或可有小成」。如今来看,都是笑谈。坚持到今日,一直骗自己的理由是不忘初心。现在想想,可能更多是赌徒心态。输得多了,自然寄幻想于小概率事件。 四年前,刚刚入职,拿韩磊这首「 花开在眼前 」现学现卖,结果忘了词。今夜,在无人的寂静中,还是这首歌,听到泪流满面。 明天又会是崭新的一天吧。