自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 问答 (1)
  • 收藏
  • 关注

原创 Gradle8.0中Transform的替代方案

在Gradle插件中对HuiRouterApi进行插桩,添加插入路由信息的字节码指令,在程序运行时,插桩的字节码指令执行,路由信息被注册到HuiRouterApi内部的路由表中,然后外部就可以通过HuiRouterApi进行跳转操作了。扫描过程中,收集的路由信息记录到annotationPathMap中。5、在taskAction方法中,扫描遍历所有的jar和class文件,收集路由信息,查找到HuiRouterApi类,并将收集到的路由信息通过插桩的方式添加到HuiRouterApi中。

2023-10-16 22:00:32 585

原创 基于Gradle8.0的插件开发

之前使用Groovy、Java 、 手动配置的方式演示了Gradle插件的整个自定义流程《自定义gradle插件》。本文使用java-gradle-plugin 和 Kotlin重新梳理下Gradle插件的自定义流程。1、新建一个Module模块hui_plugin(选择Kotlin Library)2、在hui_plugin模块的build.gradle.kts中引入“java-gradle-plugin” 和 “org.jetbrains.kotlin.jvm” 插件。

2023-10-09 23:09:53 1829 1

原创 Flutter的启动和渲染流程

本文结合Android平台和Flutter Framework层,以流程图的方式简要阐述Flutter启动和渲染的工作过程

2023-09-19 19:09:35 546 2

原创 Flutter三棵树的构建流程

Flutter三棵树的创建和关联过程

2022-11-23 22:30:07 740 1

原创 LiveData的使用和原理

private val mutableLiveData = MutableLiveData<String>(); override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mutableLiveData.observe(this, Obser.

2020-10-10 21:13:04 1927

原创 Lifecycle的基本使用和原理

AppCompatActivity实现了LifecycleOwner接口,该接口有一个getLifecycle()方法,实现了这个接口的类就可以作为一个被观察者,被观察者观察它生命周期。@SuppressWarnings({"WeakerAccess", "unused"})public interface LifecycleOwner { Lifecycle getLifecycle();}在AppCompatActivity中调用getLifecycle方法返回的是LifeCycle的

2020-09-26 22:55:48 7284

原创 rtmp推流服务器搭建

1、下载nginx服务器:wget http://nginx.org/download/nginx-1.19.2.tar.gz2、解压nginx服务器:tar -xvf nginx-1.19.2.tar.gz3、在github上搜索arut/nginx-rtmp-module库,并将其下载下来,下载命令如下:wget https://github.com/arut/nginx-rtmp-module/archive/v1.2.1.tar.gz4、解压下载好的nginx-rtmp-module:ta

2020-09-15 21:55:05 627 2

原创 AndroidStudio中CMakeLists文件的常见配置

1、在安卓的JNI开发中,CMake是一个很重要的辅助工具,CMake是一个比make更高级的编译工具,在AS2.2版本及以上,CMake取代了make工具成为了默认的native库构建工具2、CMakeLists.txt文件的一些常见命令配置#指定cmake的最低版本号cmake_minimum_required(VERSION 3.4.1)#添加一个名称为native-lib的库文件add_library( # Sets the name of the library. #设置要添加

2020-09-12 23:38:40 1780

原创 Java中的APT注解

java中常用的一些框架都使用到了注解,比如EventBus、Dragger2、Butterknife等,从这些流行框架可以看出,注解在Android中使用还是很广泛的,注解可分为运行时注解和编译期注解,运行时注解是通过反射在运行时拿到注解信息进行处理,编译期注解是在编译阶段根据注解生成相应的中间类来处理注解,因为运行时注解需要在运行时执行反射代码和注解处理逻辑,所以它的运行时性能没有编译期注解高,本文学习的注解方式就是APT编译时注解。一、创建一个名称为annotation的module单独存放自定义的

2020-08-05 09:30:54 772

原创 基于ndk-r21b编译ffmpeg-4.3.1

1、ffmpeg下载地址:http://ffmpeg.org/download.html打开下载地址选择需要的平台和版本号进行下载,下载可以先下载下来,然后在上传到linux上,也可以使用以下命令,在linux上直接下载:wget http://ffmpeg.org/releases/ffmpeg-4.3.1.tar.bz22、解压下载好的ffmpeg,解压命令如下:tar xvf ffmpeg-4.3.1.tar.bz23、解压后会生成一个解压目录ffmpeg-4.3.1,在这个目录下创建a

2020-07-31 09:30:40 1213 3

原创 Linux(Centos系统)上配置Tomcat

1、tomcat下载地址:https://tomcat.apache.org/download-90.cgi2、安装lrzsz用来上传和下载文件用,安装命令如下: yum -y install lrzsz3、将下载好的tomcat包上传到linux服务器的自定义目录下,windows平台下可以使用rz上传文件,sz下载文件。mac平台下可以通过如下步骤上传文件:(1)sftp -P 22 root@服务器ip地址(2)单文件上传:put 本地文件路径 服务端文件夹路径(3)批量上传文件:pu

2020-07-29 09:34:38 233

原创 Rxjava2中Single的map操作符源码学习

//注释1Single<Integer> integerSingle = Single.just(1);//注释2Single<String> stringSingle = integerSingle.map(new Function<Integer, String>() { @Override public String apply(Integer integer) { return "map:" + String.valueOf

2020-07-25 12:08:09 490

原创 Rxjava2中Single的just操作符源码学习

//注释1Single<Integer> integerSingle = Single.just(1);//注释2integerSingle.subscribe(new SingleObserver<Integer>() { @Override public void onSubscribe(Disposable d) { } @Override public void onSuccess(Integer s) {

2020-07-23 21:56:12 1210

原创 dex替换方式实现热修复

加载原理:BaseDexClassLoader、DexPathList、dexElements数组、findClass等一、下载修复的dex到手机上需要修复的dex是放到服务器上的,当App启动的时候就去下载到手机上(最好存放到应用私有目录下,这样更加安全,不容易被误删除,便于加载使用)。这里为了方便就省去了下载的过程,直接将修复包放到assets目录下了。然后将assets目录下的修复包复...

2020-05-07 22:21:01 836

原创 ASM和自定义Transform的应用实践

上篇文章学习了下如何自定义gradle插件《自定义gradle》,在实际应用中一般都会结合自定义的Transform和字节码操作框架(像ASM、Javassist)通过操作字节码来实现自己的业务逻辑,Transform是Android Gradle 在1.5.0 版本后提供的, 它允许第三方的Plugin插件在打包成 dex 文件之前的编译过程中操作 class 文件,对于一些重复性的操作,程序员...

2020-05-04 15:09:59 1220

原创 Android Studio3.6版本,格式化xml布局,导致错乱

将Android Studio升级到最新版3.6.3,编写完xml文件后,来了一下代码格式化,然后惊奇的发现布局全都乱套了,检查发现自己写的view控件位置发生了变化,不知道AS为什么会出现这么弱智的设计,下面说下解决问题的方法(Mac版):打开AS最上面的一行工具栏->Android Studio->PreferencesEditor->XML->Set from...

2020-04-30 11:41:14 1040

原创 自定义gradle插件

自定义gradle插件的方式有3种,第一种是直接创建build.gradle文件并在里面编写配置代码,第二种是在项目中新建一个buildSrc模块并在这个模块中编写groovy代码,第三种就是在独立的Module中编写插件,这里介绍的自定义插件采用的是第三种方式,具体的实现步骤如下:1、新建一个工程项目gradle_plugin_demo,然后在新建一个Module模块custom_plugin...

2020-04-27 23:06:04 2311

原创 自定义注解在MVP中的使用

P层添加注解

2020-04-25 11:52:04 304

原创 动态代理在MVP中的使用

动态代理

2020-04-16 10:38:53 406

原创 Retrofit源码解析

一、Retrofit创建过程源码解析 mRetrofit = new Retrofit.Builder() .baseUrl(HttpConfig.BASE_URL) // 设置网络请求的Url地址 .client(mOkHttpClient) .addConverterFactory(GsonCon...

2020-03-27 10:02:46 192

原创 OkHttp源码分析

一、OkHttp的基本使用//构建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new RequestIntercept()) .readTimeout(5, TimeUnit.SECONDS) .writeTimeout(...

2020-03-08 15:24:52 210

原创 ContentProvider启动过程

getContentResolver()会调用到ContextWrapper的getContentResolver方法: @Override public ContentResolver getContentResolver() { return mBase.getContentResolver(); }mBase的实现类是ContextImpl,Conte...

2019-12-27 11:29:45 584

原创 广播的发送和接收过程

ContextWrapper:Context mBase; @Override public void sendBroadcast(Intent intent) { mBase.sendBroadcast(intent); }ContextImpl: @Override public void sendBroadcast(Intent inte...

2019-10-29 17:46:21 1662

原创 广播的动态注册过程

广播的动态注册过程广播注册代码BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //TODO 处理接收到的广播消息 }...

2019-09-23 10:16:08 1540

原创 Android中的Binder机制二(匿名Binder)

前言上篇文章讲了AIDL的基本使用《AIDL的使用》,本文在上篇文章的基础上从应用层面的角度,分析一下Binder通信的一个大概过程,文章中分析所用到的代码,都是上篇文章中的代码,这里就不在重复粘贴之前的代码了。基础概念在Android中的Binder机制中,主要涉及四部分系统组件,分别是Client、Server、ServiceManager、Binder驱动,其中Client、Serve...

2019-09-16 11:14:54 1971

原创 Service的绑定过程

Service的绑定过程ContextWrapper类://Context类型,具体实现类是ContextImplContext mBase; @Overridepublic boolean bindService(Intent service, ServiceConnection conn, int flags) { return mBase.bindSer...

2019-09-09 14:36:25 2018 1

原创 Context的创建过程

Context是Android中的上下文环境,页面跳转、开启服务、发送广播、弹框、访问资源、获取系统服务等等,很多的操作都需要Context。其中Activity、Service、Application都是Context的子类,一个应用中有多少个Context实例呢,一共有Activity个数+Service个数+Application个数(1个)。Activity的Context实例创建:p...

2019-09-02 22:25:40 1317

原创 Service的启动过程

Service的启动过程startService();ContextImpl

2019-05-23 23:46:35 387

原创 Android中的DeepLink

DeepLink简单理解就是通过在手机上点击一个链接后实现如下功能:如果目标App没有启动,那么就拉起App,并跳转到App内指定页面如果目标App已经启动,那么就把App拉到前台并跳转到App内指定页面实现步骤1、提前定义好scheme,通过scheme匹配调起App2、在App的清单文件中对首页Activity进行scheme的配置,同时还要将首页Activity的启动模式设置为...

2018-12-23 21:41:17 2617

原创 adb不是内部命令或外部命令,也不是可运行的程序或批处理文件

在AndroidStudio的命令行里,使用adb命令操作安卓手机时,报“adb不是内部命令或外部命令,也不是可运行的程序或批处理文件“的错误,报这个错误是因为没有为adb配置环境变量,adb的环境变量配置跟java的配置是一样的,下面记录一下配置步骤。打开电脑属性,找到高级系统设置选项打开高级系统设置面板,选中高级选项,点击下面的环境变量打开环境变量面板,选中系统变量下面的path选项进...

2018-12-22 23:56:56 25792

原创 自定义可滑动选择标签

在开发中,遇到这样一个需求,就是列表的头部有多行选择标签作为筛选条件,在网上找了一些指示器控件,有的需要跟ViewPager关联才能用,有的定制性不太好,所以就自己写了这样的一个控件,在这里记录一下,方便以后查看。效果图如下:实现思路是继承HorizontalScrollView,动态的管理其子View进行处理。主要涉及到三个类,LabelSelectView(核心功能实现)、LabelAda...

2018-11-22 23:34:03 925

原创 自定义View流程(结合源码分析)

一、View的绘制流程主要是:测量(measure)、布局(layout)、绘制(draw)三大流程。对于一个普通View(不是容器)主要是关心测量和绘制两个过程,测量可以确定自身的宽、高、大小,绘制可以显示出view的具体内容(呈现在屏幕上的)。对于ViewGroup(容器控件)主要是关心测量和布局两个过程,测量不仅仅要测量自身还要测量所有的子view,布局主要是指定所有子view在自...

2018-11-17 20:07:52 368

原创 常用的git命令

常用的git命令修改git用户名: git config --global user.name 你的目标用户名修改git邮箱:git config --global user.email 你的目标邮箱名Push一个Commit到Gerrit:$ git commit$ git push origin HEAD:refs/for/master直接Push一个commit到Git...

2018-11-17 19:01:10 222

原创 冒泡排序

冒泡排序的基本思想是对相邻的元素进行两两比较,然后根据需要进行位置交换,每一轮比较结束都会把最小值或者最大值放到末端。最好的情况就是整个顺序完全符合要求,最坏的情况是整个顺序相对于预期是倒叙的,为了能够满足所有情况下的排序,在确定排序轮数时应该按照最坏的情况处理,假如有n个数,那么就需要进行n-1(如果n-1个数的位置都确定了,那么第n个也就确定了,所以只需要n-1次即可,不需要n次)轮排序,...

2018-09-14 16:50:51 350

原创 自定义可折叠展开的LinearLayout

本篇文章记录一下自定义的可以简单进行折叠展开的LinearLayout,只支持竖直方向,如果需要水平方向的,对宽度进行操作即可。测试效果时,包含的子View是个TextView,也可以是其他的子View。下面是效果图: 实现的思路是继承LinearLayout,并重写onMeasure动态的控制高度以达到效果,代码如下:package cn.znh.expandlinearlayou...

2018-08-27 22:06:51 1778

原创 自定义带刻度线的SeekBar

在开发中遇到了一个需求就是实现带有刻度线的SeeBar,本文就简单记录一下自定义SeeBar的过程。下面是最终的两张效果图,一张是滑块上显示刻度线,一张是滑块上不显示刻度线: 思路就是继承系统的SeekBar,重写onDraw方法绘制刻度线。代码如下:package cn.znh.customview;import android.content.Context;import ...

2018-08-26 14:26:21 5419 1

原创 TextView字体加粗

TextView字体加粗开发中常见的一种需求就是给字体加粗,Android中的实现方式有两种,一种是在xml中设置,一种是在代码中设置,但是这两种方式的效果不太一样,在代码中设置的加粗效果比较轻,xml中效果比较重。下图是运行的效果: Xml加粗方式 为TextView添加textStyle属性: android:textStyle=”bold” &lt;TextView ...

2018-08-12 12:16:04 28155 2

原创 自定义圆形图片控件

圆形图片效果是项目中一个常用的功能,很多头像都是这种显示样式的。网上有很多成熟的控件,也有很多比较优秀的第三方图片框架可以实现该功能。但是这个功能是掌握自定义控件的一个很好的例子,所以就自己写了一个简单的控件来实现该效果,练习一下。本文要实现的功能就是将一张普通图片以圆形图片的形式显示出来,并添加边框。最终的效果如下图:实现步骤如下:1、先自定义一个CircleImageView继承至...

2018-07-23 23:59:46 626

原创 RxJava2.0基本使用和注意事项

RxJava2.0的基本使用本文主要讲述一下RxJava2.0版本的基本用法以及相应的注意事项,RxJava2.0版本的基本用法有3步:创建被观察者(事件发送者) //创建被观察者(事件发送者) Observable&lt;String&gt; observable = Observable.create(new ObservableOnSubscribe&lt;String&g...

2018-07-09 23:21:16 605

原创 Activity的生命周期、任务栈、启动模式

Activity的生命周期Activity的生命周期分两种情况,一种是正常情况下的生命周期,一种是由于横竖屏切换导致的异常情况下的生命周期。一、正常情况下的生命周期Activity在正常情况下的生命周期有7个,打开时调用三个,关闭时调用三个,在加上一个onRestart,下面分别进行介绍: onCreate:调用该方法时,说明Activity正在被创建,可以做一些页面的初始化操作...

2018-07-04 16:08:13 316

空空如也

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

TA关注的人

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