- 博客(90)
- 资源 (25)
- 收藏
- 关注

原创 三年开发经验,抖音离职后,拿到Airbnb、快手、小红书、猿辅导等多家公司的offer
前言我这篇文章并不是简单的描述一些面试中的题,或者总结一些Android的知识,而是想记录我整个的想法和准备的过程,以及一些心得体会,让大家更加全面的去看待工作、跳槽和生活(从我的角度,当然肯定有不合理的地方,大家借鉴就好)在字节跳动的两年时间中见证了抖音从百万日活到2.5亿、团队从10人到100多人的过程,技术上不同时期的选型以及迭代、沉淀和更替。项目上经历了一个工程到模块化再到组件化最后插...
2020-05-07 11:03:55
51027
347

原创 一年Android工作经验,今日头条 阿里 百度 网易 美团 小米 快手面经
前言 人生困难重重,在漫长而艰辛的前行路上,坚持不懈、脚踏实地的“低头拉车”固然重要。但认清形势、找准目标的“抬头看路”也很关键,甚至决定着你能否达到成功彼岸。只寻求远方的梦想,而不付出当下的努力,那是迷梦;只知道埋头苦干,而不认清方向,那是徒劳。先简单说说我最近的面试经历吧。面试的公司很多,大部分最后都能得到令人满意的结果,我将这些体会记录下来,面了这么多公司,如果不留下什么,那岂不是太浪费
2017-06-22 20:11:53
23621
25
原创 美国圣诞8日西海岸自驾游
一晃已经1年半过去了,2020年年初在美国西海岸的旅游事情,回来后总说抽个时间记录一下,但是总是因为懒,一直往后脱,这一脱就是1年半,正好中秋没有出去玩,天气也不好,伴随着窗外的雨,把之前的旅游经历记录一下。为什么我想把这段经历记录下来,我们努力的工作,努力的赚钱,就是为了一个更好的物质生活,但是慢慢的我们可能会忘记了初衷,陷入了每日“996”的泥潭中,而不自知,为了产品的完美,为了每一个细节,而绞尽脑汁、通宵加班。我想留住或者加深那些可以让我洒脱的生活经历。在疫情前,入职Airbnb的新同事,都需要到
2021-09-20 12:47:49
2249
原创 程序员的蜕变之旅-健身
前言标题起的有点SAO,哈哈。其实就是健身,我自从毕业后一直在保持着锻炼这个习惯,也曾一直梦想能锻炼出8块腹肌,成为大肌霸,奈何现实太残酷,断断续续锻炼坚持了3年后,只能说身形不胖,有那么一丁点肌肉线条,但是离肌肉男还查的很远,再加上我的工作性质需要经常加班,所以没有很多的时间让我保持一个高强度的训练。契机疫情期间我们公司一直是在家办公,那么就节省了上下班的3个小时,那么这3个小时用来做什么...
2020-04-30 11:25:28
3578
3
原创 Lottie 浅析
Lottie 简介Lottie是是一个可以解析Adobe After Effects使用BodyMovin插件导出的动画json文件,并且渲染到手机和网页上的库,Lottie支持Android,iOS,Web和Windows。Lottie Android如何使用Lottie在Android仅支持Gradle的形式依赖,需要在你的build.gradle中添加以下的依赖dependenci...
2019-11-29 18:56:39
3319
原创 北京三日自驾游-和狗狗的秦皇岛之旅
前序生活不止眼前的苟且,还有诗和远方努力工作是为了更好的体验生活,需要偶尔停下脚步看看路旁的风景,所以我们趁着中秋放假,体验了一把秦皇岛3日自驾游,由于带上了狗,所以所有的去玩的地方和住宿的地方都需要提前了解清楚,虽然少了很多选择,但是又多了很多意外的惊喜,我就把这次旅游的体验记录下来,成为美好的回忆。一个好的旅游体验,一定要有一个好的计划,这是我这几次出去玩最深刻的体会,所以在这里非常感谢...
2019-10-31 14:29:31
3140
翻译 Gradle Task Configuration Avoidance
这个章节介绍了处理任务时"避免配置",并且解释了迁移构建以有效实用配置避免api的一些指导原则,这里描述的API与现有的API共存,但是现有的API将在以后的几个重要版本中被代替。在Gradle 5.1中,我们建议使用配置避免的API来创建自定义的Plugins。配置避免API是如何工作的?在nutshell中,该API允许构建避免在Gradle的配置阶段创建和配置任务的成本,而这些任务永远不...
2019-09-29 19:46:43
2558
原创 优雅的减小包体积-优化图片
前言老话常谈,我们每次引入新的优化手段,都需要详细调研,明确优缺点,以及引入这项技术或者功能,能给现有的项目带来什么收益以及带来哪些不便。首先我们要搞明白为什么要优化包体积?普遍认为的减少包体积有以下几个好处:下载转换率,体积越小下载率越高如果需要和厂商合作进行预装,由于预装空间是有限的,体积越小,成本越低推广一般按照流量收费,同理,安装包体积越小,成本越低减少应用占用手机的储存空间...
2019-08-30 19:26:45
3117
原创 Paging Library-初探分页库
简介在2018年5月9日的谷歌开发者大会(Google I/O 2018) 中提出在去年发布的广受欢迎的架构组件上,进一步改进并推出了Jetpack。Jetpack能帮助我们更专注提升应用体验,加快应用开发速度,处理类似后台任务、UI 导航以及生命周期管理等。发布的新版 Android Jetpack 组件中更新的内容包括 4 个部分:WorkManager、Paging、Navigation...
2019-07-26 19:42:56
2283
1
原创 Gradle-初探代码注入Transform
简介本文主要介绍gradle打包过程中transform阶段,这里大概说下AOP(Aspect Oriented Programming),这是一种面向切面的思想,预支对应的是OOP(Object Oriented Programming)面向对象编程,这里不展开说明。可以看下对AOP总结的思维导图划重点本篇文章主要介绍下面的几点:Transform可以做什么简单了解App打包过程,...
2019-05-29 09:33:50
8819
3
原创 浅析Android插件化
前言在Android 9.0的jar包中,可以发现很多函数添加了@hide,这表示google显示了对@hide api的反射调用,上有政策,下有对策,我天朝人民的智慧是无穷尽的,具体的方案可以参考一种绕过Android P对非SDK接口限制的简单方法。按理说只要在Android 9.0的手机反射调用了@hide的api都不会work。但是我在华为的p20上测试,还是可以使用的,说明华为对goo...
2019-04-28 21:42:14
3550
原创 基于ASM的组件化框架
背景我们在开发一个应用时,会随着时间、人员和需求的增多,我们的代码也会以一个非常快的速度在迭代,同时由于每个人的开发水平不一样,就会有各种各样的问题,如果一直在一个project中开发,很快演变成一个高耦合、臃肿和复杂的项目,所以我们就需要对项目进行优化,我们经常听的有模块化、组件化和插件化,这三者的差异可以看下这篇文章本文主要介绍组件化,现有的组件化方案:SPI(Service Prov...
2019-03-25 14:06:07
3834
原创 apk打包流程
aapt资源编译编译assets目录和res/raw目录下的资源编译res目录下的资源文件给res目录下的每个资源赋予一个资源ID,生成resource.arsc资源索引文件解析并编译AndroidMainifest.xml资源打包成*.ap_,资源ID常量定义自R.java资源索引aapt给每一个非assets目录的资源定义一个资源ID,它是一个4字节(byte = 32bit...
2019-02-25 13:44:13
2847
原创 字节跳动屏幕适配方案解读
说来惭愧,这个方案在微信公众号推出来的时候,我才去了解我司自己的适配方案。字节跳动屏幕适配方案重点为什么要做屏幕适配从数据上告诉你安卓手机屏幕的碎片化我司的适配方案适配中出现的问题实际演练为什么要做屏幕适配在Android开发中,由于Android的碎片化严重,屏幕分辨率千奇百怪,想要在各种分辨率的设备上显示一致的效果,适配成本越来越高。虽然Android官方提供了dp单位来...
2019-01-19 12:57:25
6186
1
原创 手摸手带你走进Kotlin Coroutine
参考文章kotlin官网kotlin githubRoman Elizarov 视频(基于1.3之前的,一些用法已经改变,但是主要看原理和思想)Roman Elizarov 视频深入(基于1.3之前的,一些用法已经改变,但是主要看原理和思想)Roman Elizarov 基于1.3讲解jakeWharton 的适配Retrofit的adapterCoroutine的优势简化异步编...
2018-12-24 11:33:37
3556
原创 轻量级的MVVM
背景现在的项目中各种开发框架都有,MVC,MVP,MVVM。比较混乱,虽然也推出了MVVM,但是由于没有强制和代码历史的问题,大部分的时候还是使用之前的开发框架进行开发,所以现在整个项目的结构比较复杂和混乱。先设立一个小目标,先在咱们组内,统一开发框架,实践出真知,在实践中检测这个框架的易用性,然后加以改造,在推广出去。目标老话再谈,在已有的项目中引入、更新框架,都是有成本的,这就需要分析...
2018-11-25 17:11:01
2928
原创 Gradle-自定义plugin
为什么要学习GradleGradle目前已经应用于多个Android开发的技术体系中,比如构建系统、插件化、热修复和组件化,如果不了解Gradle,那么对于上述技术体系的了解会大打折扣上述一段文字是比较传统的解释,我开始系统的学习gradle是因为,项目由于引入了组件化的开发模式,模块之间的通信就需要引入一种新的方式,之前一直使用的是SPI,但是在service比较多的时候会影响到冷起的时...
2018-10-28 13:57:14
2896
原创 优雅的使用Kotlin
优雅的使用Kotlin这篇文章并不会从零开始来教你怎么使用Kotlin,Kotlin对于笔者来说也是一个新概念,由于大势所趋(Google所有的官方Demo都开始用Kotlin,各大第三方Library也开始适配Kotlin),所以不会Koltin寸步难行呀~,经过一段时间的学习和练习,对Kotlin有了一点浅薄的理解,在此记录下来,希望能给大家带来帮助。开始进入主题,我打算从下面几个方面来给...
2018-09-26 11:31:13
5459
原创 优雅的监听软键盘隐藏
背景Android软键盘的显示和隐藏,从开始做直播这块,就一直困扰着我。从布局挤压,到输入区显示不全,再到闪屏以及卡顿,这里的坑让我跌倒无数次。各种布局监听,回调,代码冗余、复杂、与业务强耦合无法复用,还是没有很好的解决键盘的弹出和隐藏为了给用户更好的操作体验,决定找到一种最优解决方案。科普基础知识-WindowSoftInputModeActivity 的主窗口与包含屏...
2018-08-11 16:43:28
8518
5
原创 Retrofit2源码阅读
本次分析的要点: 1. Retrofit中的动态代理和整个流程(Proxy、ServiceMethod、OkHttpCall) 2. Retrofit中的转换器和适配器(Converter、CallAdapter)Retrofit整体流程和动态代理首先我们回顾一下retrofit的使用demo Retrofit retrofit = new Retrofit.Build...
2018-07-31 10:59:56
1921
原创 OkHttp3源码分析
重点本文打算从三点来剖析OkHttp3: * 网络请求的整理流程-会使用 * 拦截器模式-易扩展 * 缓存和连接池-高性能整体流程我们在阅读某一类源码之前,首先要学会怎么使用,其次才是去了解内部的实现原理,实现方案上有什么技巧。okhttp的一张流程图: 官方用例get使用方式OkHttpClient client = new OkHttpCli...
2018-06-28 14:40:10
4096
原创 绘制性能优化-ConstraintLayout
ConstraintLayout是2016年Google发布的,这种新的布局方式支持了编辑器的方式,从布局和性能上都做了一定的优化,同时也增加了一些新的概念,例如约束链和设置大小比例。本文从将会从性能上与传统的布局进行比较,并且给出使用在项目上的建议。Android的绘制流程首先回顾一下Android的绘制流程,方便我们更好的理解ConstraintLayout的性能。Androi...
2018-05-31 20:48:26
2589
原创 Android 投影MAC,Vysor pro 破解
投影工具当我们需要做产品演示,或者需要在手机上做一些讲解时,需要让大家看到手机屏幕,这个时候就需要一款好的投影工具。 现在比较好用的是:Vysor是一款可以使用电脑操作安卓手机的谷歌浏览器插件,非常流程和方便,但是免费版的话,画面质量非常差,后面会介绍怎么破解。AirDroid 是一款可以通过PC浏览器来管理Android手机的应用,Web网易和应用软件都可以做投影,也是非常方便。...
2018-04-24 16:49:39
4553
原创 Gradle学习笔记
gradle学习笔记(一)概念Gradle本身是基于Groovy脚本语言进行构建的,并通过Domain Specific Language(DSL语言)进行描述和控制构建逻辑的。 参考的文档:官方文档中文翻译文档Gradle用户指南Android Studio构建指南Android Studio Gradle,插件使用指南Gradle DSL语言APIgra...
2018-03-30 19:19:08
716
原创 AOP在Android中最佳用法
AOPAOP(Aspect Oriented Programming)是面向切面编程,AOP和我们平时接触的OOP编程是不同的编程思想,OOP是面向对象编程,提倡的是将功能模块化,对象化。而AOP的思想则是提倡针对同一类问题统一处理,当然,我们在实际编程过程中,不可能单纯的AOP或者OOP的思想来编程,很多时候,可能会混合多种编程思想。 代码注入是AOP中的重要部分:AOP可用于日志埋点、性...
2018-02-28 16:58:51
8594
原创 基于Kotlin实现注解生成器(Annotation Processor)
随着一些使用注解生成器(annotationProcessor)的框架的流行,例如ButterKnife、dagger2、EventBus 3.0。我需要了解注解生成器的相关知识。APTAPT(Annotation Processing Tool)是一种处理注解的工具,它对源代码文件进行检测,找出其中的Annotation。根据注解自动生成代码。Annotation处理器在处理Anno
2018-01-30 14:38:04
5151
7
原创 解决 android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcesso
在使用EventBus 3.0的时候,在Android Studio 执行Sync Project的时候出现了这个错误 android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor'由于网上很多介绍EventBus 3.0 是基于gradle 2.2.0
2018-01-29 15:40:25
5286
原创 Gradle发布Library到JCenter
之前工作的时候,认为只用关注代码本身就可以,将代码写好,其他的都不需要关心,但是这个认识的狭隘的,任何可以提升我们开发效率的工具或者语言我们都应该适当的去关注一下。 平常在工作中我们常常会引用到第三方的开源库,比如Fresco、EventBus等。在gradle中用compile引用:compile 'io.reativex:rxjava:1.1.3'是不是感觉这样非常方便,如果我们有自己维护的工
2017-12-31 16:27:17
479
原创 MAC更新系统后,android studio提示git不能使用,提示missing xcurn at
今天更新mac系统后,然后就踩了这个坑启动Andtoid studio右下角提示然后点击 fix,调到设置页面git路径出现了问题提,我这里的解决方案是,下载一个git for mac的版本,安装完成后,在android studio页面改变git的路径就ok
2017-12-31 15:25:43
919
1
原创 自定义气泡,适配项目中的所有气泡
前言为什么要做这个工作呢?气泡的意义在于引导用户去使用应用中的新功能,所以版本迭代添加新功能的时候,就是使用气泡来引导用户去使用新功能。但是每次写气泡这个功能的时候,就需要重新去写一套代码去实现,这是十分浪费时间,而且不能统一管理气泡,因此需要将气泡做成一个工具,每次实现只需要变更内容、位置和尖角的位置就好了。实现自定一个View去绘制气泡的背景和尖角,当然背景大小和尖角的位置需要适配。然后使用pu
2017-11-30 20:35:32
2097
原创 对生活的一点感慨
这个月实在太忙了,基本上每天都是11点回到家,一直在做需求,没有什么技术储备,本来想看一下上传jcenter,但是到最后一步始终没成功,所以就没写博客,简单说一下自己对于生活一点小小的感慨,虽然我们是程序员,但是还是要努力将自己的生活过精彩,不要过的太无聊,除了工作日之外,不要一到周六日,就是宅在家,玩玩游戏,看看视频(有一段时间我也是这样度过的,但是这样的一天非常空虚,那个时候我还不是单身 /
2017-10-30 13:35:01
1176
原创 类加载器与双亲委派模型
1. 双亲委派模型1.1 什么是双亲委派模型首先,先要知道什么是类的加载器。简单说,类加载器就是根据指定全限定名称将class文件加载到JVM内存,装维Class对象。如果站在JVM的角度来说,只存在两种加载器: 启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在\lib目录或-Xbootclasspath参数指定路径中的类库加
2017-09-30 14:40:49
616
原创 带你简单理解Binder
前言我们看过很多关于Binder的文章,但是看完大多数文章后,都会有不知所云的感觉,是因为那些文章不够好吗?不是那些文章讲得不够好,我们看的不明白主要是存在两种情况,一种深入代码细节不能自拔,从FrameWork到Kernel层,长篇累牍,让人很难理解Binder;另一种是只讲framework层,Binder驱动并没有具体提到,导致我们会用Binder,也大致能说的出一些原理,可并没有一个完整的深
2017-08-29 18:23:19
1514
原创 RxJava学习笔记
RxJavaRxjava的GitHub官网上是这样介绍rxjava的:RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programes by using observable sequences(RxJava是一个基于Rea
2017-07-30 10:12:49
907
原创 华为北京研究所第一届黑客马拉松比赛-基于Android防止儿童走失
简介 这个项目是在2016年华为研究所举办的第一届黑客马拉松比赛时开发的项目,这个项目是借鉴之前写Android人脸对比,想出一个关于防止儿童走失的想法,然后增加浏览历史和定位失踪儿童以及推送附近人的功能。 其实整个项目并不难,并且也很粗糙,但是由于整个项目从开始到结束都是我一个人开发,尤其到最后决赛的极限4小时编程,那种紧张、压抑的气氛充斥着整个赛场,还好在最后一刻完成了发布的任务,在最后
2017-05-02 22:16:01
2664
1
原创 Android OpenGL渲染双视频
前言想做的有很多,奈何能力实在有限,所以只能一步一步来,将自己做出来的尽量用简单易懂的语言描述出来,希望自己总结的对阅读这篇文章的同学有所帮助。在上一篇文章中讲述了怎样在GLSurfaceView上预览Camera的视频数据,在本章中打算实现一个类似微信视频通话的效果,微信视频通话主要有大小两个视频数据渲染(自己的视频和对端的视频),手指点击小视频,可以切换大视频和小视频的位置,可以拖动小视频。第一
2017-04-23 12:42:58
9517
1
原创 Android OpenGL使用GLSurfaceView预览视频
前言一年之前做过一些即时通信视频相关的工作,主要是做视频渲染这一部分的工作,由于2016毕业来到了华为,华为对研究生的安排就是“哪里需要去哪里”,和你专业和擅长的没有太大的关系,所以一直在适应当下的工作,现在基本上可以胜任现在的工作,可以抽出一些时间来总结一下之前了解过的OpenGL相关知识。第一章 相关知识介绍在介绍具体的功能之前,先对一些主要的类和方法进行一些介绍,这样可以更好的理解整个程序1.
2017-03-19 16:32:50
23194
3
原创 GLSL基础
OpenGL Shading Language GLSL作为一种着色语言是纯粹的和GPU打交道的计算机语言。因为GPU是多线程并行处理器,所以GLSL直接面向SIMD模型的多线程计算。GLSL编写的着色器函数是对每个数据同时执行的。每个顶点都会由顶点着色器中的算法处理,每个像素也都会由片段着色器中的算法处理。因此,初学者在编写自己的着色器时,需要考虑到SIMD的并发特定,并用并行计算的思路来思考问题
2017-03-19 16:23:37
1504
1
原创 Java正则表达式
正则表达式一般用于字符串匹配、查找、替换、分割。例如:从网页中找出email地址,IP地址是否正确,从网页中找出连接等等。 符号 意思 \|反斜杠 \t 间隔(’\u0009’) \n 换行(’\u000A’) \r 回车(’\u000D’) \d 数字 等价于[0-9] \D 非数字 等价于[^0-9] \s 空白符号 等价于[\t\
2017-03-19 16:22:16
617
原创 华为 emui 刷机解锁及回锁教程
刷第三方ROM,必须解锁bootloader获取权限一,申请解锁码 (1)申请解锁码链接 http://www.emui.com/plugin.php?id=unlock (2)申请解锁码办法 同意协议,选择智能手机,选择手机型号,输入产品S/N号,产品IMEI/MEID,产品识别码,最后输入验证码,点击提交即可,解锁码妥善保存好(3)查询产品S/N号,产品IMEI/MEID,产品识别码
2017-02-11 16:41:48
16033
Android人脸识别、对比
2015-11-25
自定义Numberpicker
2015-04-24
基于Android的计步器项目
2015-01-18
计步器的三种实现(直接可以用)
2014-10-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人