前面分享了一套开箱即用的 WebRTC 开发环境,希望能给对 WebRTC 感兴趣的朋友带来帮助。不过有了开发环境只是迈出了万里长征第一步,后面的事情还得仔细研读源码才行,所以这里给大家先带来 WebRTC 的安卓 demo 工程—— AppRTC-Native 的源码导读系列。(十个月前说好的拆 Dagger2 看来又要等等了,海涵海涵...)
继续阅读 »
在刚刚落幕的 WWDC17 上,苹果为我们带来了一个不小的惊喜 —— 其浏览器内核WebKit将正式支持 WebRTC,而未来基于 WebKit 内核的苹果浏览器,比如macOS High Sierra、iOS 11 中的 Safari 浏览器和Safari 技术预览版 32,都将使用到 WebRTC 技术。
——苹果终于入伙 WebRTC
继续阅读 »
最近的工作需要通过 hook 研究一些目标 APP 的系统 API 调用,很早就了解到了 Frida,这次终于可以体验一把了。花了一整天的时间,才终于把环境搭好,主要是准备手机系统花了时间。示例代码可以在 GitHub 获取。
继续阅读 »
今天下午修复了一个 YUV 图像翻转的问题,YUV 图像翻转其实没啥好说的,但期间碰到了一点性能问题,性能优化的过程我觉得比较有趣,所以在这里分享出来,希望对大家有帮助。
YUV 翻转
YUV 是一种图像编码格式(RGB 也是一种图像编码格式),YUV 主要用于视频,用来降低带宽。安卓平台上,用 Camera1 API 采集出来的数据(通过 PreviewCallback 回调获得)默认是 YCbCr_420_SP(简称 NV21,这是 YUV 的一种子格式)格式,NV21 的数据分布如下图所示(图片来源于 StackOverflow):
继续阅读 »
基本概念
所有 Touch 事件都被封装成了 MotionEvent 对象,包括 Touch 的位置、时间、历史记录以及第几个手指(多点触控)等;
事件有很多类型,ACTION_DOWN,ACTION_UP,ACTION_MOVE 等;
对事件的处理包括三类:传递,dispatchTouchEvent();拦截,onInterceptTouchEvent();消费,onTouchEvent() OnTouchListener;
继续阅读 »
Activity
Activity 是和用户交互的入口,几乎用户所有的交互操作都发生在 Activity 中,只有一个例外:通知栏,notification area (bar) 和 notification drawer 都由系统控制(SystemUI,一系列有界面的 Service,除了状态栏,还包括虚拟按键、最近任务、壁纸等,更多内容可以阅读《深入理解Android 卷III》)。桌面组件(widget)也是被 launcher 利用,显示在 launcher 的 Activity 中。
继续阅读 »
View 树的绘图流程
当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 framework 处理。
整个 View 树的绘图流程在ViewRoot.java类的performTraversals()函数展开,该函数所做 的工作可简单概况为是否需要重新计算视图大小(measure)、是否需要重新安置视图的位置(layout)、以及是否需要重绘(draw),流程图如下:
继续阅读 »
RESTful API 调用很多人都在用 Retrofit,说到 Retrofit 就不得不提动态代理,虽然这不是它唯一的亮点,而且也不是动态代理的典型使用场景,但大家就是爱问:说说动态代理是怎么回事吧?Retrofit 的解析请见 拆轮子系列:拆 Retrofit。
继续阅读 »
Task 是一个从用户角度出发的概念,是一些 Activity 的组合,它们组合起来是为了让用户完成某一件工作(或者说操作)。Task 在 framework 中对应的类是 com.android.server.am.TaskRecord,它用一个列表记录着其中的所有 Activity,至于到底是怎么记录的,就要看源码了。
继续阅读 »
Activity 的销毁与重建有两种情况:App 处在后台,由于内存紧张而被杀死,当用户回到 我们的 App 时,被杀掉的 Activity 会被重新创建;当手机配置发生变化时,例如旋转屏幕方向,Activity 会被重新创建。
当 Activity 被销毁时,在第一种情况中,它加载的 Fragment 显然也要被销毁,因为此时通常整个 App 都被杀死了,但第二种情况中,我们可以通过设置 Fragment 的 setRetainInstance 来避免 Fragment 被重新创建,但相应的,我们在加载 Fragment 的时候,就需要检查 Fragment 是否已经加载(利用 FragmentManager 进行查找),以免重
继续阅读 »