Swift ABI 稳定对我们到底意味着什么
这篇讲的是随着 Xcode 10.2 与 Swift 5 发布在即,Swift ABI 稳定这项重大变化对开发者意味着什么。作者采用问答形式,从多个实际角度剖析了这一事件。 对于 App 开发者,最直接的影响是升级到 Xcode 10.2 后,App 包体积将显著减小。例如,一个空 App 针对 iOS 12.2 的打包大小可从 2.4MB 降至 26KB,同时应用启动速度和内存使用在新系统上也会有所优化。然而,这也意味着一种“博弈”:开发者享受更小体积的同时,将无法在旧版系统(如 iOS 12.2)上使用未来 Swift 版本引入的、与运行时相关的新特性,必须等待部署目标提升。 文章进一步探讨了这对生态的深远影响。对于框架开发者,ABI 稳定只是实现二进制分发的第一步,还需要等待“模块稳定性”的达成。作者最终将视野拉高,指出 ABI 稳定为 Apple 在系统框架中全面使用 Swift 奠定了基础,可能是 Apple 平台对抗其他技术生态的关键一步,并预示了未来数年值得关注的几个趋势,如首个纯 Swift 系统框架的诞生。
如何在毕业三年完成技术跃迁
这篇讲的是在毕业招聘季的宣讲中,作者分享了程序员如何在职业初期实现关键技术跃迁的经验思考。 他借用量子力学“跃迁”的概念,将技术成长描绘成一个从新手到单领域专家的非连续性跳跃过程。作者用一条清晰的曲线指出,大部分程序员会经历一个漫长的“稳定期”进行知识积累,只有当离散的知识点有意识地联结成网,构建起个人的技术知识体系,才能完成向专家的第一次跃迁。 文章以开发一个App登录功能为例,生动展示了具备知识体系的工程师会如何系统性地进行设计:从确立可靠性、安全性的目标,到考虑架构、网络、多线程、存储等层面的具体设计,而非一上来就编码。 对于如何实现跃迁,作者给出了方法论:持续夯实包括操作系统、网络、算法、架构设计在内的基础知识体系,并在项目中积累平台知识,最后通过不断的反思与总结,将点状经验编织成网。对于即将步入职场的工程师而言,这提供了一份清晰而务实的成长路线参考。
马化腾:与阿里竞争是好事 以去中心化方式赋能企业
这篇讲的是腾讯创始人马化腾在2017年财富全球论坛上,就企业战略、技术竞争与创新生态等话题的深度分享。其中最引人注目的,是他对“赋能”理念的辨析——相较于阿里中心化的基础设施模式,马化腾强调腾讯追求的是“去中心化的赋能”。 他用一个生动的比喻解释了两者区别:腾讯不是让合作伙伴来租用平台的“柜台”,而是帮助他们自己“建房子”,建成之后客户、利润和经营自主权都属于企业自身,腾讯不掌控其命运。这一理念直接源于腾讯“把半条命交给合作伙伴”的开放生态战略,他们专注于通信社交与数字内容,将电商、出行等众多领域交给生态伙伴,避免内部竞争。 文章还透露了诸多细节:微信的诞生源于内部三个团队的“赛马机制”,广州团队胜出;马化腾坦言与阿里在十几个领域竞争“前所未有”,但认为良性竞争激发了潜能与团结。在技术层面,他提到了基于海量照片数据训练的人脸识别技术(用于寻回失踪儿童)、移动支付因竞争而快速普及,以及小程序将构建“没有APP,只有浮动代码”的未来生态。对于AI,他认为医疗影像最容易落地并展现价值。 整场对话展现了腾讯在移动互联网浪潮中的关键决策,以及通过开放与赋能来构建长期护城河的战略思考。
以苹果手机为例,三步查询手机入网工信部信息
这篇讲的是如何提前掌握未发布手机的详细配置。作者以iPhone X为例,介绍了一个数码爱好者都该知道的小技巧:通过工信部的电信设备进网管理网站进行查询。 因为在大陆上市的手机都必须登记入网,所以这个官方数据库其实是一个“新机情报站”。文章的核心就是三步走的操作指南:首先访问“证书查询”页面,然后点击“显示更多查询条件”,最后在指定栏位填入厂商(如苹果)和设备型号等信息。完成后,页面就会列出该品牌所有近期已获准入网的机型列表,包括还未公开发售的新品。 这个方法的妙处在于它的普适性和前瞻性。它不仅能用来查苹果手机,任何在国内有入网计划的品牌和型号都适用。对于想第一时间了解热门新机核心参数(如内存、屏幕尺寸等)的读者来说,这比等待发布会和评测要快得多。
智能手机让人类专注力下降为8秒 比金鱼少1秒
微软一项关于人类注意力变迁的研究得出了一个颇具冲击力的结论:在智能手机普及的二十多年间,人类的平均持续注意力时长已从12秒下降至8秒——甚至比许多人印象中“只有7秒记忆”的金鱼(9秒)还要少1秒。这项覆盖2000人调查与112人脑电图分析的研究指出,这一变化与自2000年前后兴起的“手机革命”同步发生,且不分性别与年龄。 研究不仅揭示了问题,也剖析了其复杂性。加拿大西部大学的大脑与思维学院研究人员认为,这种变化本质上源于人类对更多信息的持续渴望。作为适应的结果,我们执行多重任务的能力其实有所提升:尤其是社交媒体用户,他们练就了在短时间内快速筛选信息的能力。但这种能力伴随的代价,是专注力变得断断续续。因此,这篇文章并非简单地批判技术,而是客观呈现了一场深刻的适应性进化——在被海量信息流重新塑造的数字时代,我们的大脑正在学习以一种全新的、跳跃式的模式工作,而这同时意味着对深度、持续思考提出了更高的主动管理要求。
AlloyTouch实现下拉刷新
这篇讲的是如何利用AlloyTouch库,在移动端Web页面中实现一套高度可定制的下拉刷新功能。文章背景源于手机QQ客户端原生下拉刷新的局限性——它无法满足跨平台体验统一、自定义动画以及与页面DOM元素联动等需求,因此需要一套纯Web的解决方案。 作者详细拆解了实现过程。核心思路是利用AlloyTouch处理滑动,并结合CSS transition和SVG动画来构建视觉反馈。页面骨架通过精巧的zIndex层级管理,确保下拉区域位于可滚动内容之上。下拉动画的关键在于预定义CSS类(如.arrow_up),通过JS切换类名来触发箭头旋转和提示文字变化,而Loading动画则使用了SVG的`animate`元素,通过12个矩形依次改变透明度来形成流畅的加载效果。 文章最后附上了简洁的核心代码和完整Demo链接。其价值在于不仅提供了“能用”的方案,更清晰地展示了“如何优雅地实现”,从动画细节到交互逻辑都给出了可复用的具体实现思路,对前端开发者很有参考价值。
在 Unity3D 的 Mono 虚拟机中嵌入 Lua 的一个方案
这篇文章探讨了在 Unity3D 中嵌入 Lua 时,如何设计一个既简洁又完备的跨虚拟机交互方案。作者指出,市面上已有的许多方案存在过度繁琐或细节不完备的问题,他从 C/S 架构的通讯模型出发,提出了核心思路:将 Mono 与 Lua 间的交互抽象为一次“异地函数调用”。 这个方案的核心精巧之处在于,它不直接暴露 Lua 的 C API,而是通过一个中间层的 struct 来传递所有数据。调用函数和参数被编码进这个 struct,统一由一个 C 函数传递给 Lua 虚拟机。这种设计极大地提高了模块的内聚性,并严格控制了 Mono 和 Lua 两套异常机制的边界,防止异常泄漏。 文章还深入剖析了方案中最具挑战性的部分:两个虚拟机间的对象循环引用管理。作者详细讨论了如何利用 Lua 的弱表(weak table)和 ephemeron table 来检测仅被外部虚拟机引用的对象,并最终解除循环引用。同时,他也务实地建议,在多数项目中,保持清晰的单边引用关系(Lua 长期持有 C# 对象,C# 短期持有 Lua 对象)是更简单有效的做法。 基于这套理念,作者在周末实现了一个名为 sharplua 的轻量级方案。它提供了极简的 API:一个创建 Lua 虚拟机,两个核心的 CallFunction 和 GetFunction 用于双向调用,以及一个 CollectGarbage 用于管理跨语言对象的内存。整个实现代码开源,结构清晰,为希望自定义嵌入方案的开发者提供了一个干净的基础模板。
一个 GUI 系统的组成部分
这篇文章从作者开发 iOS 上的 XML+CSS UI 布局框架 CocoaUI 的切身实践出发,探讨了构建一个现代 GUI 系统所需的基石。作者首先犀利地指出了 iOS 与 Android 在界面体验上的差距,认为其根源很大程度在于底层的软件技术,尤其是字体渲染。他推崇苹果在高分辨率屏幕上锐利的渲染技术,并直言某些虚化技术带来的粗糙感。 随后,文章系统性地梳理了自建一个 GUI 系统至少需要的六大核心模块:从最基础的 Core Text(字体渲染)和 Core Graphics(2D 图形引擎),到赋予界面生命力的 Core Animation(动画)和 Event Handling(事件处理),再到支撑智能设备的 Core Audio/Video(多媒体)与 WebKit(浏览器引擎)。作者认为,字体技术的长期积累是重中之重。 最后,作者以自己的 CocoaUI 框架为例,介绍了如何利用类 Web 的 HTML+CSS 技术进行界面布局,将界面描述与逻辑编程分离,避免了用 XML 进行“编程”的误区。整篇文章是作者对 GUI 技术栈的深入思考与经验总结。
Android应用内存泄露分析、改善经验总结
这篇讲的是作者如何系统性地分析和改善Android应用的内存泄漏问题。他以实际优化案例开头,展示了将应用退出后内存占用从100多M降至20M以内的显著效果,并成功定位了InputMethodManager和MTK WebView中的具体泄漏点。 作者分享了一套行之有效的方法论:首先遵循“数据说话”和“持续改善”的原则。具体步骤上,建议优先用Android Studio的静态分析解决常见泄漏,比如Handler、未关闭的IO资源和Context使用不当等问题。对于更隐蔽的泄漏,则需要借助Leakcanary或adb命令在程序运行后进行监控,并使用MAT工具对内存快照进行深入分析。文章还详细说明了如何验证改善效果,形成闭环。 整篇文章就像一份手把手的排障指南,从原则、具体操作到验证,流程清晰。特别是对使用MAT时的关键注意事项(如关注Retained Size、排除软弱引用)的总结,对于实际解决问题很有参考价值。
Facebook App 优化工具 ReDex 优化的 6 点及未优化的一大方面
这篇讲的是Facebook开源的Android优化工具ReDex。它直接作用于编译后的Dex字节码,目标明确:减小APK体积并提升启动速度。经过Facebook的实测,它能使启动速度提升超过20%,Dex大小减小25%,对内存紧张的设备效果尤为显著。 文章详细拆解了ReDex的6项核心优化。其中最具特色的一项是“基于启动反馈的类布局优化”:工具会先在测试环境中运行APK,追踪启动时实际加载的类,然后将这些类的字节码“前置”到Dex文件头部,从而大幅减少应用启动时在闪存中查找类文件的时间。除此之外,还包括混淆压缩、函数内联、删除无用接口与代码、清理元数据等常规但高效的手段。 作者还点明了ReDex“管道式”的架构设计,每个优化阶段都可像插件一样灵活组合或关闭。同时,文章也提醒了使用中的注意事项,例如需为JNI调用和反射保留特殊配置、处理后的APK必须重新签名,以及混淆优化可能影响崩溃堆栈收集等实际问题。 如果正在寻找一种能与现有编译流程集成、并对APK体积和冷启动有硬性优化需求的方法,那么深入理解ReDex的这些具体优化点和配置逻辑,会带来直接的启发。
自己动手写一个 iOS 网络请求库(一)—— NSURLSession 初探
这篇讲的是,作者从一个具体目标出发——从零开始构建一个自己的 iOS 网络请求库——并选择从苹果现代的 NSURLSession 框架入手探索。文章首先简要对比了 NSURLSession 与旧有的 NSURLConnection,点明了前者在应用进入后台后更灵活的 Background Session 能力是核心优势。 随后,作者带领读者一步步动手:从创建项目、绑定按钮事件,到使用 NSURLSession.sharedSession() 发起一个最简单的 GET 请求,成功获取数据。为了更深入地理解框架行为,代码中特意引入了 sleep(5) 的延迟,验证了网络回调是在后台线程异步执行的,并未阻塞主线程。 一个有趣的发现是,当连续快速点击按钮时,请求会依次排队执行。作者据此初步推断,NSURLSession 的单例共享会话呈现出一种“异步阻塞”的队列模型。这种通过亲手编码、观察现象来反推框架内部机制的学习方式,让抽象的概念变得非常直观。文章最后附上了完整的代码示例和作者的相关开源项目。
对Android中的多图片异步加载的重新思考
这篇讲的是图片加载策略引发的性能反思。作者从开源中国客户端的一个实际问题出发:早期版本采用多线程并发下载图片,结果在列表加载时,图片反而出现明显的延迟和卡顿,尤其是在网络条件不佳的情况下。 核心发现直觉与效果的悖论:为什么传统观念中能提升资源利用率的并发,在这里却拖了后腿?文章用了一个生动的比喻——如同一个人同时推进两个相似项目,虽然总工时可能缩短,但单个项目完成的周期却被拉长,导致用户感知到的响应变慢了。 作者进一步剖析了 Android 系统本身的演进:在 Android 3.0 之后,AsyncTask 从默认的并发执行改为了串行执行队列。这个看似“退步”的设计,实际上是为了规避高并发下可能引发的资源耗尽与崩溃风险。在图片加载场景中,配合滚动时及时取消无效任务的机制,串行执行不仅更安全,从用户体感上看也避免了任务间的相互“干扰”,使图片能更连贯、流畅地逐张呈现。 这篇技术复盘最终指向一个启发:在移动端资源受限的环境下,技术方案的选择需要超越纸面的性能理论,紧密结合具体的使用场景和用户体验来重新审视。有时,看似“更慢”的串行,反而是通往“更快”感知的路径。
仿iPhone辅助球实现
这篇讲的是如何在Android上实现一个类似iOS辅助球的悬浮手势菜单。作者从一个很实用的角度出发,复盘了去年完成的一个个人项目,核心要解决的问题就是:如何让一个View脱离Activity,悬浮在所有界面甚至桌面上,并且能自由拖动和响应点击。 文章深入解释了两个关键的技术实现。第一,如何让Service能够显示View。作者厘清了原理,指出在Service中,通过获取系统的WindowManager服务并调用它的addView方法,就能将自定义View添加到屏幕上,从而实现全局悬浮。第二,如何实现手势交互。这里作者采用了更直接的方式,通过为View设置OnTouchListener,实时获取手指的屏幕坐标,并动态更新View的位置参数(Margin),来实现平滑的拖拽效果。 整篇文章从原理分析到核心代码一气呵成。给出的TopFloatService类代码完整展示了如何创建悬浮球、注册触摸事件监听、以及在点击时弹出菜单,思路清晰,对于想实现类似功能的开发者来说,具有很高的参考价值和实操性。
Android Studio使用过程中遇到的一些问题及解决方案
这篇讲的是作者从Eclipse迁移到Android Studio后,在Windows环境下踩到的一系列“坑”以及他摸索出的解决方案。由于项目涉及JNI编译等复杂依赖,作者采取了在Eclipse中编译JNI、在AS中引用jar和so的过渡方案,并在此过程中总结了十七个具体问题。 文章内容非常“接地气”,直指迁移过程中的核心痛点。例如,如何在build.gradle中正确配置jniLibs路径以加载SO库,如何通过`lintOptions`避免因检查过严导致的编译失败,以及如何解决多模块间的资源文件冲突。除了这些编译与配置问题,文章也覆盖了许多提升效率的设置,比如自动导包、代码格式化快捷键、Logcat颜色自定义,甚至是删除Module的正确操作流程。 作者没有空谈理论,而是将每个问题的背景、原因和修改方法都直接呈现,其中的Gradle配置片段和菜单路径对于遇到同类问题的开发者来说极具参考价值。对于正在或计划进行Eclipse到AS迁移的团队,这些经过实践验证的经验,或许比官方文档更直接有效。
启动activity的4种模式(standard、singleTop、singleTask、singleINstance)
这篇技术文章深入浅出地解析了Android开发中核心却容易混淆的四种Activity启动模式:standard、singleTop、singleTask与singleInstance。作者没有停留在概念定义,而是通过一个简单的示例应用,在小米4真机上通过命令行抓取Activity栈信息,直观展示了每种模式下Activity实例的创建与复用规则。 文章详细对比了它们的关键差异:standard模式最“勤快”,每次启动都创建新实例并入栈;singleTop则更“聪明”,若目标Activity已在栈顶就复用,避免重复创建;singleTask拥有自己独立的任务栈,启动时会清除栈内其上的Activity;而singleInstance则最为“孤僻”,确保一个Activity全局只存在一个实例,且独占一个任务栈。作者特别指出,理解这些差异对于处理应用内页面跳转、通知栏启动、甚至多任务返回栈的行为至关重要。 最后,文章也提示了实际开发中这四种模式常与Intent标志位配合使用,以实现更精细的控制。对于Android开发者来说,无论你是刚入门还是需要厘清模糊概念,这篇基于实操对比的文章都能提供清晰的指导。
启动Activity的流程(Launcher中点击图标启动)
这篇讲的是Android开发中最基础也最关键的一环:Activity是如何被启动的。作者没有泛泛而谈,而是聚焦于最常见的“Launcher桌面点击图标”这一场景,通过一个包含两个Activity(A和B)的完整案例,带你深入源码,剖析背后完整的调用流程。 文章的核心价值在于清晰的对比和串联。作者首先点明Activity启动的三种常见方式(桌面点击、代码调用、命令am start),并强调它们的底层处理逻辑是相通的。理解了其中一种,就能举一反三。 为了让你彻底看懂,文章提供了详实的“弹药”:从Activity A和B的具体Java代码、对应的XML布局,到清单文件中至关重要的`intent-filter`配置(特别是`MAIN`和`LAUNCHER`这两个标签),一应俱全。在案例中,点击A中的按钮跳转到B时,日志会明确显示出Activity生命周期的切换顺序——先执行A的`onPause`,然后才是B的`onCreate`和`onResume`,这个过程是理解Activity任务栈管理的关键。 对于想从“会用”进阶到“理解原理”的Android开发者来说,这是一次非常扎实的源码梳理。它不仅告诉你流程是怎样的,更通过可运行的案例让你亲手验证这个过程,将理论和实践紧密结合起来。
Android注解式绑定控件,没你想象的那么难
这篇讲的是如何用注解告别Android开发中繁琐的控件绑定。作者从大家熟悉的 `findViewById` 方法切入,直接点出它的痛点:方法名冗长、需要强制类型转换,随着布局复杂,初始化代码很容易变得冗余又影响可读性。 文章随后以KJFrameForAndroid框架为例,展示了如何通过自定义注解 `BindView` 来优雅地解决这个问题。核心思路很清晰:定义一个注解类,包含 `id` 和 `click` 两个属性,用于声明控件ID和点击事件。开发者只需在字段上方添加 `@BindView` 注解,一行代码就能完成绑定。 更关键的是注解的处理部分。作者解释了利用Java反射机制,在运行时遍历类的所有字段,读取 `BindView` 注解中的值,最后通过 `findViewById` 完成实际绑定。这种“声明式”的编码方式,让视图绑定变得直观且简洁,有效减少了样板代码,也让Activity的代码结构更干净。
Android EditText的使用及值得注意的地方
这篇讲的是Android开发中EditText组件的实战技巧与避坑指南。作者从实际开发经验出发,系统梳理了与EditText和输入法交互的多个关键细节。 文章核心围绕如何提升输入体验展开,提供了具体可操作的代码方案。例如,如何通过`setInputType`为不同应用场景(如词典与单词应用)设置默认的中英文输入状态;如何利用`InputMethodManager`手动控制输入法的弹出与隐藏,以配合搜索流程或响应其他窗口事件;以及如何通过`TextWatcher`监听输入内容变化,实现实时字数提示或搜索建议。 此外,文章还涉及了交互细节的优化,比如通过监听按键事件处理输入法回车按钮的确认功能,使用`setImeOptions`自定义回车按钮的文案(如“搜索”或“发送”),以及通过自定义`InputFilter`来限制用户只能输入特定字符(如纯英文或纯中文)。 这些内容覆盖了从基础设置到进阶控制的完整链条,为开发者提供了处理EditText常见场景的实用工具箱,有助于写出更健壮、更符合用户直觉的输入界面。
移动端测试的代理服务器搭建
这篇讲的是在Unix/Linux环境下,如何用开源工具Squid为移动端测试搭建代理服务器。文章从实际场景出发:移动设备需要调试或访问局域网内某台主机上的本地服务,直接访问不通,就需要一个中间代理来转发请求。 作者以CentOS系统为例,完整梳理了从安装到配置的全流程。关键步骤包括:禁用Squid默认的缓存机制(避免干扰测试)、设置必要的主机名、开放访问权限以及指定代理端口。文章还细心地提醒了日志文件管理的必要性,提供了两种日志清理方案,一个是用crontab定时任务粗暴清空,另一个是使用Squid自带的日志滚动功能。 最终,移动端只需在Wi-Fi的HTTP代理设置中,填入服务器IP和配置的端口,就能顺利访问到目标本地服务。整个方案实用且具体,对于在Linux环境下进行移动端开发测试的工程师来说,是一个清晰可复现的搭建指南。
菜鸟不要怕,看一眼,你就会用GCD,带你装逼带你飞
这篇讲的是iOS开发中GCD多线程技术的入门实战指南,作者没有堆砌理论,而是从最常用的队列概念切入,手把手教初学者正确使用。文章核心对比了串行队列与并发队列:前者任务按顺序执行,后者则能同时处理多个任务互不阻塞——通过简单的代码和清晰的线程日志输出,直观展示了两者的关键差异。接着介绍了系统预置的Global Queue(并发)与Main Queue(串行主线程)的协作模式,这是日常开发中最常见的“异步操作后回调主线程”范式。此外,作者还详细演示了如何通过dispatch_set_target_queue为自定义队列设置优先级,以及用dispatch_after实现主线程延迟操作,并解释了这些方法与RunLoop的关系。全文通过可运行的代码片段和真实的输出结果,让读者能迅速理解GCD各组件的工作机制与适用场景。