- 博客(85)
- 资源 (10)
- 收藏
- 关注
原创 防御式编程
作为一名程序猿,或软件开发工程师,或技术工人,首要任务就是编写好代码(编写高质量代码)。那么编写好代码有什么用呢?靠编写好代码可以维持你的工作(基础),可以去影响你的同事和领导(让你同事和领导从代码中认为你是一个技术能力靠谱的人)(进阶),那么继续下去,你可能参与团队或部门或公司重要的项目或事情(高级),再下去,你就可以在团队和部门中提高你的技术影响力,从而你更有机会获得更多的资源(时间和人力)和更多的成就(升职和加薪)。当然,也有可能在你工作的环境中,编写好代码和编写坏代码结果一样。
2024-04-15 09:14:43 1121
原创 Python 封装 gradle 命令
使用 python 执行相关 gradle 命令,主要是简化输出信息-直接获取关键信息,或生成可视化报告,或是放在 CI/CD 中执行的 script
2024-01-18 11:27:52 1038 1
原创 Python 封装 adb 命令
在日常的 Android 项目开发中,我们通常会使用 adb 命令来获取连接设备的内存、屏幕、CPU等信息,也会使用 gradle 命令来获取项目构建相关的 projects、tasks、dependencies等信息,还会使用 git 命令来获取代码 commit、log、diff 等信息。这些信息的获取,每次都在command 中输入相关命令进行操作(有时命令记不住,还需要查询一下),重复的操作让人感到厌倦和疲乏。现在,可以尝试使用 python 来简化这一部分工作,将常用的执行命令封装到 python
2024-01-16 09:58:02 2124
原创 使用 Gradle 命令了解项目构建信息
不管是接触一个新项目,还是一直开发老项目,使用 Gradle 命令,可以对项目构建信息有一个快速的掌握。要分析项目 aar 或 jar 依赖信息,可以使用 Task :app:dependencies或./gradlew :app:dependencyInsight --configuration someConf --dependency someDep ;要分析项目 so 依赖信息,可以监听 Task :app:mergeDebugNativeLibs。依赖信息对于解决依赖冲突,库升级问题非常有帮助。另
2023-11-16 09:44:03 887
原创 Kotlin Flow 冷流和热流
冷流需要有数据生产者、0或多个中间操作、数据消费者才能一起构建成为一个完整的流。它的执行原理类似 Kotin Sequence,当有消费者 collect 或其它终端操作时,流开始从下往上触发,然后从上往下流动。在热流 SharedFlow 中,当它创建以后它就存在了,它可以在生产者 emit 数据时,没有消费者 collect 数据而独立运行。当生产者 emit 数据后,这些数据会被缓存下来,新老消费者都可以收到这些数据,从而达到共享数据。
2023-04-03 09:32:12 1175 1
原创 Kotlin Flow 探索
响应式编程,可以理解为一种面向数据流编程的方式,也就是使用数据源构建数据流 → 修改数据流中的值 → 处理数据流结果值,在这个过程中,一系列的事件或操作都是按顺序发生的。在 Java 环境中,RxJava 框架实现了响应式编程,它结合了数据流、观察者模式、线程框架;在 Kotlin 环境中,Kotlin 协程和 Flow 结合在一起实现了响应式编程,其中协程就是线程框架,Flow 就是数据流。不管是 RxJava 还是 Kotlin 协程和 Flow 的实现的响应式编程,它们的目的都是为
2023-01-12 10:29:34 1041 1
原创 Kotlin 协程探索
Kotlin 协程是一套线程 API 框架,在 Kotlin 语言环境下使用它做并发编程比传统 Thread, Executors 和 RxJava 更有优势,代码逻辑上“同步非阻塞“,而且简洁,易阅读和维护。suspend是 Kotlin 语言中一个关键字,用于修饰方法,当修饰方法时,该方法只能被suspend修饰的方法和协程调用。此时,也预示着该方法是一个耗时方法,告诉调用者需要在协程中使用。Android 上的 Kotlin 协程下一篇,将研究 Kotlin Flow。
2023-01-04 11:02:48 1078
原创 Kotlin 惰性集合操作-序列 Sequence
Kotlin 标准库提供的集合操作函数:filter,map, flatmap 等,在操作的时候会创建存储中间结果的临时列表,当集合元素较多时,这种链式操作就会变得低效。为了解决这种问题,Kotlin 提供了惰性集合操作Sequence接口,只有在 末端操作被调用的时候,也就是获取结果的时候,序列中的元素才会被逐个执行,处理完第一个元素后,才会处理第二个元素,这样中间操作是被延期执行的。而且因为是顺序地去执行每一个元素,所以可以先做 filter 变换,再做 map 变换,这样有助于减少变换的总次数。
2023-01-03 09:00:00 807 1
原创 Android 查看隐私权限方法调用者集合
这里,新建立一个 MethodCollectorDetector,并让它实现接口,主要告诉 lint ,需要的是 class 文件的检查。和的区别,前者作用域只包含项目内的 class 文件,后一个作用域才会包含三方库中的 class 文件。//需要的是方法)}) {//目标所属类名称:instruction.owner//目标所属类方法名称:instruction.name//调用者所属类名称:classNode.name//调用者所属类方法名称:method.name。
2022-12-28 11:03:53 1476
原创 Android 静态代码检查
随着项目的不断迭代,以及代码的增加和开发人员的增加,代码规范或代码质量的把控,是当前版本发布前必要的一环。在当前开发流程中:编码→构建→测试→发布,代码规范或代码质量相关问题,只能靠人工 Review,或灰度和线上 Bugly 反馈。人工 Review 代码,可能比较费时以及遗漏部分Case,而灰度和线上 Bugly 反馈,为时已晚。所以,要在版本发布前尽量去发现代码质量问题,避免带到线上(被动反馈),可以在构建过程之前中去添加 静态代码检查环节,让每一次的构建都能自动地去分析代码是否存在质量问题。
2022-09-08 10:27:10 3007 7
原创 Gitlab CI 拉取 submodules
前言在项目开发中,有时需要使用另外一个项目(第三方或独立项目),这时可以通过 Git 工具 - 子模块 来管理。当在本地添加好子模块(git submodule add <project gitlab url>)并推送到 gitlab 上,我们期望 gitlab CI 能够自动的去 clone 或 pull 对应的 依赖项目并正常构建。但是,这时我们可能会遇到:fatal: could not read Username for 'https://gitserver.com/ ': No s
2022-01-26 12:07:51 10652
原创 Android Jetpack LifeCycle 实现原理分析
MVVMLifeCycleLifeCycle:抽象类,用于访问 Activity 或 Fragment 的生命周期;LifecycleObserver:接口,生命周期观察者,它没有任何方法,依赖注解 OnLifecycleEvent;OnLifecycleEvent:注解,主要是声明方法监听 Lifecycle.Event 的哪一个事件;Lifecycle.Event :LifeCycle的内部枚举类,定义了 LifecycleOwner(也就是Activity 或 Fragment )的生命
2021-08-24 11:18:31 415
原创 Android Git Hooks
前言在项目开发过程中,如果想在提交代码前或提交代码后,或在执行其它特定的 Git 相关操作时,去做一些自动化的事情,这时就可以利用 Git 钩子。比如:本地执行 git commit 时,自动去检验 commit 的 message 是否符合规范。通常,Git 钩子分为 客户端钩子和服务端钩子。客户端钩子客户端钩子主要有:pre-commit,commit-msg 等pre-commit 钩子在键入提交信息前运行。 它用于检查即将提交的快照,例如,检查是否有所遗漏,确保测试运行,以及核查代码。
2021-07-07 21:21:11 1073
原创 Android 中 Handler 相关的面试问题分析
文章目录简要Handler 问题相关Handler 中的方法 sendMessage 和 post 的区别?答案Handler 是如何发送一个延时消息的?答案简要关于Android 系统中Handler,Message,MessageQueue,Looper 组成的消息机制,由于它们是开发 Android 应用程序的基础,所以在面试过程中,一定会做考察。而且每个问题必追究其原理,本篇文章将剖析曾遇到问题。如果还不知道Handler,Message,MessageQueue,Looper 组成的消息机制
2020-12-19 11:57:54 987
原创 Android APK 反编译工具 JADX
JADX 介绍GitHub 地址:https://github.com/skylot/jadxJADX 支持将 APK, dex, aar, zip 中的 dalvik 字节码反编译为 Java 代码,也支持反编译 AndroidManifest.xml 和 resources.arsc 资源。JADX 安装首先安装 JDK1.8 或以上版本,Git,以及 Android 开发环境。创建要下载的 JADX 存储文件路径,然后在命令行切换到该目录,执行以下命令:git clone htt
2020-12-10 12:03:13 2343 1
原创 Android ANR 触发原理
ANR 简介ANR(Application Not Responding):程序无响应。在Android应用程序的主线程中,如果某个事件没有在系统规定的时间范围内执行完成,就会触发ANR。通常,ANR 会对用户的体验会产生致命的影响,因为当发生ANR时,用户不能再与应用程序进行交互。所以,我们也会统计应用程序的线上ANR率,以此来衡量一个应用程序的稳定性。ANR率 是应用程序的一个非常重要的性能指标。解决ANR是一个重要紧急的事情。ANR 触发场景在Android 系统中,触发ANR的事件场景通常有
2020-11-16 17:12:18 2302
原创 Flutter分享会总结
Flutter开发应用程序的质量:稳定性、性能、视觉方面稳定性:iOS没有什么问题,但对Android不同品牌设备的兼容性不是很好,现在在三星、华为等设备中可能出现黑屏(谷歌官方正在投入人力解决,保证稳定性)。性能:帧率可以媲美原生应用,并且在低端机型上表现出的帧率要比原生还要好,也比H5的要好。视觉:多端一致,文本、图片、动画等显示都能适配多端各种机型。Flutter开发应用程序的成...
2020-01-13 08:57:14 680
原创 Android 上传项目到Jcenter
文章目录注册账号Add New Repository(创建仓库)Add to Package(创建包)API Key上传项目上传 Android library 或 Java library添加依赖开始上传上传Android Plugin 或 Java Plugin添加依赖开始上传上传项目后的一些操作是否可以正常下载删除文件发布到Jcenter参考注册账号登陆 https://bintray....
2019-11-27 20:53:54 698 1
原创 APT:comment(注释工具)
commentcomment 的主要作用是将类注释扫描到文档中。通过在类中添加类注解@Comment,在项目编译的时候,生成.java 和.html 文档,帮助开发人员一览项目 API。如何使用?1.在你需要生成注释文档的类中添加注解@Comment,如在工具类DisplayUtil中添加:package com.example.comment.util;/** * 页面相关 *...
2019-11-23 16:31:49 847
原创 将AndroidStudio中的项目上传到Github
将AndroidStudio中的项目上传到Github1.下载 git 到本地(git 下载地址:https://git-scm.com/download/mac),并配置好环境。2. 在 AndroidStudio 中打开你要上传的 Android 项目,选择菜单 VSC → Enable Version Control Integration… :然后在对话框菜单中选择 git:...
2019-11-18 19:04:58 406
原创 Android 中自定义注解和注解解析
文章目录前言注解注解解析运行时反射解析器创建Module创建类 AbstractProcessor 的实现类创建 javax.annotation.processing.Processor 文件实例测试总结前言注解在很多第三方库中都有被用到,比如常用的一些库:EventBus:事件发布-订阅总线,使组件之间的通信解耦。butterknife :View注入框架,使View的绑定自动化。...
2019-08-12 22:48:38 2282
原创 Android 防止空指针异常
文章目录空指针异常防止空指针异常Java 注解Java 8 中的 Optional 类型Kotlin总结空指针异常先复习下异常。异常分为 Exception 和 Error,Exception 和 Error 类都继承自Throwable类。Exception(程序可恢复):表示程序可以处理的异常,可以捕获并且可恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常...
2019-07-29 10:23:40 3504
原创 Retrofit 中的注解以及如何自定义接口方法注解
前言Retrofit 是一个网络请求框架,它在Android领域已经被使用很长一段时间了。我们知道它的特点就是用注解来描述 HTTP 请求:支持 URL 参数替换和查询参数将对象转换为请求主体(例如,JSON、协议缓冲区)多部分请求正文和文件上传这些注解主要用来标识接口方法和接口方法参数,并预示着一个请求将会被如何处理。...
2019-07-10 12:04:11 4203 7
原创 Java 动态代理 Proxy
前言本打算写一篇 “如何在 Retrofit (网络加载框架) 的接口中自定义注解”的文章,但其中涉及到Java 动态代理,所以先写一篇文章来搞懂Java 动态代理。动态代理类Proxy在 Java 中的动态代理,实际上指的就是反射包java.lang.reflect下的 类 Proxy。Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类...
2019-06-30 11:54:19 3165 1
原创 如何优雅的检测主线程中的耗时方法
应用程序卡顿原因在Android应用程序中,运行着一个主线程,也被称为UI线程,它处理界面交互的相关的逻辑。四大基本组件以及各种控件都运行在这个线程中,如果在这个线程中做耗时的操作,就容易引起页面卡顿,也就是掉帧,甚至引起用户最不想看到的ANR。在Android系统中,想要应用程序画面达到流畅,就必须是60fps。系统每隔16ms发出VSYNC信号,触发对UI进行渲染,要达到60fps,意...
2019-05-22 23:21:22 8638 4
原创 Android 与 H5 交互基础普及
在当今的移动开发中,移动端与网页的交互越来越频繁重要。为了达到灵活且减少移动端的开发工作量,通常一些运营活动页面或不太重要的深层级页面都是需要网页来实现的。使用网页还有一个重要的原因,就是网页可以轻松的适配Android和iOS平台,不必做太多的处理,这就要求移动端开发工程师 必须掌握 与H5交互的技能。创建一个WebView页面布局layout:hybrid_xml:<?xml ve...
2019-04-28 17:36:44 3914
原创 Kotlin与Java的异同(二)
1.局部函数和扩展在重构代码时,通常把长的方法分解成更小的代码块,然后重用这些代码。但是,这样可能让代码更费解,因为以一个包含许多小方法的类告终,而且它们之间并没有明确的关系。可以更进一步地将提取的函数组合成一个内部类,这样就可以保持结构,但是这种函数需要用到大量的样板代码。Kotlin:新定义:在函数中嵌套提取的函数。这样既可以获得所需的结构,也无需额外的语法开销。class User(...
2019-04-15 10:12:09 3400 1
原创 Kotlin与Java的异同(一)
Kotlin简介Kotlin是一种针对Java 平台的新编程语言。Kotlin简洁、安全、务实,并且专注于与Java代码的互操作性。它几乎可以用在现在Java使用的任何地方:服务端开发、Android应用等等。Kotlin 可以很好地和所有现存的Java库和框架一起工作,而且性能和Java旗鼓相当。Kotlin 特点:Kotlin 是静态类型语言并支持类型推导,允许维护正确性与性能的同时保...
2019-03-25 10:05:05 33902 7
原创 FFMpeg音视频操作命令
如果没有安装ffmpeg,请参考:Mac 配置FFmpeg环境视频视频裁剪:ffmpeg -i src.mp4 -ss 00:00:00 -t 00:00:20 des.mp4裁剪前20秒视频去掉声音:ffmpeg -i src.mp4 -c:v copy -an des.mp4音视频文件合成操作:ffmpeg -i src.mp3 -i src.mp4 des.mp4...
2019-03-20 15:21:21 12906
原创 客户端与服务端数据加密传输方案
前言从前一篇网络安全基础要点知识介绍中可以知道,在网络通信中数据容易被截取或篡改等,那么如果在传输用户隐私数据过程中,被不法分子截取或篡改,就容易导致用户受到伤害,所以对客户端与服务端的传输数据加密,是网络通信中必不可少的。数据加密首先客户端与服务端商量好数据加密协议,对传输数据做到安全保护,需要有下面两点:采用HTTPS协议采用公钥密码体制RSA算法对数据加密现在安全是保证了,但......
2019-03-03 17:39:42 19115 12
原创 网络安全基础要点知识介绍
前言在介绍对客户端与服务端的传输数据加密之前,先介绍下网络安全相关的知识,主要是为了更好的了解为什么要对传输数据加密以及为什么要采用这种加密算法。网络安全网络安全问题概述计算机网络的通信面临两大类威胁:被动攻击和主动攻击。被动攻击:指攻击者从网络上窃听他人的通信内容。通常把这类攻击成为截取。主动攻击:通常有篡改,恶意程序,拒绝服务方式。篡改:攻击者故意篡改网络上的传送的报文。这里也...
2019-03-02 10:55:31 15964
原创 NestedScrollingParent 和 NestedScrollingChild 嵌套滑动原理介绍
在介绍NestedScrollingParent 和 NestedScrollingChild 嵌套滑动之前,先介绍下View的事件分发机制,因为NestedScrollingParent 和 NestedScrollingChild 主要是很好地解决了View滑动冲突问题。View的事件分发机制一次点击事件由三个重要的方法来共同完成:dispatchTouchEvent、onIntercep...
2019-02-23 22:13:34 6031 2
原创 2018年读书清单
文学书名作者阅读进度备注《白痴》费奥多尔·陀思妥耶夫斯基100%耿济之译《死屋手记》费奥多尔·陀思妥耶夫斯基44%耿济之译, 陈逸校证《刺杀骑士团长》村上春树100%林少华译《春风沉醉的夜晚》郁达夫100%无《三体》刘慈欣100%包括《三体》、《三体Ⅱ·黑暗森林》、《三体Ⅲ·死神永生》《活着》余华100%无《...
2019-02-11 14:21:51 808
原创 在PyCharm中运行scrapy项目
安装Scrapy关于Scrapy框架简单介绍,可以参看菜鸟教程:Scrapy 入门教程。在Mac OS中安装Scrapy并不是直接安装,而是先安装virtualenv,virtualenv可以创建一个隔绝独立的python开发环境,让不同项目分别运行在自己需要的开发环境中,解决不同项目间多版本的冲突问题。 安装完virtualenv后再继续安装Scrapy。pip install virtu...
2019-01-26 16:27:23 6729 1
原创 在应用程序Crash时收集可用的信息
AppCrash在应用程序crash时收集一些信息,目前收集的信息如下:设备基本信息:手机品牌,手机品牌类型,手机制造商,手机系统版本,手机SDK版本,手机屏幕分辨率,手机屏幕密度。手机应用程序内存信息: try { if (am != null) { appMemoryJSON.put(&amp;amp;amp;amp;amp;amp;quot;memoryClass&amp;amp;amp;amp;amp
2018-12-07 17:50:38 1430
原创 adb常用命令
adb shell wm1.获取手机分辨率adb shell wm size2.获取手机物理密度adb shell wm density
2018-12-04 12:06:17 9855
原创 Android性能优化-过度渲染
过度渲染去除过度渲染可以从下面渲染阶段的几方面入手:交换缓冲区阶段,表示 CPU 等待 GPU 完成其工作的时间。 如果此竖条升高,则表示应用在 GPU 上执行太多工作。命令问题阶段, 表示 Android 的 2D 渲染器向 OpenGL 发起绘制和重新绘制显示列表的命令所花的时间。 此竖条的高度与它执行每个显示列表所花的时间的总和成正比—显示列表越多,红色条就越高。同步和上传阶段,表...
2018-11-19 15:31:46 2512
RecyclerViewCursorAdapter
2016-09-28
DataBinding-Example
2016-09-23
Android中GridView和ViewPager显示图片的优化处理(第三版
2016-04-11
Fragment中嵌套(Fragment+ViewPager)完整Demo
2016-03-12
Android中使用Gridview和ViewPager显示图片的优化处理(第二版)
2015-09-08
Android 4.1回声消除(AcousticEchoCanceler)和噪声抑制 (NoiseSuppressor)Demo
2015-09-07
在Andriod中使用AudioRecord录音,使用AudioTrack播放录音的完整Demo
2015-08-11
Android中使用Gridview和ViewPager显示图片的优化处理
2015-06-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人