
Android
文章平均质量分 93
却把清梅嗅
Android开发者,爱好写作,曾多次作为嘉宾受邀参加GDG (Google Developer Groups)线下活动进行分享。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
反思: Google 为何把 SurfaceView 设计的这么难用?
如果你有过SurfaceView的使用经历,那么你一定和我一样,曾经被它所引发出层出不穷的异状折磨的怀疑人生—— 毕竟,作为一个有理想的开发者,在深入了解 SurfaceView之前,你很难想通这样一个问题: 为什么 Google 把 SurfaceView 设计的这么难用?原创 2022-09-06 17:13:22 · 14487 阅读 · 8 评论 -
Unity3D-在Android平台快速验证功能的更新
Unity平台能够提供非常强大的2D、3D特效,相比OpenGL而言,使用Unity` 意味着更低的开发成本,更便捷的可视化开发体验。在常规的 Unity 开发中,与 Android 的联调通常使用 建立Unity项目 - 导出Android项目 - 编写并导出aar - 导入Unity再次编辑 - 再次导出apk 来实现,整体过于繁琐,无法满足在双平台的开发过程中,频繁修改、联调 的需求。本文将针对两个平台如何快速验证功能的更新,进行简单的分析。1. 实现步骤 & 验证先说结论 :Unit原创 2022-04-30 15:40:56 · 2836 阅读 · 0 评论 -
Unity3D-导出特效到安卓项目流程
本文将针对将 Unity 的项目导出到 Android 平台的步骤进行一个总结。首先点击File-Building Settings,打开配置面板:打开面板后,切换Android栏,准备导出项目,如果是第一次导出,那么Unity没有找到对应的开发环境配置,提示需要下载,以iOS为例:在 Unity Hub 上,需要手动指定下载的依赖,包括Android SDK 和 NDK, 下载安装完成后,需重启Unity,再回到配置面板,此时已经可用了:主面板提供了一些基础的配置,其中最重要的是Export原创 2022-04-22 17:14:34 · 6022 阅读 · 0 评论 -
Android OpenGL 仿自如 APP 裸眼 3D 效果
概述之前看到 自如团队 发布的 自如客APP裸眼3D效果的实现 ,非常有趣,不久后,社区内 Android 的开发者们陆续提供了 Flutter、 Android 原生 、Android Jetpack Compose 等不同的实现版本。很快我看到了一个好玩的评论:既然客户端都卷成这样了,干脆破罐破摔,把 Android OpenGL 的实现版本也补齐,毕竟 图形学或许会迟到,但绝不会缺席 。实现效果如下(图片来源),这一波属实参与到社区内裸眼3D的 客户端大满贯 了 :原理简介 & O原创 2021-11-28 23:42:01 · 6040 阅读 · 0 评论 -
Android 分场景集成不同音频倍速算法的实现
概述上文 《Android 音频倍速的原理与算法分析》 中, 我们针对音频倍速的基本原理进行了梳理,并逐步引申出了 Android 平台上常用的2种算法实现:Sonic 和 SoundTouch。初步结论是,在用户启用音频倍速时,我们需要 根据具体场景切换不同实现 ,以此保证最佳的用户体验。举例来说,对于常规音乐——尤其是背景乐、打击感比较强的音乐,我们优先选择 SoundTouch, 而对于人声更纯粹的音频(相声评书、歌手清唱等)而言,Sonic 才是更好的选择。本文以 Google 开源的 E原创 2021-11-13 23:42:54 · 4198 阅读 · 1 评论 -
Android 音频倍速的原理与算法分析
概述音视频倍速 是内容类APP非常重要的功能,其内部包含了 视频流 和 音频流 的倍速,其中视频倍速原理相对简单,即在解码视频帧时提升帧率即可。音频倍速 相对复杂,众所周知,声音的本质其实是 物体振动时产生的声波,因此音频的倍速是 将语音信号在时域上拉长或缩短,考虑到用户的体验,在保证声音变速的同时,语音的采样率、基频以及共振峰都不能发生变化,以此达到 变速不变调 的目的。对于 Android 平台的应用而言,音频倍速通常有3种实现方式:实现方案应用简介Android Audi原创 2021-10-31 00:58:20 · 7132 阅读 · 2 评论 -
反思 | Android 音视频缓存机制的系统性设计
反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。背景在自媒体的时代,音视频播放 俨然已成为内容类型 APP 最基础的能力,对于 Android 开发者而言,无论是 Google 开源的 ExoPlayer ,还是 Bilibili 开源的 ijkplayer , 都是构建应用音视频播放能力时优秀的选择。虽然上述的三方播放器都自带完善的缓存功能,但对于内容和形式都日新月异的一众互联网产品来说,想要打造完美契合自家产品的用户体验,播放器自身的缓存机制已逐渐无法满足需求。最具.原创 2021-09-25 22:47:47 · 1129 阅读 · 0 评论 -
反思|开启B站少女心模式,探究APP换肤机制的设计与实现
反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述换肤功能 并非奇技淫巧,而是已非常普及,尤其当Android Q推出了 深色模式 之后,国内绝大多数主流应用都至少提供了 日间 和 夜间 两种模式。对于无感的用户而言,这个功能实属鸡肋,但从另外一个角度上来说,这也是产品在雕琢 用户极致体验 过程中的一次尝试,为不同情景下,不同偏好的用户提供更多的选择性。以 哔哩哔哩 为例,除了提供以上两种主题之外,还免费提供了充满 少女心 的粉色主题:从产品的前瞻性上来看,国内在.原创 2021-05-22 15:27:56 · 9664 阅读 · 14 评论 -
[译] 编写AndroidStudio插件(五):本地化和通知
原文:Write an Android Studio Plugin Part 5: Localization and Notifications作者:Marcos Holgado译者:却把清梅嗅《编写AndroidStudio插件》系列是 IntelliJ IDEA 官方推荐的学习IDE插件开发的博客专栏,希望对有需要的读者有所帮助。在本系列的第四部分中,我们学习了如何在插件中集成诸如Jira Cloud Platform之类的第三方API,以及如何使用MVP或MVC之类的模式开发。本文我将部分.翻译 2021-01-25 17:36:37 · 1417 阅读 · 1 评论 -
[译] 编写AndroidStudio插件(四):集成Jira
原文:Write an Android Studio Plugin Part 4: Jira Integration作者:Marcos Holgado译者:却把清梅嗅《编写AndroidStudio插件》系列是 IntelliJ IDEA 官方推荐的学习IDE插件开发的博客专栏,希望对有需要的读者有所帮助。在本系列的第三部分中,我们学习了如何使用Component对数据进行持久化,并利用这些数据来创建新的设置页面。在今天的文章中,我们将使用这些数据将Jira与我们的插件快速集成在一起。请记住.翻译 2021-01-24 14:48:30 · 1861 阅读 · 0 评论 -
[译] 编写AndroidStudio插件(三):设置页
原文:Write an Android Studio Plugin Part 3: Settings作者:Marcos Holgado译者:却把清梅嗅《编写AndroidStudio插件》系列是 IntelliJ IDEA 官方推荐的学习IDE插件开发的博客专栏,希望对有需要的读者有所帮助。在本系列的第二部分中,我们学习了如何使用Component对数据进行持久化,以及通过这些数据,在用户更新我们的插件后展示更新了哪些新功能。在今天的文章中,我们将看到如何使用持久化的数据来创建设置页面。请记.翻译 2021-01-23 22:20:33 · 1497 阅读 · 0 评论 -
[译] 编写AndroidStudio插件(二):持久化数据
原文:Write an Android Studio Plugin Part 2: Persisting data作者:Marcos Holgado译者:却把清梅嗅《编写AndroidStudio插件》系列是 IntelliJ IDEA 官方推荐的学习IDE插件开发的博客专栏,希望对有需要的读者有所帮助。在本系列的第一部分中,我们了解了如何为Android Studio创建一个基本的插件,并编写了第一个Action。本文我们将了解如何在插件中对数据进行持久化。请记住,您可以在GitHub上找.翻译 2021-01-22 17:53:25 · 2631 阅读 · 1 评论 -
[译] 编写AndroidStudio插件(一):创建一个基本插件
原文:Write an Android Studio Plugin Part 1: Creating a basic plugin作者:Marcos Holgado译者:却把清梅嗅《编写AndroidStudio插件》系列是 IntelliJ IDEA 官方推荐的学习插件IDE开发博客专栏,希望对有需要的读者有所帮助。早在10月的时候,我就在Droidcon UK 2018上针对如何在Android Studio上创建自己的插件,以及如何使所有相关操作自动化进行了讨论。因为当时我并没有很多时间对.翻译 2021-01-21 20:38:55 · 4469 阅读 · 2 评论 -
反思 | 事件总线的局限性,组件化开发流程中通信机制的设计与实现
反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。背景诸如EventBus\RxBus\LiveDataBus的事件总线库在业内正遭滥用。诚然,事件总线看起来 小而美 ,但随着业务复杂度上升,事件的发送和订阅到处分布,这个优势反而成为了负担,因此,笔者不建议在任何量级的项目中使用事件总线库。更多原因读者可参考 这篇文章 。更合理的方案是什么呢?在量级较小的项目中,开发者应该通过 依赖注入 将Callback进行不同层级的依次传递,以保证 层级间的依赖关系足够清晰。而对于.原创 2021-01-16 20:35:05 · 11928 阅读 · 12 评论 -
反思|官方也无力回天?Android SharedPreferences的设计与实现
反思|官方也无力回天?Android SharedPreferences的设计与实现反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。起源就在前几日,有幸拜读到 HiDhl 的文章,继腾讯开源类似功能的MMKV之后,Google官方维护的 Jetpack DataStore 组件横空出世——这是否意味着无论是腾讯三方还是Google官方的角度,SharedPreferences都彻底告别了这个时代?无论是MMKV的支持者还是DataStore的拥趸,SharedPrefe原创 2020-10-17 16:36:37 · 8816 阅读 · 5 评论 -
反思|Android 输入系统 & ANR机制的设计与实现
反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述对于Android开发者而言,ANR是一个老生常谈的问题,站在面试者的角度,似乎说出 「不要在主线程做耗时操作」 就算合格了。但是,ANR机制到底是什么,其背后的原理究竟如何,为什么要设计出这样的机制?这些问题时时刻刻会萦绕脑海,而想搞清楚这些,就不得不提到Android自身的 输入系统 (Input System)。Android自身的 输入系统 又是什么?一言以蔽之,任何与Android设备的交互——我们称之为 输.原创 2020-08-24 22:14:25 · 2610 阅读 · 0 评论 -
反思|Android源码模块化管理工具Repo分析
「反思」 系列是笔者对于 学习归纳 一种新的尝试,其起源与目录请参考 这里 。起源随着Android项目 模块化 或 插件化 项目业务的愈发复杂,开发流程中通过版本控制工具(比如Git)管理项目的成本越来越高。以大名鼎鼎的 Android源代码开源项目 (Android Open-Source Project,下文简称 ASOP)为例,截止2020年初,Android10的源码项目,其模...原创 2020-05-05 16:10:17 · 1997 阅读 · 0 评论 -
反思|Android 事件拦截机制的设计与实现
「反思」 系列是笔者一个新的尝试,其起源与目录请参考 这里 。概述完整的掌握 Android 事件分发体系并非易事,其整个流程涉及到了 系统启动流程(SystemServer)、输入管理(InputManager)、系统服务和UI的通信(ViewRootImpl + Window + WindowManagerService)、View层级的 事件分发机制 等等一系列的环节。事件拦截机制...原创 2020-04-15 23:37:00 · 1912 阅读 · 1 评论 -
面向功利编程,面向Star开源? 一个开发者的2019反思总结
我是 却把清梅嗅 ,GitHub开源社区内的一个 功利 的爱好者。去年的这个时候,我同样做了一个简短的年终总结:《2018我的博客历程:你带来微笑,我有幸得到》我不是喜欢一个花时间写非技术类型文章的人,但是每年一篇年终总结于个人确实有所裨益——时隔一年再看,这篇文章段落中的一些吹嘘自己的文字,多少都让我有点尴尬。同时,我看到了过去自己一些 不成熟的想法 ,与一年后的自己的理念有所冲突,我...原创 2019-12-27 01:02:04 · 5775 阅读 · 6 评论 -
反思|Android 列表分页组件Paging的设计与实现:架构设计与原理解析
本文是Android Jetpack Paging系列的第二篇文章;强烈建议 读者将本系列作为学习Paging 阅读优先级最高的文章,如果读者对Paging还没有系统性的认识,请参考:反思|Android 列表分页组件Paging的设计与实现:系统概述前言Paging是一个非常优秀的分页组件,与其它热门的分页相关库不同的是,Paging更偏向注重服务于 业务 而非 UI 。——我们都知道...原创 2019-12-01 23:39:36 · 1542 阅读 · 0 评论 -
反思|Android 列表分页组件Paging的设计与实现:系统概述
本文将对Paging分页组件的设计和实现进行一个系统整体的概述,强烈建议 读者将本文作为学习Paging 阅读优先级最高的文章,所有其它的Paging中文博客阅读优先级都应该靠后。原创 2019-10-25 17:40:56 · 2194 阅读 · 1 评论 -
Linux配置AndroidSDK&Jenkins远程部署
最近将公司的项目部署了Jenkins持续集成,遇到了几个麻烦的点,其中之一就是将Android SDK进行配置在远程服务器(总结下来还是自己对Linux命令还不够熟悉),特此记录。系统: Ubuntu Server 16.04.1 LTS 64位前置:完成JDK的环境搭建1.下载SDK点击进入下载网址 下载对应的 android-sdk_r24.4.1-linux.tgz 文件。2....原创 2018-10-10 00:37:44 · 2609 阅读 · 0 评论 -
[译]使用MVI打造响应式APP(一):Model到底是什么
原文:《REACTIVE APPS WITH MODEL-VIEW-INTENT - PART1 - MODEL》作者:Hannes Dorfmann译者:却把清梅嗅有朝一日,我突然发现我对于Model层的定义 全部是错误的,更新了认知后,我发现曾经我在Android平台上主题讨论中的那些困惑或者头痛都消失了。从结果上来说,最终我选择使用 RxJava 和 Model-View-Int...翻译 2019-03-04 00:46:32 · 2911 阅读 · 0 评论 -
[译]使用MVI打造响应式APP(三):状态折叠器
原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART3 - STATE REDUCER作者:Hannes Dorfmann译者:却把清梅嗅在上一章节中,我们针对 如何使用单向流和 Model-View-Intent 模式构建一个简单的页面 进行了探讨;本章节,我们将在reducer的帮助下实现MVI模式中更加复杂的页面。如果你还未阅读前两个章节,...翻译 2019-03-13 21:27:33 · 709 阅读 · 0 评论 -
[译]使用MVI打造响应式APP(二):View层和Intent层
《使用MVI打造响应式APP》翻译系列[译]使用MVI打造响应式APP(一):Model到底是什么[译]使用MVI打造响应式APP[二]:View层和Intent层[译]使用MVI打造响应式APP[三]:状态合并[译]使用MVI打造响应式APP[四]:IndependentUIComponents[译]使用MVI打造响应式APP[五]:DebuggingWithEase[译]使用M...翻译 2019-03-10 22:38:34 · 968 阅读 · 0 评论 -
[译]使用MVI打造响应式APP(四):独立性UI组件
原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART4 - INDEPENDENT UI COMPONENTS作者:Hannes Dorfmann译者:却把清梅嗅这篇博客中,我们将针对如何 如何构建独立组件 进行探讨,我将阐述为什么在我看来 父子关系会导致坏味道的代码,以及为何这种关系是没有意义的。有这样一个问题时不时涌现在我的脑海中—— MVI...翻译 2019-03-15 13:34:16 · 621 阅读 · 0 评论 -
[译]Object的局限性——Kotlin中的带参单例模式
原文:Kotlin singletons with argument——object has its limits作者:Christophe Beyls译者:却把清梅嗅在Kotlin中,单例模式被用于替换该编程语言中不存在的static成员和字段。 你通过简单地声明object以创建一个单例:object SomeSingleton与类不同,object 不允许有任何构造函数,如...翻译 2019-02-13 00:22:24 · 3889 阅读 · 1 评论 -
Android官方架构组件DataBinding-Ex: 双向绑定篇
争取打造 Android Jetpack 讲解的最好的博客系列:Android官方架构组件Lifecycle:生命周期组件详解&原理分析Android官方架构组件ViewModel:从前世今生到追本溯源Android官方架构组件LiveData: 观察者模式领域二三事Android官方架构组件Paging:分页库的设计美学Android官方架构组件Navigation:大巧不...原创 2019-01-15 23:48:55 · 8105 阅读 · 3 评论 -
Android官方架构组件LiveData: 观察者模式领域二三事
本文是 《Android Jetpack 官方架构组件》 系列的最后一篇文章,和一些朋友的观点不同的是,我认为它是 最重要 的核心组件,因为 LiveData本身很简单,但其代表却正是 MVVM 模式最重要的思想,即 数据驱动视图(也有叫观察者模式、响应式等)——这也是摆脱 顺序性编程思维 的重要一步。本文默认读者已经学习了 Lifecycle , 欢迎关注笔者的Jetpack系列:争取打...原创 2018-12-28 00:40:00 · 4025 阅读 · 3 评论 -
Android官方架构组件ViewModel:从前世今生到追本溯源
争取打造 Android Jetpack 讲解的最好的博客系列:Android官方架构组件Lifecycle:生命周期组件详解&原理分析Android官方架构组件ViewModel:从前世今生到追本溯源Android官方架构组件Paging:分页库的设计美学Android官方架构组件Navigation:大巧不工的Fragment管理框架实战:使用MVVM尝试开发Github...原创 2018-12-03 02:08:44 · 7851 阅读 · 7 评论 -
使用MVVM尝试开发Github客户端及对编程的一些思考
本文中我将尝试分享我个人 搭建个人MVVM项目 的过程中的一些心得和踩坑经历,以及在这过程中目前对 编程本质 的一些个人理解和感悟,特此分享以期讨论及学习进步。缘由最近在尝试搭建自己理解的 MVVM模式 的应用程序,在这近一个月中,我思考了很多,也参考了若干Github上MVVM项目源码,并从中获益匪浅。我根据所得搭建了一个MVVM开发模式的Github客户端,并托管在了自己的github上...原创 2018-11-09 00:37:32 · 3335 阅读 · 7 评论 -
Android Camera 系列(三)Camera API 详解
概述Camera 可能是接下来个人想深入学习的课题,准备新起一个系列,从个人的角度总结阐述自己对于 Android Camera 的研究过程,希望也能够对其他想学习 Camera 的同学一些帮助。本小节内容为 Android Camera 官方文档 的精要翻译,原文请参考:Android Camera: Camera API正文Android Framework 包括对设备上可用...原创 2018-10-15 19:39:08 · 5398 阅读 · 0 评论 -
Linux配置JDK和Tomcat
最近将公司的项目部署了Jenkins持续集成,遇到了几个麻烦的点,其中之一就是对JDK和Tomcat的配置,特此记录。本地系统:MacOS远程系统:CentOS_7_04_64_20G_alibase_201701015.vhd1.安装jdkyum search java|grep jdk 查看yum库中都有哪些jdk版本yum install java-1.8.0-openjdk...原创 2018-10-10 23:05:38 · 1404 阅读 · 0 评论 -
[译]使用MVI打造响应式APP(六):恢复状态
原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART6 - RESTORING STATE作者:Hannes Dorfmann译者:却把清梅嗅在前几篇文章中,我们讨论了Model-View-Intent(MVI)和单向数据流的重要性,这极大简化了状态的恢复,那么其过程和原理是什么呢,本文我们针对这个问题进行探讨。我们将针对2个场景进行探讨:在...翻译 2019-03-21 07:32:07 · 773 阅读 · 0 评论 -
[译]使用MVI打造响应式APP(五):轻而易举地Debug
原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART5 - DEBUGGING WITH EASE作者:Hannes Dorfmann译者:却把清梅嗅前文我们探讨了Model-View-Intent (MVI)架构模式及其相关特性,在 第一篇文章 中,我们谈到了 单项数据流的重要性 和 应用状态应该被业务逻辑驱动。本文我们将展示这种架构模式会怎样回...翻译 2019-03-17 22:15:20 · 666 阅读 · 0 评论 -
[译]使用MVI打造响应式APP[七]:掌握时机(SingleLiveEvent问题)
原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART7 - TIMING (SINGLELIVEEVENT PROBLEM)作者:Hannes Dorfmann译者:却把清梅嗅在之前的文章中,我们探讨了正确状态管理的重要性,以及我为什么认为使用类似 Github上Google架构组件的这个repo 中的 SingleLiveEvent 并不是一个好...翻译 2019-03-23 16:53:58 · 2531 阅读 · 0 评论 -
Android DataBinding使用总结(四)多类型列表展示
前言在我的前几篇文章中,简单学习了以下内容:Android DataBinding使用总结 (一) DataBinding的环境配置和基本使用Android DataBinding使用总结(二) DataBinding的所有基本使用方法Android DataBinding使用总结(三) DataBinding展示RecyclerView列表今天主要是学习一下如何展示RecyclerView多类型列原创 2017-05-31 19:34:38 · 3252 阅读 · 2 评论 -
反思|Android 事件分发机制的设计与实现
反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述Android体系本身非常宏大,源码中值得思考和借鉴之处众多。以整体事件分发机制为例,其整个流程涉及到了 系统启动流程(SystemServer)、输入管理(InputManager)、系统服务和UI的通信(ViewRootImpl + Window + WindowManagerService)、事件分发 等等...原创 2019-08-28 18:25:42 · 1832 阅读 · 1 评论 -
反思|Android View机制设计与实现:测量流程
反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述Android本身的View体系非常宏大,源码中值得思考和借鉴之处众多,以View本身的绘制流程为例,其经过measure测量、layout布局、draw绘制三个过程,最终才能够将其绘制出来并展示在用户面前。本文将针对绘制过程中的 测量流程 的设计思想进行系统地归纳总结,读者需要对View的measure()相...原创 2019-08-09 11:33:08 · 1325 阅读 · 1 评论 -
反思|Android View机制设计与实现:布局流程
反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述Android本身的View体系非常宏大,源码中值得思考和借鉴之处众多,以View本身的绘制流程为例,其经过measure测量、layout布局、draw绘制三个过程,最终才能够将其绘制出来并展示在用户面前。相比 测量流程 ,布局流程 相对简单很多,如果读者不了解 测量流程 ,建议阅读这篇文章:反思 | An...原创 2019-08-13 18:03:09 · 778 阅读 · 1 评论