<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[half_bottle的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/half_bottle</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; half_bottle]]></copyright><item><title><![CDATA[使用breakpad收集native奔溃日志及dump解析]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/121326160</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/121326160</guid><author>half_bottle</author><pubDate>Mon, 15 Nov 2021 00:01:37 +0800</pubDate><description><![CDATA[使用breakpad收集native奔溃日志及dump解析
本文是学习使用breakpad的一个总结，在这过程中看了很多博客，但是相对有用的有以下几篇：

Android使用Google Breakpad进行崩溃日志管理
breakpad的正确编译和常规用法
Google Breakpad 学习笔记

环境：win10 linux 子系统，ubuntu 20，android-ndk-r20
一、源码编译
先到github下载google/breakpad的源码，在ubuntu下编译。
总共遇到了三个问题(实]]></description><category></category></item><item><title><![CDATA[Android Camera NV21图像裁剪]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/107795355</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/107795355</guid><author>half_bottle</author><pubDate>Sat, 08 Aug 2020 12:07:54 +0800</pubDate><description><![CDATA[/**
 * 任意裁剪YUV420SP格式，这种存储格式决定了 left, top, clipW, clipH 必须是偶数。
 * 如果传进来的不是偶数，函数内部会处理成偶数，left、top会向右下或者左上偏移一个像素
 * 显示的图像颜色不对，不是绿就是蓝。
 * 裁剪的原理：
 * 1. NV21(YUV420SP)的存储格式：先逐行存储Y，再交叉存储VU，Y的大小是width*height，VU的大小是 width*height/2；
 * 2. 裁剪时，可以想象原始数据byte[] src是一个二]]></description><category></category></item><item><title><![CDATA[动手写一个Android运行时权限申请帮助工具]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/107577894</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/107577894</guid><author>half_bottle</author><pubDate>Sat, 25 Jul 2020 16:39:45 +0800</pubDate><description><![CDATA[目录概述运行时权限申请流程如何实现如何使用项目地址感谢
概述
Android系统不断更新，对隐私安全方面的控制越来越强。因为隐私安全条款不断更新，有时候会因为运行时权限专门发一个app补丁版本。
原生申请运行时权限相对来说较为麻烦，而且都是模板代码，如果直接使用，则需要重复大量的模板代码。所以，有必要为运行时权限申请
写一个方便工具。github中不乏现成的优秀的运行时权限项目，如：AndPermission，
还有一些甚至使用了AOP来实现的。那么为什么还要重复造轮子？不是开玩笑，主要是因为闲的，时间允许]]></description><category></category></item><item><title><![CDATA[浅谈Android SDK开发]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/107349848</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/107349848</guid><author>half_bottle</author><pubDate>Thu, 16 Jul 2020 00:41:58 +0800</pubDate><description><![CDATA[概述
最近接到一个需求，把现在开发的app，包装成一个SDK，对外提供接口，让第三方应用集成我们app的能力。简单描述一下项目的现状，一个壳工程module：app_shell，项目主要代码在app module，其它还有简称为：lib1,lib2，lib3，lib4，lib5，五个module，其中，app依赖lib1-lib5，lib1-lib5部分相互之间也有依赖。
前前后后投入来大概五个工作日的时间，勉强实现封装app及其依赖的模块为一个aar。为什么要这么久？难道不是改app的build.grad]]></description><category></category></item><item><title><![CDATA[AspectJ 编程指南]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/106225051</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/106225051</guid><author>half_bottle</author><pubDate>Sun, 07 Jun 2020 22:16:16 +0800</pubDate><description><![CDATA[title: AspectJTM 编程指南
created: ‘2020-05-19T07:52:07.055Z’
modified: ‘2020-05-19T10:27:10.370Z’
AspectJTM 编程指南
AspectJ 团队
Copyright © 1998-2001 Xerox Corporation, 2002-2003 Palo Alto Research Center, Incorporated. All rights reserved.
摘要：
本编程指南描述了Aspect语言，.]]></description><category></category></item><item><title><![CDATA[Android屏幕适配方案: AutoDensity&smallest-width]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/106597705</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/106597705</guid><author>half_bottle</author><pubDate>Sun, 07 Jun 2020 14:38:43 +0800</pubDate><description><![CDATA[目录前言一、屏幕适配的重要概念1.1 屏幕尺寸、屏幕分辨率、屏幕像素密度1.2 px、dp、dip、dpi1.3 mdpi、hdpi、xdpi、xxdpi1.4 values-sw[xyz]dp二、smallest-width适配方案三、AutoDensity适配方案四、最佳做法五、参考
前言
一个Android开发工程师，在其入门后遇到的第一个考验估计就是屏幕适配。按照谷歌的适配规则，使用wrap_content、match_parent、dp等，当UI工程师换一个设备验收时，提出各种问题。这时候，估计很]]></description><category></category></item><item><title><![CDATA[Android WorkFlow 助你轻松构建复杂流程]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/106167961</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/106167961</guid><author>half_bottle</author><pubDate>Sun, 17 May 2020 23:07:59 +0800</pubDate><description><![CDATA[概述
有时候会遇到这样一种需求，

]]></description><category></category></item><item><title><![CDATA[一行代码实现Android App指引]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/106151515</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/106151515</guid><author>half_bottle</author><pubDate>Sat, 16 May 2020 13:54:34 +0800</pubDate><description><![CDATA[目录概述指引需求分析入门级指引升级版指引指引需求的抽象指引的技术实现指引的要素：Shape封装指引步骤：GuideInfo绘制指引要素：GuideView管理指引：GuideManager承载GuideView的载体：GuideDialog接入项目关键技术点定位高亮区域绘制高亮的View区域高亮区域点击事件优缺点项目地址总结
概述
前几周app改版，在修改老代码的过程中发现了一个指引，让我想起很久以前项目里指引实现是在布局文件中添加布局，并在代码中插入很多非业务的代码，这样写感觉不好。指引本只是一个不太重要]]></description><category></category></item><item><title><![CDATA[HashMap源码分析]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/104179999</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/104179999</guid><author>half_bottle</author><pubDate>Thu, 06 Feb 2020 11:32:34 +0800</pubDate><description><![CDATA[概述
HashMap实现了Map&lt;K, V&gt;接口，通过键-值(key-value)的方式存取数据。内部的数据结构是数组+链表(或者Tree)，插入时通过key的hash值，映射（(n - 1) &amp; hash，其中n为数组的长度）到数组中的位置，如果hash值重复，则在链表的末端插入（当一个链表中的数据大于等于8个时，就将链表转变为Tree），而当数组达到一定值时，会resize...]]></description><category></category></item><item><title><![CDATA[一个Socket通信案例]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/92801538</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/92801538</guid><author>half_bottle</author><pubDate>Thu, 30 Jan 2020 14:00:19 +0800</pubDate><description><![CDATA[概述
到了新的公司，开始新的工作已两个月有余，从一个坑跳到了另一个坑，就直接说说现在遇到的问题吧。公司的产品客户端需要通过socket和C++后台交互，既然是socket，也就这么一个流程：通过配置文件，解析服务器的地址和端口；打开socket通道，建立和服务器的长链接；和服务器通信；应用退出，关闭连接。问题在这里，和服务器通信，拿到一个完整的消息后，通过解析指令的参数，进行不同的处理，我接手的代...]]></description><category></category></item><item><title><![CDATA[一次CPU使用率100%引发的思考]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/103555528</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/103555528</guid><author>half_bottle</author><pubDate>Sun, 15 Dec 2019 23:49:22 +0800</pubDate><description><![CDATA[一次CPU使用率100%引发的思考
最近要发一个版本，临了测试在挂机的时候发现一个CPU占用高，导致App卡死的bug。经过这次bug
真切感受到写代码完成功能容易，一旦代码量上去了，出问题的时候如何定位就是个难题。为了尽可能
少地避免这种上线后出现问题，出现问题后及时修复，掌握必要的问题分析工具和严谨的日志记录
是一个程序员的基本素养。本次事件对app开发的启示和使用的工具方法等：

必须有一个...]]></description><category></category></item><item><title><![CDATA[记一次Android UI适配填坑经过]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/103336546</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/103336546</guid><author>half_bottle</author><pubDate>Sun, 01 Dec 2019 22:25:02 +0800</pubDate><description><![CDATA[记一次Android UI适配填坑经过
概述
Android的多屏幕适配算是一个老生常谈的话题，也是一个Android应用开发工程师的必备技能。Android设备五花八门，屏幕小到手表，大到几十上百英寸的TV，相同分辨率，不同屏幕尺寸，相同屏幕尺寸，不同分辨率，还有各大厂商的不同系统固件…一个app，要做这么多适配工作，真是太难了。
言归正传，最近加入了一个没有自带屏幕的android设备项目组，...]]></description><category></category></item><item><title><![CDATA[从观察者模式的角度分析 Lifecycle-aware components]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/88564829</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/88564829</guid><author>half_bottle</author><pubDate>Sun, 01 Sep 2019 09:20:19 +0800</pubDate><description><![CDATA[前言
使用RxJava2有一段时间了，由于没有认真去研究过，一直停留在简单的使用阶段，更准确地说是在Retrofit中配合RxJava2CallAdapter使用RxJava2的强大能力。心血来潮（迫切需要），想了解下RxJava2可能导致的Activity内存泄漏问题。先是看了一下RxLifeCycle，浏览了不少博客，其中有一篇说到，RxLifeCycle的作者已经不推荐使用这个项目了，而推荐...]]></description><category></category></item><item><title><![CDATA[Ubuntu 16.04/18.04/20.04 LTS Android 7.1 RK3399编译环境]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/99960610</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/99960610</guid><author>half_bottle</author><pubDate>Sat, 31 Aug 2019 18:26:10 +0800</pubDate><description><![CDATA[Ubuntu 16.04 LTS 编译 Android 7.1
编译环境

系统: Ubuntu 16.0.4，U盘安装即可(不要双系统或者单独安装)
gcc/g++: 5.4.0 (系统自带，不用自己安装)
python: 2.7.12 (系统自带，不用自己安装)
GUN make: 4.1 (系统自带，不用自己安装)
OpenJDK 8:  sudo apt-get install openj...]]></description><category></category></item><item><title><![CDATA[Android自定义View-矩形圆角进度条]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/98797151</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/98797151</guid><author>half_bottle</author><pubDate>Tue, 13 Aug 2019 23:16:21 +0800</pubDate><description><![CDATA[参考

Android Canvas 绘制 剪切 clip 与 几何变换
Android Canvas绘图详解（图文)


]]></description><category></category></item><item><title><![CDATA[Android自定义View——电池]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/98673200</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/98673200</guid><author>half_bottle</author><pubDate>Tue, 06 Aug 2019 23:58:40 +0800</pubDate><description><![CDATA[最近的工作中有一个需求，需要显示电量，产品说前面的开发已经做了，就在另一个项目里，复制过来就好了。行，那就复制呗，结果一看，真是惊呆了，用的是一个layer-list的drawable，里面就11种状态，从0到100%。如果要显示11%呢，怎么办？好吧，这种坑已经见怪不怪了，相对于其它坑，这算不上问题，填坑吧。]]></description><category></category></item><item><title><![CDATA[如何优雅地使用GreenDao]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/85728144</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/85728144</guid><author>half_bottle</author><pubDate>Sat, 12 Jan 2019 21:04:45 +0800</pubDate><description><![CDATA[前言
数据库是Android开发中的重要部分，通常我们不会使用SDK中的Sqlite API，而是使用第三方的ORM框架，如 GreenDao。在实际的开发中，发现一件比较有意思的事(体现了无组织无纪律)：同一个小组里面的几个同事，每个同事都有自己的使用方法，有的同事比较狂放不羁，不在乎细节，写一个包含Database和DaoSession对象的单例模式，满世界调用getDaoSession()，...]]></description><category></category></item><item><title><![CDATA[一个Android Log框架]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/85242341</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/85242341</guid><author>half_bottle</author><pubDate>Thu, 03 Jan 2019 22:45:30 +0800</pubDate><description><![CDATA[一个易用、高性能、可扩展的 Android Log概述Log 需求欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题，有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能，丰富你的文章UML 图表FLowc...]]></description><category></category></item><item><title><![CDATA[Jenkins 持续集成之使用批处理替换文件中的目标字符串]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/82874310</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/82874310</guid><author>half_bottle</author><pubDate>Thu, 27 Sep 2018 22:12:02 +0800</pubDate><description><![CDATA[Jenkins 持续集成之使用批处理替换文件中的目标字符串
一、背景
在 Android 项目开发中使用 Jenkins 持续集成，将可以解耦的 module 作为一个独立项目，然后在 Jenkins 上自动打包，推送到 maven 私服，最后主工程通过 gradle 将 aar 包添加到项目中。一般情况下，当 module 的版本发生改变时，只需要修改build.gradle 中的 versio...]]></description><category></category></item><item><title><![CDATA[七牛云存储之文件上传(Android)]]></title><link>https://blog.youkuaiyun.com/half_bottle/article/details/82858545</link><guid>https://blog.youkuaiyun.com/half_bottle/article/details/82858545</guid><author>half_bottle</author><pubDate>Wed, 26 Sep 2018 20:12:06 +0800</pubDate><description><![CDATA[七牛云存储之文件上传
项目中要用到七牛云存储，用于存储用户的文件数据，于是，看了一下七牛的文档（Android SDK 和 Java SDK），写了一个 demo 。本文记录一下 android 端上传文件到七牛服务器的步骤，并对七牛云存储使用的一些问题作出了一些思考。demo 实现了单个文件上传，多个文件上传，多个文件排队上传。详情请参考七牛官方文档。
一，注册七牛账号，并创建存储空间

注册
...]]></description><category></category></item></channel></rss>