Android
文章平均质量分 89
潇风寒月
热爱Android开发,我的github地址:https://github.com/xfhy
展开
-
Kotlin Flow:掌握基本,征服应用,避开开发陷阱!
主要介绍了Kotlin Flow的相关知识,包括基本概念、基本使用、实际应用以及一些需要注意的问题。Kotlin Flow是Kotlin协程的一部分,用于处理异步数据流,它相比LiveData和RxJava具有诸多优势,如更自然的协程支持、简单的语法、内存安全、更好的错误处理等。在基本使用方面,介绍了Flow的创建、消费、操作符、类型以及如何将回调转换为Flow、让Flow具备生命周期感知能力和处理配置变更问题等。在实际应用中,展示了Flow在请求网络、与Room结合使用以及替代LiveData解决问题等场原创 2024-07-13 21:04:06 · 1589 阅读 · 0 评论 -
R文件详细介绍、瘦身方案和原理
由于种种原因未升级AGP版本的项目可以选择使用booster、bytex进行R文件瘦身优化,如果可以升级AGP版本,则可以选择将AGP升级到4.1.0及以上。对R文件瘦身的效果的话,不同的项目可能不太一样,一般来讲module越多的话,可能瘦身效果会更明显(瘦好几M都是可能的)原创 2023-10-22 09:54:24 · 619 阅读 · 0 评论 -
Android App Bundle
现在上架Google Play必须上传Android App Bundle才行了,所以有必要简单了解下。简单来说就是Android App Bundle是一种新的发布格式,上传到商店之后,商店会利用这个Android App Bundle生成一堆Split APKs,当用户要去安装某个app时,只需要按需下载Split APKs中的部分apk(base apk + 各种配置apk),进行安装即可,总下载量大大减少。原创 2023-02-07 12:34:31 · 1493 阅读 · 1 评论 -
Android 线上卡顿监控
对于Looper Printer方案来说,是比较完善的,而且微信也在使用此方案,该踩的坑也踩完了。原创 2022-12-14 18:57:09 · 1239 阅读 · 0 评论 -
ANR 触发、监控、分析 一网打尽
ANR是老生常谈的问题了,本文从定义、原因、发生场景、触发流程、监控与分析等多方面入手,尽力补全ANR这块的知识。原创 2022-11-30 14:45:59 · 2940 阅读 · 3 评论 -
View动画主流程全解析
View动画,即补间动画。包含:渐变、旋转、平移、缩放四种基本的动画,当然,我们可以自己扩展实现。View动画不会改变View的属性,指数视觉效果变化,动画完成之后它还是在原本的位置上。这篇文章主要着手于View动画的主流程进行分析,动画的呈现原理不在本文的分析范围之内(如Matrix之类的原理)。原创 2022-10-02 06:39:18 · 918 阅读 · 0 评论 -
Kotlin作用域函数详解
在Kotlin中,函数是一等公民,它也是有自己的类型的。比如`()->Unit`,函数类型是可以被存储在变量中的。Kotlin中的函数类型形如:`()->Unit`、`(Int,Int)->String`、`Int.(String)->String`等。它们有参数和返回值。原创 2022-08-22 07:21:00 · 899 阅读 · 0 评论 -
Kotlin协程之Dispatchers原理
Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中。原创 2022-08-03 11:55:23 · 1342 阅读 · 0 评论 -
Kotlin协程createCoroutine和startCoroutine原理
createCoroutine和startCoroutine就是用来创建和启动协程的基础API,launch、async等在底层一定程度上都使用了该基础API,launch和async只不过是封装而已。原创 2022-08-02 09:54:33 · 870 阅读 · 0 评论 -
Kotlin挂起函数原理
Kotlin挂起函数平时在学习和工作中用的比较多,掌握其原理还是很有必要的。本文将一步一步带着大家分析其原理实现。原创 2022-07-09 16:10:02 · 1199 阅读 · 0 评论 -
Kotlin 协程与架构组件一起使用及底层原理分析
kotlin的协程封装了线程的API,这个线程框架可以让我们很方便得编写异步代码。虽然协程已经很方便了,但是如果再配合Google提供的架构组件的KTX扩展一起使用,那就更方便了。1. 添加KTX依赖//将 Kotlin 协程与架构组件一起使用//ViewModelScopeimplementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'//LifecycleScopeimplementation 'androidx.life原创 2021-06-05 07:20:17 · 775 阅读 · 6 评论 -
Handler同步屏障
1. 同步屏障机制是什么Handler发送的消息分为普通消息、屏障消息、异步消息,一旦Looper在处理消息时遇到屏障消息,那么就不再处理普通的消息,而仅仅处理异步的消息。不再使用屏障后,需要撤销屏障,不然就再也执行不到普通消息了。为什么需要这样?它是设计来为了让某些特殊的消息得以更快被执行的机制。比如绘制界面,这种消息可能会明显的被用户感知到,稍有不慎就会引起卡顿、掉帧之类的,所以需要及时处理(可能消息队列中有大量的消息,如果像平时一样挨个进行处理,那绘制界面这个消息就得等很久,这是不想看到的)。屏原创 2021-04-01 10:12:32 · 393 阅读 · 1 评论 -
Window 、Activity、 View 三者关系
ps:文中源码为API 28经常听到和用到Window,Window到底是什么?简单概括三者关系View其实是Android中视图的呈现方式,它必须附着在Window这个抽象的概念上,因此有视图的地方就有Window。有视图的地方不仅仅有Activity,还有Dialog、Toast,除此之外还有一些依托Window实现的视图:PopupWindow、菜单,它们也是视图,有视图的地方就有Window。因此Activity、Dialog、Toast都对应着一个Window。三者各自创建时机这里是.原创 2021-03-25 19:59:14 · 444 阅读 · 1 评论 -
一文汇总JVM所有知识点(二)
8. 前端编译与优化8.1 概述编译期没有具体的上下文语境的话,其实是一个模糊的表述。它可能是下面3种情况:前端编译器(叫“编译器的前端“更准确)把.java文件转换成.class文件的过程Java虚拟机的即时编译器(JIT编译器,Just In Time Compiler)运行期把字节码转变成本地机器码的过程使用静态的提前编译器(AOT编译器,Ahead Of Time Compiler)直接把程序编译成与目标机器指令集相关的二进制代码的过程Java虚拟机设计团队选择把对性能的优化全部集中原创 2021-02-27 10:51:56 · 367 阅读 · 0 评论 -
一文汇总JVM所有知识点(一)
1. JVM内存数据区域1.1 内存数据区域下面这些都是Java虚拟机规范,不是虚拟机具体实现JVM内存可以划分为若干个不同的数据区域: 程序计数器,虚拟机栈,本地方法栈,堆,方法区1.1.1 程序计数器程序计数器占用的内存空间比较小,可以看做是当前线程所指向的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支操作、循环操作、跳转、异常处理等也都需要依赖程序计数器。在Java虚拟机规范中,程序计数器没有规定OutOfMemoryError原创 2021-02-27 10:50:56 · 407 阅读 · 0 评论 -
黑科技:提升进程优先级的一种思路
本地中的demo地址,文中源码为API 28一、前言前不久,看到维术大佬发表的一篇文章:另一种黑科技保活方法。文章内容主要是利用Android的2个bug(黑科技就是利用系统bug骚操作)来提升进程的优先级为前台进程,觉得挺有意思,于是决定找个时间研究一下。因为原文中大佬主要写的是思路,所以流程比较粗略,没有提供具体的demo实现。可能有些朋友不知道维术大佬,太极·虚拟框架就是他创作的。我就想着自己简单实现一下,搞个demo看看效果。结果不搞不知道啊,这玩意儿搞起来可太花时间了,太多知识盲区.原创 2021-01-30 19:58:33 · 477 阅读 · 0 评论 -
构建自己的Android知识体系
0. 背景构建一个属于自己的知识体系,能够让我们学到的知识体系化.让自己清楚哪块是自己的知识盲区,哪块已经构建起根基.然后根据实际情况,有针对性的进行模块学习.让自己成为一个合格的Android工程师.平时看博客或者学知识,学到的东西比较零散,没有独立的知识模块概念,而且学了之后很容易忘.于是我建立了一个自己的笔记仓库 (一个我长期维护的笔记仓库,感兴趣的可以点个star~你的star是我写作的巨大大大大的动力),将平时学到的东西都归类然后放里面,需要的时候呢也方便复习.过了段时间,我觉得这样还是不够好原创 2021-01-18 19:19:07 · 1276 阅读 · 0 评论 -
Android进程间通信 深入浅出AIDL(二)
本篇文章为Android进程间通信 深入浅出AIDL系列的第二篇,建议配合AIDL第一篇食用3. AIDL原理3.1 AIDL是怎么工作的?我们编写了aidl文件之后,啥也没干就自动拥有了跨进程通信的能力.这一切得归功于Android Studio根据aidl文件生成的IPersonManager.java文件(生成的这个文件通过双击Shift输入IPersonManager.java即可找到),它里面已经帮我们封装好了跨进程通信这块的逻辑(最终是通过Binder来完成的),所以这个IPersonMa原创 2020-12-19 15:44:48 · 369 阅读 · 1 评论 -
Android进程间通信 深入浅出AIDL(一)
文中示例代码均可在demo中找到1. AIDL概念Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似.您可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信.在 Android 中,一个进程通常无法访问另一个进程的内存.因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象.编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题.跨进程通信(IPC.原创 2020-12-19 15:38:10 · 465 阅读 · 1 评论 -
死磕Android_LeakCanary原理赏析
本文基于 leakcanary-android:2.5思维导图1. 背景Android开发中,内存泄露时常有发生在,有可能是你自己写的,也有可能是三方库里面的.程序中已动态分配的堆内存由于某种特殊原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至程序崩溃等严重后果.本来Android内存就吃紧,还内存泄露的话,后果不堪设想.所以我们要尽量避免内存泄露,一方面我们要学习哪些常见场景下会发生内存泄露,一方面我们引入LeakCanary帮我们自动检测有内存泄露的地方.LeakCa.原创 2020-12-12 16:48:06 · 4803 阅读 · 5 评论 -
反编译实战之修改执行逻辑、加日志和调试
文中相关工具下载链接:https://pan.baidu.com/s/1_bknFSnsYxLUNJ3WTulEFA 提取码:4qo8我的所有原创Android知识体系,已打包整理到GitHub.努力打造一系列适合初中高级工程师能够看得懂的优质文章,欢迎star~1. 反编译基操1.1 借鉴code一般来说,如果只是想借鉴一下友商的code,我们只需要拿到对方的apk,拖到jadx里面就行.jadx能查看apk的xml布局和java代码.jadx有时候会出现部分class反编译失败的情况,这时可.原创 2020-09-27 09:30:52 · 2035 阅读 · 6 评论 -
手把手教大家用Transform API和ASM实现一个防快速点击案例
0. 前言我的所有原创Android知识体系,已打包整理到GitHub.努力打造一系列适合初中高级工程师能够看得懂的优质文章,欢迎star~建议阅读本篇文章之前掌握以下相关知识点: Android打包流程+Gradle插件+Java字节码在Android Gradle Plugin中,有一个叫Transform API(从1.5.0版本才有的)的东西.利用这个Transform API咱可以在.class文件转换成dex文件之前,对.class文件进行处理.比如监控,埋点之类的.而对.class原创 2020-08-23 21:46:44 · 1245 阅读 · 3 评论 -
Gradle 插件练习-动态移除权限
1. 开始之前Gradle DSL 文档Gradle基于Groovy,而Groovy基于Java,最后始终得运行在JVM之上.Gradle、build.gradle、settings.gradle之类的最终都会被搞成一个对象,然后才能执行.Gradle 对象: 每次执行gradle taskName时,Gradle都会默认构造出一个Gradle对象.在执行过程中,只有这么一个Gradle对象,一般很少去定制它.Project对象: 一个build.gradle就对应着一个Project对象.Se原创 2020-08-06 15:20:08 · 1048 阅读 · 0 评论 -
反编译基础知识
!!! 严正声明本文相关反编译技术仅限于技术研究使用,不能用于非法目的,否则后果自负.1. apktool 逆向APK文件的工具官方网站apktool主要用于逆向apk文件,可以将资源解码,并在修改之后可以重新构建它们.它还可以用来重新构建apk.1.1 功能将资源解码成近乎原始的形式(包括resources.arsc, classes.dex, 9.png. 和 XMLs)将解码的资源重新打包成apk/jar组织和处理依赖于框架资源的APKSmali调试执行自动化任务安装教程1原创 2020-06-29 18:55:47 · 6714 阅读 · 0 评论 -
JNI NDK入门详解
Android开发中,由于各种原因(跨平台,高性能,敏感数据处理等),这时候需要用到大家耳熟能详的JNI(Java Native Interface).本篇文章将带大家复习一下JNI中那些常用的知识点.所以本文中没有一些基本环境配置的讲解,如果需要的话,可以先阅读一下我之前写的:JNI初识 HelloWorldJNI Java与C的相互调用与基本操作本文相关demo: https://github.com/xfhy/AllInOne/blob/master/app/src/main/cpp/nat原创 2020-06-14 00:20:06 · 1490 阅读 · 1 评论 -
第一行代码读书笔记 Kotlin Android
郭神的Android第一行代码更新了,听到消息的我立马就下单了,拿到书就开始如饥似渴地翻阅着.写的特别棒,学到了很多东西,下面是一些我不太熟悉的东西.开源项目如下:天气应用 https://github.com/xfhy/SunnyWeather请求权限的库 https://github.com/xfhy/PermissionX1. 快速入门Kotlin语言优先使用valob...原创 2020-05-07 17:34:59 · 954 阅读 · 0 评论 -
一个Android菜鸟入门Flutter 笔记(一)
1. Dart 基础语法1.1 hello world先来看个hello world,入口依然是main方法.printInteger(int a) { print('Hello world, this is $a.'); }main() { var number = 2019; printInteger(number); }1.2 变量与类型定义变量使用var...原创 2020-04-30 09:26:03 · 1206 阅读 · 0 评论 -
开源一个Flutter版WanAndroid客户端
1. 前言项目地址: https://github.com/xfhy/WanAndroid-Flutter前段时间抽了点业余时间学了点Flutter入门,打算写个简单项目练练手.说实话,只有真正动手写东西才能真正切身感受到Flutter的魅力,刚开始学的时候写布局特别难受,各种嵌套,很烦. 后面多写一点儿之后感觉也还是勉强可以接受,各种Widget操作起来也还是容易.Flutter目前我...原创 2020-04-11 14:24:59 · 834 阅读 · 4 评论 -
Gradle系列(四) Gradle插件
1. 前言依赖apply plugin: 'com.android.application'就是依赖了安卓的应用程序插件.然后这个插件里面有android扩展,在官方文档里面有详细描述.但是,有时候不得不自己写一个插件,方便与业务开展.比如我觉得美团的热修复,在每个方法前面插逻辑的话,肯定得插桩,插桩就得自己写插件.方便快捷.Gradle+ASM可以插桩.有兴趣的可以去了解.demo地址: h...原创 2019-12-22 21:43:05 · 1067 阅读 · 1 评论 -
Gradle系列(三) Gradle配置构建和渠道包
1. 前言Android开发,打包的时候可能会打内测包,外侧包,release包等,还有就是有时候还需要打不同渠道的包等.这时它们里面的包名,应用图标,应用名称,某些资源文件,某些java文件等可能不同,如果通过人工去手动改,改了之后再打包的话,那就太麻烦了.现在有了Gradle,它可以帮到我们.ps: 请先搞懂Android DSL的基本配置,比如compileSdkVersion是什么本文...原创 2019-12-12 21:27:54 · 972 阅读 · 2 评论 -
Gradle系列(二) Gradle执行顺序和task
0. 前情提示这是一个gradle系列,尽量从前往后阅读.已完成文章:Gradle系列(一) Groovy 基础1. 什么是gradle维基百科:Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的...原创 2019-12-01 15:37:43 · 3036 阅读 · 2 评论 -
Gradle系列(一) Groovy 基础
文章目录1. 前言2. 什么是Groovy3. 简单使用Groovy4. 语法4.1 简单示范4.2 String4.3 闭包4.4 List4.5 Map4.6 IO4.7 类5. 总结1. 前言准备写一个新的系列,专注于Gradle,计划会有如下几篇文章Groovy 基础Gradle 执行顺序和taskGradle 差异化包Gradle 插件2. 什么是Groovy在学习G...原创 2019-11-30 21:24:36 · 922 阅读 · 0 评论 -
死磕Android_Glide主流程观赏
文章目录1. 前言2. 阅读前准备3. with()4. load()5. into()6. 总结1. 前言首先,LPL赛区S9再度夺冠,让我们恭喜FPX凤凰涅槃!好长好长一段时间没有写博客了,中间经历了很多很多事. 比较庆幸的是找到了一份满意的工作.现在工作空闲之余,又可以写写博客归纳总结了.图片加载可能是现在所有APP都必备的,当然有很多选择,可以自己写一个库用来展示网络图片.也可以用...原创 2019-11-20 23:10:45 · 811 阅读 · 0 评论 -
2019 Android开发工程师面经
文章目录1. Java基础1.1 什么是乐观锁?1.2 volatile关键字1.3 hashmap 原理,红黑树是什么?1.4 jvm内存分配1.5 String,StringBuffer,StringBuilder 区别2. 安卓基础2.1 安卓各版本大变化(Android 6.0到10.0有哪些大点变化),兼容适配2.2 热修复原理2.3 MVC,MVP,MVVM2.4 组件化的好处2.5 ...原创 2019-11-07 22:28:30 · 1642 阅读 · 8 评论 -
广播的最佳实践-实现强制下线功能
强制下线功能需要先关闭掉所有的活动,然后回到登录界面.前面第二章的最佳实现已经实现了关闭所有活动的功能了. * 1.我们先创建一个ActivityCollector类用于管理所有的活动,里面定义了一个Activity集合,还有方法,这些方法用于 * 将这个Activity集合中的元素添加,移除,和finish所有的Activity元素. * *转载 2016-07-26 14:46:23 · 657 阅读 · 0 评论 -
ListView的简单实用及其优化
定制ListView的界面步骤: * a.新建一个类,就是每个选项的那些属性,全部放在这个类里面, * b.然后新建一个自定义的布局文件,这个布局文件就是每个选项的布局 * c.再定义一个类将ArrayAdapter继承,再实现里面的构造方法和getView()方法, * g原创 2016-07-21 10:57:43 · 529 阅读 · 0 评论 -
Android 存储数据之1 读取文件和存储文件
TextUtils.isEmpty(inputText),非常好用,它可以一次性判断两种空值.当传入的字符串等于null或者等于空字符串 * 的时候,这个方法都会返回true,从而使得我们不需要单独去判断着两种空值,再使用逻辑运算符连接起来了.存储文件public void save(String data) { FileOutputStream out = null;转载 2016-07-28 07:22:32 · 542 阅读 · 0 评论 -
Android 存储数据之2 SharedPreferences存储
利用SharePreferences存储数据得到SharedPreferences对象过后,就可以开始向SharedPreferences文件中存储数据了,主要分为三步: 1.调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象 2.向SharedPreferences.Editor对象中添加数据,比如添转载 2016-07-31 21:41:25 · 352 阅读 · 0 评论 -
Android 存储数据之3 使用SQLite数据库存储
SQLite是Android内置的数据库,轻量级的,它的运算速度非常快.Android为了让我们能够更加方便的管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级.SQLiteOpenHelper是一个抽象类. 创建数据库,新建一个类去继承SQLiteopenHelper,实现onCreate()和onUpgrade()方法,原创 2016-07-31 21:54:10 · 762 阅读 · 0 评论 -
android 服务的onStartCommand()不执行的解决办法
弄了一下午了,一直无法启动Service服务,刚刚忽然解决了这个问题,给大家分享一下.我是通过Service启动了一个广播,BroadcastReceiver.然后通过这个广播来启动Service.需要先去AndroidManifest.xml中注册服务和BroadcastReceiver.注册服务的代码如下: 然后在BroadcastReceiver中写入下面的代原创 2016-09-11 16:09:26 · 8972 阅读 · 0 评论