<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[你好，开发者]]></title><description><![CDATA[请移步公众号「开发者如是说」]]></description><link>https://blog.csdn.net/github_35186068</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; github_35186068]]></copyright><item><title><![CDATA[程序员私藏：用「言叶」把碎片灵感秒变结构化知识，网页裁剪+AI问答让技术笔记自动生长]]></title><link>https://blog.csdn.net/github_35186068/article/details/163532904</link><guid>https://blog.csdn.net/github_35186068/article/details/163532904</guid><author>github_35186068</author><pubDate>Thu, 06 Aug 2026 12:41:09 +0800</pubDate><description><![CDATA[《程序员必备知识管理神器「言叶」深度测评》摘要：专为程序员打造的知识管理App「言叶」，完美解决技术笔记痛点。特色功能包括：1）聊天式快速输入，支持Markdown和代码块；2）一键网页转Markdown，完美保留技术文章结构；3）原生应用+自定义CSS/代码主题，极客编辑体验；4）AI问答功能，可针对笔记内容智能提问；5）热力图+回顾功能对抗遗忘。支持端到端加密和多端同步，是管理代码片段、技术博客、排查日志的理想工具。Android/iOS均已上线。]]></description><category></category></item><item><title><![CDATA[手机笔记总卡顿？「言叶」原生渲染+双端优化，iOS/Android 写 Markdown 终于不憋屈了]]></title><link>https://blog.csdn.net/github_35186068/article/details/162957314</link><guid>https://blog.csdn.net/github_35186068/article/details/162957314</guid><author>github_35186068</author><pubDate>Fri, 17 Jul 2026 09:59:54 +0800</pubDate><description><![CDATA[「言叶」是一款专注移动端体验的Markdown笔记软件，通过原生渲染技术解决手机端笔记卡顿、语法高亮缺失等痛点。其特色包括：iOS/Android双端原生优化，确保输入流畅；支持录音、网页裁剪等快速录入方式；提供多层级管理、间隔复习等知识管理功能；采用基于文件的同步方案（支持WebDAV/iCloud等），保障数据自主权；配备端到端加密和生物识别锁。该软件以极简设计实现专业笔记体验，适合追求流畅书写与数据安全的用户。目前已在App Store和Google Play上架。]]></description><category></category></item><item><title><![CDATA[Android 项目打包 api-versions.xml Stream closed]]></title><link>https://blog.csdn.net/github_35186068/article/details/124612832</link><guid>https://blog.csdn.net/github_35186068/article/details/124612832</guid><author>github_35186068</author><pubDate>Fri, 06 May 2022 16:19:13 +0800</pubDate><description><![CDATA[看错误的内容详情是读写 api-versions.xml 这个文件失败了，
../android-sdk/platform-tools/api/api-versions.xml java.io.IOException: Stream closed

可以到该目录下面检查该文件是否存在，是 platform-tools 版本问题，比如 29.0.3 上面解压之后存在 api 这个目录，30.0.3 上面就不存在这个目录。解决的一个办法是到官方仓库下载这个文件：
https://androidsdkmanage]]></description><category></category></item><item><title><![CDATA[当 Adapter 遇上 Kotlin DSL，无比简单的调用方式]]></title><link>https://blog.csdn.net/github_35186068/article/details/120244680</link><guid>https://blog.csdn.net/github_35186068/article/details/120244680</guid><author>github_35186068</author><pubDate>Sat, 11 Sep 2021 23:02:17 +0800</pubDate><description><![CDATA[早在去年的时候我就提到过使用工厂的方式获取 Adapter 而不是为每个 Adapter 定义一个类文件。这样的好处是，对于不是那么复杂的 Adapter 可以节省大量的代码，提升开发效率和解放双手，同时更好的支持多类型布局效果。
1、Kotlin DSL 和 Adapter 工厂方法
可以把 Kotlin DSL 当作构建者使用。这里有一篇不错的文章，想了解的可以阅读下，

https://www.ximedes.com/2020-04-21/kotlin-dsl-tutorial/

Kotlin DS]]></description><category></category></item><item><title><![CDATA[异步、非阻塞式 Android 启动任务调度库]]></title><link>https://blog.csdn.net/github_35186068/article/details/116427873</link><guid>https://blog.csdn.net/github_35186068/article/details/116427873</guid><author>github_35186068</author><pubDate>Wed, 05 May 2021 17:40:15 +0800</pubDate><description><![CDATA[1、背景
节前面试的时候被问到 Android 启动任务依赖怎么做调度。当时随口给了一个方案，后来想想觉得有意思就自己花了一天的时间写了一个。这个库已经开源到 Github 上面：
https://github.com/Shouheng88/AndroidStartup
在写这个库之前只是看了下 Jetpack 的 Startup. 毕竟，如果这个库已经非常完善了，那么我就没必要自己再搞一个了。截止目前，在我看来，这个库最大的缺点是，这个库所有的任务都在主线程中触发并执行，而我们为了优化启动的性能通常会将任]]></description><category></category></item><item><title><![CDATA[BitmapPool 了解吗？Glide 是如何实现 Bitmap 复用的？]]></title><link>https://blog.csdn.net/github_35186068/article/details/115754698</link><guid>https://blog.csdn.net/github_35186068/article/details/115754698</guid><author>github_35186068</author><pubDate>Fri, 16 Apr 2021 12:22:09 +0800</pubDate><description><![CDATA[highlight: agate
这个问题实际上是我前几天面试时遇到的一个问题，虽然我之前分析过 Glide 的源码，但是老实说，如果不是面试遇到这类问题，我根本不会留意 Glide 的 Bitmap 复用这块…不管怎么说，遇到了这个问题，我们就来看下 Glide 是如何实现 Bitmap 复用的吧~
1、“池化”以及对象复用
其实，说起“池化”以及对象复用，在 Android 中例子还是有这么几个的。典型的比如 Handler 中的 Message. 当我们使用 Message 的 obtain 获取消.]]></description><category></category></item><item><title><![CDATA[建议收藏，从 jCenter 迁移到 MavenCentral 完整方案]]></title><link>https://blog.csdn.net/github_35186068/article/details/115718467</link><guid>https://blog.csdn.net/github_35186068/article/details/115718467</guid><author>github_35186068</author><pubDate>Thu, 15 Apr 2021 10:46:44 +0800</pubDate><description><![CDATA[发布到 Maven Central 相关的教程挺多的，但是大部分存在问题。这篇文章是我在解决了很多问题的基础之上总结的，用来帮助需要的同学避免重蹈覆彻。需要的可收藏，万一用到了呢~
1、Farewell to Bintray jCenter
首先，告别下 bintray jcenter. 相比于 Maven Central，bintray jcenter 的性能和方便性确实好得多。可惜，jcenter 将要关闭了。jcenter 还是给我提供了很多的便利，对于其关闭深表可惜：

2、发布到 Maven Ce]]></description><category></category></item><item><title><![CDATA[个人从零开发一款 Android 应用、上线并盈利 | 项目复盘]]></title><link>https://blog.csdn.net/github_35186068/article/details/115036435</link><guid>https://blog.csdn.net/github_35186068/article/details/115036435</guid><author>github_35186068</author><pubDate>Sat, 20 Mar 2021 22:32:11 +0800</pubDate><description><![CDATA[最近个人开发的一款应用 言叶 刚刚发布了 1.4.0，至此，我想要开发的大部分功能已经完成了。本来我也想做一次复盘，刚好趁这个机会分析下并发出来。在这篇文章中，我想分析的并不仅仅是技术，除此此外，我也会分析下这个产品、开发过程中有哪些做得好和不好的地方以及接下来的打算。
1、项目背景
这个应用是一款笔记应用。其实，一开始要做它，我也是拒绝的。
因为我觉得这类应用门槛和天花板都比较低，同类和类似的应用都比较多，花费功夫做一个收益也不会太大。后来打算做是出于几个原因：

第一，我大概写了三周的电商爬虫并部署到.]]></description><category></category></item><item><title><![CDATA[拥抱新的交互方式，在 Android 中应用 MVVM]]></title><link>https://blog.csdn.net/github_35186068/article/details/114374770</link><guid>https://blog.csdn.net/github_35186068/article/details/114374770</guid><author>github_35186068</author><pubDate>Thu, 04 Mar 2021 18:14:52 +0800</pubDate><description><![CDATA[1、个人的开源库
不知不觉维护自己的几个开源库已经快两年了，现在我已经成功地将它们应用到了我的多个产品上面，比如 言叶。通过使用这些开源库能够大大降低开发的复杂度，为我节省大量的代码，提高效率。前些日子忙着做应用的新特性，现在终于有了些许时间。这里介绍下我的开源库，以及我做个人开发过程中如何通过新特性和技巧简化开发的。

其实之前我也写了很多文章了介绍自己的设计了，这应该是最后一篇了吧，所以尽可能做到集大成吧。
2、Jetpack
Google 最新推出的 Jetpack 里出了很多好玩的框架，这里我的 V]]></description><category></category></item><item><title><![CDATA[java.lang.ClassCastException: android.widget.HeaderViewListAdapter cannot be cast to a.c.h.f.a.k at]]></title><link>https://blog.csdn.net/github_35186068/article/details/112572092</link><guid>https://blog.csdn.net/github_35186068/article/details/112572092</guid><author>github_35186068</author><pubDate>Wed, 13 Jan 2021 16:22:11 +0800</pubDate><description><![CDATA[异常记录，一个系统层面的错误
错误堆栈如下，
java.lang.ClassCastException: android.widget.HeaderViewListAdapter cannot be cast to a.c.h.f.a.k
	at a.c.h.g.va$a.onKeyDown(SourceFile:9)
	at android.view.KeyEvent.dispatch(KeyEvent.java:2929)
	at android.view.View.dispatchKeyEvent(V]]></description><category></category></item><item><title><![CDATA[为你的应用集成谷歌结算（客户端集成+服务端校验）]]></title><link>https://blog.csdn.net/github_35186068/article/details/111477113</link><guid>https://blog.csdn.net/github_35186068/article/details/111477113</guid><author>github_35186068</author><pubDate>Mon, 21 Dec 2020 16:04:51 +0800</pubDate><description><![CDATA[最近在开发自己的一款新产品 言叶，上架到谷歌商店之后有国外用户反馈想要使用谷歌支付，于是我准备为自己的应用集成谷歌结算以允许用户进行内购付款。
之前我完全没用集成过谷歌支付，从寻找到的一些资料来看，谷歌结算的开发方式已经做了调整，新的开发方式比之前使用 AIDL 开发要简单一些。
1、客户端集成
1.1 文档资料
对于客户端集成，官方文档已经给了比较详尽的说明，这里对应的文档资料提供一下：

库集成文档《将 Google Play 结算库集成到您的应用中》，链接：https://developer.andr]]></description><category></category></item><item><title><![CDATA[Android Studio 错误记录：If you already have a 64-bit JDK installed ,defined a JAVA_HOME variable..]]></title><link>https://blog.csdn.net/github_35186068/article/details/109028418</link><guid>https://blog.csdn.net/github_35186068/article/details/109028418</guid><author>github_35186068</author><pubDate>Mon, 12 Oct 2020 15:28:18 +0800</pubDate><description><![CDATA[Android Studio 启动的时候报错，错误详情如下：
If you already have a 64-bit JDK installed ,defined a JAVA_HOME variable in Computer&gt;System Properties&gt;System Settings&gt;Environment Variables Failed to create JVM .JVM Path: xxxx
可以使用 java -version 查看是否是 jdk 的位数问题，另外检]]></description><category></category></item><item><title><![CDATA[个人开源库的一些更新，兼谈Jetpack和Kotlin给Android开发带来的变化]]></title><link>https://blog.csdn.net/github_35186068/article/details/109019359</link><guid>https://blog.csdn.net/github_35186068/article/details/109019359</guid><author>github_35186068</author><pubDate>Sun, 11 Oct 2020 23:35:48 +0800</pubDate><description><![CDATA[前段时间，我开发完成了新的软件 移动工具箱。最近，我准备把开发过程中总结的一些东西沉淀到自己个人开源的几个库中。最新的一些更新中运用了 Kotlin 和 Jetpack 的一些语法特性，故此总结一下。Jetpack 和 Kotlin 出来已经很久了，然而很多应用开发还停留在 MVP 以及 Java 阶段，即便使用了 Kotlin，很多人只不过是像使用 Java 一样在使用 Kotlin. 实际上，如果能够结合 Kotlin 和 Jetpack 的语法特性，可以大大提升我们日常开发的效率。下面，我以个人开源库]]></description><category></category></item><item><title><![CDATA[从零搭建基于 Java 的服务器生产环境]]></title><link>https://blog.csdn.net/github_35186068/article/details/108908687</link><guid>https://blog.csdn.net/github_35186068/article/details/108908687</guid><author>github_35186068</author><pubDate>Sat, 03 Oct 2020 11:02:23 +0800</pubDate><description><![CDATA[之前的文章介绍了我最近开发的一款工具软件 移动工具箱，然而安装包放在华为应用市场上面，如果不安装华为应用市场就无法下载软件，无奈，只能自己从零搭建一个服务器来进行应用的宣传和下载。搭建一个服务器是很简单的，这里我们将服务器的要求提高一些，以对标 “生产” 的标准进行要求，要做的东西比较多，故作此文，加以记录。
首先说下环境，腾讯云，CentOS 7.5 64 位，服务器采用 Java 完成，具体来说就是 Springboot. 大致罗列下要做的事情：

介绍服务器远程连接方式
进行基础的服务器安全配置

禁]]></description><category></category></item><item><title><![CDATA[加固了就安全了？几个措施让你的 Android 应用更安全]]></title><link>https://blog.csdn.net/github_35186068/article/details/108883619</link><guid>https://blog.csdn.net/github_35186068/article/details/108883619</guid><author>github_35186068</author><pubDate>Wed, 30 Sep 2020 13:13:44 +0800</pubDate><description><![CDATA[1、背景
最近新开发了一款工具类型的软件 移动工具箱，然而某天下午忽然群里来了一个不速之客说我的软件被破解了。虽然，该软件无需付费并且没有广告（很良心 ???? ），也进行了安全加固，但是还是很轻易得被别人破解了。现象是，启动页换成了别人的页面，需要用户点击页面上的按钮分享几次破解者的信息才能进入应用。并且，每次打开应用都是如此。
看到这我的心情还是非常复杂的。一开始觉得自己做个应用都赚不到钱，还要被这些人利用。本是同根生，相煎何太急呀。然而，转念一想，这里有些东西还是可以学习一下，于是我去他们的链接下载了]]></description><category></category></item><item><title><![CDATA[一个高性能、功能丰富、可自定义的 Android 相机库 iCamera 的设计和开发过程]]></title><link>https://blog.csdn.net/github_35186068/article/details/108331738</link><guid>https://blog.csdn.net/github_35186068/article/details/108331738</guid><author>github_35186068</author><pubDate>Mon, 31 Aug 2020 23:22:56 +0800</pubDate><description><![CDATA[1、背景介绍
去年年初的时候写过一篇文章 《CameraX：Android 相机库开发实践》，那时我想自己写一个 Android 相机库，但是因为名字和谷歌关放的 CameraX 冲突了，所以现在我将自己的项目改名为 iCamera.
之前的文章中也交代过一些 Android 相机库的背景，本身集成相机功能到自己的项目中并不复杂，但是如果设计一个功能全面的 Android 相机库就没那么简单了——你要满足更多用户的需求，基本的缩放、闪光灯等这些在日常开发中不会涉及的功能都要支持；此外，你还要处理相机的各种支]]></description><category></category></item><item><title><![CDATA[跨平台、多用户协作的移动应用 (安卓+iOS) 多语言管理工具]]></title><link>https://blog.csdn.net/github_35186068/article/details/108310157</link><guid>https://blog.csdn.net/github_35186068/article/details/108310157</guid><author>github_35186068</author><pubDate>Sun, 30 Aug 2020 19:58:30 +0800</pubDate><description><![CDATA[1、项目背景
TranslateMyApp 项目是我之前为了在 Android 应用中集成多语言而开发的一个工具，当时主要为了解决应用的词条的多语言翻译问题，然而实际应用的时候发现起存在诸多的不便之处。最近当我开发 言叶APP 的时候，为了减少多语言维护的工作量，重新开发了这个应用。现在它具备了更多功能和特性，可以满足更多的应用场景。该项目基于 Python 开发，项目地址：

https://github.com/Shouheng88/TranslateMyApp
https://gitee.com/Wn]]></description><category></category></item><item><title><![CDATA[用这个库解决你的图片压缩和加载问题]]></title><link>https://blog.csdn.net/github_35186068/article/details/106593668</link><guid>https://blog.csdn.net/github_35186068/article/details/106593668</guid><author>github_35186068</author><pubDate>Sat, 06 Jun 2020 21:18:53 +0800</pubDate><description><![CDATA[在 Android 应用中，图片是占用内存资源比较多的一部分。如何在应用当中加载并处理图片的同时又能够保证程序响应的效率呢？你可以使用我开发的这个库：Compressor。
随着新版本 1.3.5 的发布，这个库已经支持了非常多的功能，并且支持在 Kotlin 协程中获取压缩的结果。之所以添加这些功能是因为在之前我做的应用都是与 CV 相关的，所以不可避免地要面对林林种种的应用场景。能够支持更多的应用场景，这也是这个库与其他的很多框架不同的地方。
下面就通过示例一一介绍下如何使用该库处理各种应用场景。
1、]]></description><category></category></item><item><title><![CDATA[2020 年，我这样在项目中使用 MVVM]]></title><link>https://blog.csdn.net/github_35186068/article/details/106298010</link><guid>https://blog.csdn.net/github_35186068/article/details/106298010</guid><author>github_35186068</author><pubDate>Sat, 23 May 2020 11:46:56 +0800</pubDate><description><![CDATA[最近看到了几篇与 Jetpack MVVM 有关到文章，使我不禁也想淌一下这场混水。我是在 2017 年下半年接触的 Jetpack 的那套开发工具，并且后来一直将其作为开发的主要框架。在这段时间的使用过程中，我踩过一些坑，也积累了一些经验，为了将其推广到其它到项目中又专门封装出了一个库。当然，Jetpack 所提供的组件已经比较完善，我的工作只能算是锦上添花。下面我就介绍下，现在我是如何在项目中使用 Jetpack MVVM 的。
1、后起之秀和黯然失色的 MVP
MVP 非常强大，也是或者曾经是很多大公]]></description><category></category></item><item><title><![CDATA[一个少见的线上 Crash 分析：Caused by: java.lang.IllegalStateException: View DecorView@2918947[RoomManageActivi]]></title><link>https://blog.csdn.net/github_35186068/article/details/103924869</link><guid>https://blog.csdn.net/github_35186068/article/details/103924869</guid><author>github_35186068</author><pubDate>Fri, 10 Jan 2020 15:08:51 +0800</pubDate><description><![CDATA[Take the Dialog for example.
Judge from the Android source code, let’s watch what happened when you called method Dialog#show() method. The code can be simplified as below:
    public void show() {
  ...]]></description><category></category></item></channel></rss>