自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 2023小红书Android面试之旅

小红书面试总体而言给我的体验是很好的,每轮面试后基本上都是当天就能出结果,然后约下一轮的面试。最终从一面到HR面结束出结果,一共花了9天时间,还是挺快的。二面结束后,一面的面试官加我微信说小红书目前很缺人,感兴趣的同学也可以来试试。

2023-11-23 13:04:19 359

原创 Android源码分析 - Service的停止与重建

在上一篇文章中,我们分析了一个Service是怎么启动的,这次我们再来看看一个Service是如何被停止的,什么情况下Service会被重建以及它的重建过程

2023-11-09 11:42:22 460

原创 Android源码分析 - Service启动流程

在之前的文章中,我们已经分析过了四大组件中Activity和ContentProvider的启动流程,这次我们就来讲讲四大组件之一的Service是如何启动和绑定的

2023-09-09 01:51:49 261

原创 谈谈Android如何实现不同大小的圆角

在开发过程中,设计常常会有一些比较炫酷的想法,比如两边不一样大小的圆角啦,甚至四角的radius各不相同,对于这种情况我们该怎么实现呢? 今天就来谈谈我对实现不同大小的圆角的一些想法和遇到的问题

2023-08-09 17:52:32 480

原创 Android源码分析 - Framework层的ContentProvider全解析

ContentProvider是用来帮助应用管理其自身和其他应用所存储数据的访问,并提供与其他应用共享数据的方法,今天,我们就从Framework层对ContentProvider做一个深入解析

2023-07-04 11:24:35 414

原创 有手就行!Sovits AI人声模型训练

随着AI孙燕姿的爆火出圈,各大视频平台的AI人声投稿量激增,B站首页频频给我推送相关视频,正好我对AIGC方面也挺感兴趣,心动不如行动,于是我用自己的声音训练了一个模型,发现整个过程异常的简单,并且最终出来的效果也不错,真的是有手就行,所以这次将我自己训练推理的过程经验分享给大家。

2023-06-14 11:18:12 7104 6

原创 如何完美监听帧动画?AnimationDrawable深度解析

作为苦逼的程序员,产品和设计提出来的需求咱也没法拒绝,这不,前两天设计就给提了个需求,要求在帧动画结束后,把原位置的动画替换成一段文字,我们该怎么监听AnimationDrawable的结束事件呢

2023-06-05 17:26:30 943 3

原创 Android动态权限申请从未如此简单

大家是否还在为动态权限申请感到苦恼呢?为了解决传统动态权限申请的痛点,我封装出了两个方法,用于随时随地快速的动态申请权限

2023-04-24 16:34:06 287

原创 Android源码分析 - Activity销毁流程

我们在之前的几篇Activity启动流程分析中已经了解了Activity一半的生命周期,接下来这篇文章我们就来分析一下Activity销毁相关的生命周期

2023-03-30 10:43:23 919

原创 史上最完美的Android沉浸式状态导航栏攻略

在状态栏和导航栏沉浸式这一块,我还是踩了挺多坑,费了挺多精力的,这次我将我踩坑,适配各机型总结出来的史上最完美的Android沉浸式状态导航栏攻略分享给大家

2023-02-24 14:23:56 5020 4

原创 WSL编译AOSP必要的几个前置工作

本篇文章旨在指导大家如何在WSL上编译AOSP,帮助大家少走弯路少踩坑,希望大家都能顺利的编译出AOSP

2023-02-06 11:59:22 272

原创 Android源码分析 - Activity启动流程(下)

本篇分析了Activity启动的两条路径,在两条路径归一后,Activity是怎样启动的,Activity启动时的生命周期变换是怎样执行的

2023-02-02 15:36:43 276 1

原创 Android源码分析 - Activity启动流程(中)

在上一篇文章中,我们分析了Activity启动流程中的一小部分,基本上可以算是Activity启动的前置准备工作,本篇文章我们将会分析App进程启动的主要流程

2022-12-02 16:28:01 489

原创 Android交叉编译OpenCV+FFmpeg+x264的艰难历程

由于OpenCV给Android提供的so库默认不支持h264编码,于是我踏上了艰难的OpenCV+FFmpeg+x264 Android交叉编译之路

2022-09-20 15:15:43 2548 3

原创 Android源码分析 - Activity启动流程(上)

作为一名Android开发,我们最熟悉并且最常打交道的当然非四大组件中的Activity莫属,这次我们就来讲讲一个Activity是怎样启动起来的

2022-08-10 17:48:57 904 1

原创 Android源码分析 - Framework层的Binder(服务端篇)

我们在上一片文章Android源码分析 - Framework层的Binder(客户端篇)中,分析了客户端是怎么向服务端通过驱动发起请求,然后再接收服务端的返回的。本篇文章,我们将会以服务端的视角,分析服务端是怎么通过驱动接收客户端的请求,处理,然后再返回给客户端的。上篇文章我们是以作为服务端分析的,本篇文章我们还是围绕着它来做分析,它也是一个比较特殊的服务端,我们正好可以顺便分析一下它是怎么成为驱动的的是在独立的进程中运行的,它是由进程从文件中解析并启动的,......

2022-07-05 19:01:46 690

原创 Android源码分析 - Framework层的Binder(客户端篇)

本篇以分支作为基础解析我们在之前的文章中,从驱动层面分析了是怎样工作的,但驱动只涉及传输部分,待传输对象是怎么产生的呢,这就是层的工作了。我们要彻底了解的工作原理,不仅要去看驱动层,还得去看层以及应用层()我们还是以第一次见到的地方开始分析,我们选取方法来分析(这个方法既有入参也有返回),抛除掉它缓存和的部分,最核心的代码就一句BinderInternal.getContextObject我们从开始看起,这个函数是一个函数,他被实现在中ProcessState我们在这里可以发现一个比较关键的类,它是

2022-07-04 15:41:43 360

原创 Jetpack Compose入门

Jetpack Compose是用于构建原生界面的新工具包。它是一种声明式的UI布局,其官方声称可简化并加快上的界面开发,使用更少的代码、强大的工具和直观的,快速让应用生动而精彩。官网:https://developer.android.com/jetpack/compose?hl=zh-cn......

2022-07-04 15:41:33 674

原创 Linux信号机制及其原理分析

在最近在工作中,使用到了信号的相关知识,之前我们在分析系统进程的时候也提到了信号,但并没有对信号这个机制做出深入的理解,借此机会,我们深入分析一下信号机制是怎样实现的信号(),是系统中的一种古老的进程间通信机制,而作为类系统,早期也是模仿了系统,自然也保留下了这个机制。信号是一种异步通信机制,它是在软件层面上对中断机制的一种模拟注:本篇文章基于glibc版本2.35,Linux内核版本5.17,x86_64架构信号可以由内核产生,也可以由用户产生,这边举几个例子:用户在终端输入时,会产生一个信号在程序中对一

2022-06-30 10:10:55 1349

原创 B站Android面试小记

看着我同学最近也在到处投简历,我想着我也投一下看看行情,于是在2022-02-28号,我向B站投出了第一封简历,说实话当初只是想练练手,没想到最后接了B站的offer,也是造化弄人了技术面,45min左右,基本围绕你简历上写的亮点和你的工作经历展开自我介绍你在项目中负责什么用过什么设计模式,或在中常常会碰见的设计模式单例模式,策略模式,责任链模式(问了一下使用场景),工厂模式等中的观察者模式,适配器模式等有没有做过什么比较有难度的模块,自定义照片裁剪你对自定义有什么了解回答了一些绘制以及触摸事件的处理动画属

2022-06-30 10:08:45 195

原创 Android源码分析 - Binder驱动(下)

本篇以aosp分支,kernel分支作为基础解析上一篇文章Android源码分析 - Binder驱动(中),我们分析了中的写操作部分,了解了请求的发起与调度,接下来我们就进行驱动的最后一部分分析,我们还是先从后的命令码开始binder_thread_read这是进行读操作的函数,这个函数也是比较长,我们同样将它分成几个部分:在此之前我们需要先看一下之前提到的,在中的域成员,前面我们只是注释了这个域表示线程状态,这里我们介绍一下它有哪些取值:这一部分先检查是否有可用的待处理,如果有的话进入到下一部分,

2022-06-30 10:08:33 178

原创 Android ASM插桩

ASM插桩在网上其实已经有很多资料了,我之所以再写这篇文章呢,一是因为好久前学习的ASM,现在已经忘的差不多了,需要再回顾一下,二来是记录一下学习过程,以后如果再有细节记不清楚可以很方便的就能查到,三来再学习的过程中也踩了一些坑,收获了一些心得,这些也需要一个地方记录一下。好了,废话就说到这里,接下来开始正文。插桩技术指在保证原有程序逻辑完整性的基础上,在程序中插入探针,通过探针采集代码中的信息(方法本身、方法参数值、返回值等)在特定的位置插入代码段,从而收集程序运行时的动态上下文信息。插桩技术大体可以分为

2022-06-30 10:08:23 597

原创 Android源码分析 - Binder驱动(中)

本篇以aosp分支,kernel分支作为基础解析上一篇文章Android源码分析 - Binder驱动(上),我们已经了解了驱动设备是如何注册的,并且分析了和操作函数,接下来我们继续分析驱动中最重要的部分我们先简单介绍一下函数,这个函数是用来控制设备的,函数原型如下:第一个参数为设备的文件描述符第二个参数为命令码,它由驱动方自定义,用户通过命令码告诉设备驱动想要它做什么后面为可选参数,具体内容和有关,是传入驱动层的参数内核是这么定义一个命令码的这样,一个命令就变成了一个整数形式的命令码了,为了使用起来方便

2022-06-30 10:08:12 2916

原创 Android源码分析 - Binder驱动(上)

本篇以aosp分支,kernel分支作为基础解析上一篇文章Android源码分析 - Binder概述我们大概了解了一下选用的原因,以及的基本结构和通信过程。今天,我们便开始从驱动层代码开始分析的机制驱动部分代码不在项目中,所以我们需要单独一份驱动代码由于我的开发设备是pixel2,查了内核版本号为,对应的分支为,所以今天的分析我们也是基于此分支我是从清华大学镜像站的代码,高通的设备,所以地址为:https://aosp.tuna.tsinghua.edu.cn/android/kernel/msm.git

2022-06-30 10:07:41 1203

原创 Android源码分析 - Binder概述

本篇无源码分析,只对Binder做通信过程和基础架构的介绍是中最重要的一种进程间通信机制,基于开源的George Hoffman当时任Be公司的工程师,他启动了一个名为的项目,在Be公司被ParmSource公司收购后,由Dinnie Hackborn继续开发,后来成为管理的进程的基础。在Hackborn加入谷歌后,他在的基础上开发出了(以下简称),用来完成的进程通信。作为一名开发,我们每天都在和打交道,虽然可能有的时候不会注意到,譬如:它们都和有着莫切关系,当碰到上面的场景,或者一些疑难问题的时候,理解机

2022-06-30 10:07:30 493

原创 Android源码分析 - SystemServer(下)

本篇以android-11.0.0_r25作为基础解析上一篇文章Android源码分析 - SystemServer(上)我们分析了进程是怎么被启动起来的,今天这篇,我们来分析进程启动后做了什么我们上一章中讲到,进程出子进程后,最终调用了方法,源代码在中,我们来看看做了什么构造方法非常简单,就是先new了一个对象,然后调用它的方法,我们先看一下构造方法工厂模式首先,先从系统属性中获取工厂模式级别,有三种属性:它们被定义在中紧接着便开始执行方法可以看到,方法主要做了以下工作其中,创建这一步是由完成的

2022-06-30 10:07:19 499

原创 Android源码分析 - SystemServer(上)

本篇以android-11.0.0_r25作为基础解析上一篇文章Android源码分析 - Zygote进程,我们分析了Android 进程的启动和之后是如何接收消息创建App进程的在上一章中,我们说了,的一大作用就是启动,那么是怎么启动的呢?启动后又做了些什么呢?我们分上下两篇来分析,本篇介绍是如何启动的主要是用来创建系统服务的,譬如我们熟知的,都是由它创建的我们从上一篇文章的开始,类的源码路径为之前在c++代码中JNI调用Java函数的时候,带了参数,在这里就会通过这个参数判断是否启动,接下来调用方法

2022-06-30 10:07:07 458

原创 Linux Capabilities机制

传统的Linux权限控制粒度太粗,以命令为例,修改用户密码是需要root权限的,但普通用户应该是能够修改自己密码的才对,这时候Linux就使用了、机制,使进程以它的所有者root权限运行这样就可以以root权限修改密码了机制是有安全隐患的,进程只需要修改密码的就可以了,却在整个运行周期内获得了root权限,一旦出现漏洞,很有可能会被利用所以,Linux内核在2.2后引入了机制,细粒度化了权限控制,可以做到按需授权这里是文档:https://man7.org/linux/man-pages/man7/capa

2022-06-30 10:06:53 745

原创 Android源码分析 - Zygote进程

本篇以android-11.0.0_r25作为基础解析上一篇文章Android源码分析 - init进程,我们分析了Android第一个用户进程init进程的启动过程和之后的守护服务init进程启动了很多服务,例如Zygote,ServiceManager,MediaServer,SurfaceFlinger等,我们平常写Android应用都是使用Java语言,这次我们就先从Java世界的半边天:Zygote进程 开始分析Zygote意为受精卵,它有两大作用,一是启动SystemServer,二是孵化启动A

2022-06-29 15:06:43 425

原创 Android源码分析 - init进程

本篇以android-11.0.0_r25作为基础解析PC启动会通过BIOS引导,从0x7c00处找到以0xaa55为结尾的引导程序启动。而Android通常使用在移动设备上,没有PC的BIOS,取而代之的是BootLoader。在CPU上电复位完成后,会从一个固定的地址加载一段程序,即BootLoader,不同的CPU可能这个地址不同。BootLoader是一段引导程序,其中最为常见的为U-boot,它一般会先检测用户是否按下某些特别按键,这些特别按键是uboot在编译时预先被约定好的,用于进入调试模式。

2022-06-29 15:01:54 855

原创 各厂商Android系统碰到的奇奇怪怪问题的记录

各厂商Android系统碰到的奇奇怪怪问题的记录

2022-06-29 14:58:49 441

原创 AOSP的编译及刷机

众所周知,Android是开源的,AOSP(Android Open Source Project)为Android开源项目的缩写。作为一名Android开发,掌握Android系统的工作机制是技术成长中的必经之路,第一步就是自己编译Android系统。这里是Google官方的推荐要求:https://source.android.com/setup/build/requirements?hl=zh-cN参考文档:https://source.android.com/source/initializing?

2022-06-29 14:56:36 6921 2

原创 走马灯式横向滚动的TextView

我们可以设置的属性,来做到当文字超出一行的时候呈现跑马灯效果。但的这个走马灯效果需要获取焦点,而同一时间只有一个控件可以获得焦点,更重要的是产品要求无论文字内容是否超出一行,都要滚动效果。这里先贴一下最后实现的Github地址和效果图https://github.com/dreamgyf/MarqueeTextView思路其实很简单,我们只要将单行的截成一张,然后我们再自定义一个View,重写它的方法,每隔一段时间,将这张Bitmap画在不同的坐标上(左右两边各draw一次),这样连续起来看起来就是走马灯效

2022-06-29 14:26:55 502

原创 Android开发常见问题总结(持续更新)

Android开发常见问题总结(持续更新)

2022-06-29 14:20:07 1308

原创 Android对Java的修改-SimpleDateFormat类

Android会对部分OpenJDK中的代码进行一些修改,本篇记录一下因为这些修改而踩过的一些坑。一个在线上运行良好的Date工具类在写单元测试时一直报ParseException,代码如下:这里传入的参数utcTime为"2020-01-01 08:00:00+08:00"这段代码在Android环境下运行良好,但在单元测试下一直报错Android对OpenJDK中的进行了修改,具体在方法中:可以看到,OpenJDK原本是不支持带冒号的写法的,而在Android中修改了方法,使其可以解析带冒号的写法。解

2022-06-29 14:04:47 162

原创 Android-Kotlin单元测试之 如何配合Mockito模拟顶层函数

随着Kotlin语言在Android开发中越来越流行,自然也会遇到各种各样的问题。本篇主要是针对我个人在Android单元测试Kotlin类时遇到的一些问题的思考和解决方案。我们都知道Kotlin给开发者提供了很多语法糖,其中之一就是顶层函数,我们可以直接把函数放在代码文件的顶层,让它不从属于任何类。它的使用很简单,直接在kotlin代码的任意位置直接当作一个普通函数调用就行了,而在java中,需要像使用静态方法一样,以文件名+Kt为类名调用 (默认配置)在java单元测试中,如果想mock这个顶层函数,只

2022-06-29 13:15:00 894

原创 自定义EditView时踩过的坑

这次的需求是一个单词拼写的输入框,要求每个字母分割开来输入,每个字母下面有一个下划线,就类似于验证码输入或者支付密码输入的效果

2022-06-29 11:33:08 355 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除