<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[u010629285的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/u010629285</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u010629285]]></copyright><item><title><![CDATA[android 打包aar，并上传Maven]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/119755072</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/119755072</guid><author>u010629285</author><pubDate>Tue, 17 Aug 2021 14:10:42 +0800</pubDate><description><![CDATA[最近工作要求实现一个应用统一门户平台，现尝试了两条方案，一种使用了腾讯的shadow，一种是打包aar并上传maven引用的方式。打包aar并上传maven，我分别使用了maven和maven-publish两条插件，这里主要是记录一下插件的gradle配置。



准备


我这里是先把参数放入了gradle.properties中



# 发布私有仓库的地址，我这里是本机地址
MAVEN_URL=http://xxx.xxx.com/repository/maven-releases/
#MAVEN_]]></description><category></category></item><item><title><![CDATA[KMP算法的理解]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/117290619</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/117290619</guid><author>u010629285</author><pubDate>Wed, 26 May 2021 17:06:34 +0800</pubDate><description><![CDATA[——写出来就是为了内化

前言

任何算法在理解之前看的都是一脑雾水，但不要慌，抓住几个关键点，再依次去推导，然后就会豁然开朗了。然后再回过去看之前那些博客大神的解说就会很轻松的理解了。简单来说对于算法我的办法就是：先明白是怎么实现的，再去理解它的实现原理。

关于KMP的来历什么的等等这里就不说了，这里只记录如何理解KMP。

下面都以原始参数str="AABAABAABC"，条件参数pat="AABC"为参数说明

理解

现在就我们就来理解一下KMP。

首先，我们需要对pat数据进行处理，通过DFA]]></description><category></category></item><item><title><![CDATA[深入理解Java泛型]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/117026404</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/117026404</guid><author>u010629285</author><pubDate>Wed, 26 May 2021 14:17:27 +0800</pubDate><description><![CDATA[——写出来就是为了内化

泛型的定义

什么是泛型，泛型的本质就是参数化类型。也就是说，泛型就是将所操作的数据类型作为参数的一种语法。


public class Play&lt;T&gt;{
    T play();
}

泛型的作用

写出更灵活通用的代码

泛型代码就好像模板，生产时根据输入的不同材料，就可以返回不同的结果。这也是泛型的最初宗旨。

将代码安全性检查提前到编译期

在没有泛型之前，容器(比如List)无论加入什么数据，存储的数据类型都是向上转型Object，从而在取的时候都不知道是]]></description><category></category></item><item><title><![CDATA[Android启动优化之异步启动自定义启动器（二：基本逻辑）]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/116742061</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/116742061</guid><author>u010629285</author><pubDate>Thu, 13 May 2021 11:29:42 +0800</pubDate><description><![CDATA[Android启动优化之异步启动自定义启动器（一）

实现类说明

AppStartTaskExecutor(启动任务的线程类)：这个类就是上篇说的根据CPU核数获取对应的线程类

AppStartTask(启动任务的基本)：包含任务的基本参数和实现了任务的基本方法的基类

AppStartTaskDispatcher(启动任务的调度类)：用于关联

AppStartTaskRunnable(启动任务的流程执行类)








...]]></description><category></category></item><item><title><![CDATA[JCenter挂掉后的解决方案]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/116735063</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/116735063</guid><author>u010629285</author><pubDate>Thu, 13 May 2021 08:55:38 +0800</pubDate><description><![CDATA[Bintray 和 JCenter 截止 2021 年 3 月 30 日之后不能上传任何库，2022 年 2 月 1 日之后不能下载任何库。

解决方案：

在库开发者迁移项目之前，我们可以先使用镜像仓库
	
buildscript {
    repositories {
        // 阿里云云效仓库：https://maven.aliyun.com/mvn/guide
        maven { url 'https://maven.aliyun.com/repository/jcenter]]></description><category></category></item><item><title><![CDATA[Android Studio 更新问题]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/116525340</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/116525340</guid><author>u010629285</author><pubDate>Sat, 08 May 2021 14:06:24 +0800</pubDate><description><![CDATA[Android Studio每次更新都会出现各种情况，打算做了下问题的笔记。

版本：4.2

问题：javax/xml/bind/JAXBException

原因：直观的原因是JDK1.9中不再包含JAXB API的Jar包了。一般引起这个问题的有两个地方，一是AS升级到4.2后，软件默认的JDK版本升到1.9；二是build.gradle中配置了JDK1.9版本。

解决：把JDK改写1.8就好。项目右键Open Module Settings，打开Project Structure，第一种情况，在S]]></description><category></category></item><item><title><![CDATA[Android启动优化之异步启动自定义启动器（一）]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/116491535</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/116491535</guid><author>u010629285</author><pubDate>Fri, 07 May 2021 15:35:14 +0800</pubDate><description><![CDATA[前言

本文只是笔记记录

核心思想：子线程分担主线程任务，并行减少时间。

异步优化分为：常规异步优化和最优异步优化两种

常规异步优化的痛点：

（1）代码不优化

（2）场景不好处理（子任务中有依赖关系）

（3）维护成本高

最优异步优化

核心思想：充分利用CPU多核，自动梳理任务顺序

启动器流程：

（1）代码Task化，启动逻辑抽象为Task

（2）根据所有任务依赖关系排序生成一个有向无环图

（3）多线程按照排序后的优先级依次执行



讲完了核心思想和流程，在实现之前，我们先来熟悉一下]]></description><category></category></item><item><title><![CDATA[Gradle Composite builds 扩展使用]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/116299336</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/116299336</guid><author>u010629285</author><pubDate>Thu, 06 May 2021 18:19:09 +0800</pubDate><description><![CDATA[前言

一开始只是想做依赖库的版本管理，所以本文的自定义Plugin是在Gradle Composite builds的基本上去实现的，如有不清楚Gradle Composite builds配置的小伙伴，可以先去了解一下https://blog.youkuaiyun.com/u010629285/article/details/116005860



Gradle配置


//build.gradle.kts
buildscript {

    repositories {
        // 需要添加 jc.]]></description><category></category></item><item><title><![CDATA[AspectJ 学习笔记(一)]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/116453589</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/116453589</guid><author>u010629285</author><pubDate>Thu, 06 May 2021 15:29:42 +0800</pubDate><description><![CDATA[简介

AspectJ 作为 Java 中流行的 AOP（aspect-oriented programming） 编程扩展框架，其内部使用的是BCEL框架来完成其功能。调用时机是在 Java 文件编译成 .class 文件之后，生成 Dalvik 字节码之前执行。

利用 AOP 可以对业务逻辑的各个部分进行隔离，从而使得业务逻辑各部分之间的耦合性降低，提高程序的可重用性，同时大大提高了开发效率。

无侵入性，修改方便。此外，AOP 不同于 OOP 将问题划分到单个模块之中，它把涉及到众多模块的同一类..]]></description><category></category></item><item><title><![CDATA[Android 统一依赖管理]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/116005860</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/116005860</guid><author>u010629285</author><pubDate>Thu, 22 Apr 2021 15:06:52 +0800</pubDate><description><![CDATA[本篇只是作记录。


	简述
	
每个项目从新建开始我们或多或少都会导入各种依赖库，如果项目中只有一个module的话，对于依赖库版本的管理很容易，但是多个module的话，稍加不注意，很容易导入多个版本的库甚至产生版本冲突，更新修改依赖库也需要多处操作，所以我们需要对依赖库版本进行统一管理。(就简单说一下，其实大家都理解)


	实现方案
	
实现依赖库版本的统一管理现在流行的方案大致有三种(有更好的方案，大家可以推荐下)：


	ext(Google推荐)
	
	
	Kotlin + buildSrc
]]></description><category></category></item><item><title><![CDATA[Android 设计模式之建造者模式]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/113985912</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/113985912</guid><author>u010629285</author><pubDate>Tue, 23 Feb 2021 18:20:08 +0800</pubDate><description><![CDATA[定义：

将一个复杂的构建与其表示相分离，使得同样的构建过程可以创建不同的表示。 [构建与表示分离，同构建不同表示]。

特点：

将复杂创建过程封装在内部，对于外部调用的人来说，只需要传入建造者和建造工具，对于内部是如何建造成成品的，调用者无需关心，也不知道，具有良好的封装性，可以使客户端不用知道产品内部组成的细节。

实现：

Product:被构造的复杂对象
	Builder：抽象接口
	ConcreteBuildr：Builder接口的具体实现
	Director:Builder接口的构造者和使用者]]></description><category></category></item><item><title><![CDATA[Android 设计模式之观察者模式]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/113945532</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/113945532</guid><author>u010629285</author><pubDate>Tue, 23 Feb 2021 13:47:07 +0800</pubDate><description><![CDATA[定义：

也叫做发布订阅模式，定义对象的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新

特点：

实现观察者与被观察者之间进行解耦
实现：

Subject（抽象主题）：被观察者的一个抽象类，它会把所有观察者的引用保存在一个集合里。抽象主题提供一个接口，可以增加和删除观察者对象。
	ConcreteSubject（具体主题）：具体的被观察者。当具体被观察者的状态发生改变的时候，会给每一个注册过的观察者发送通知。
	Observer（抽象观察者）：所有具体观察者的]]></description><category></category></item><item><title><![CDATA[Android 设计模式之单例模式]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/113932719</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/113932719</guid><author>u010629285</author><pubDate>Mon, 22 Feb 2021 17:29:45 +0800</pubDate><description><![CDATA[单例模式

定义：

一个类只有一个实例，所有调用就使用同一个对象

特点：

单例类只有一个实例对象
	单例对象必须由单例类自行创建
	单例类对外提供一个访问该单例的全局访问点
实现：

私有构造方法
	私有静态引用指向自己实例
	以自己实例为返回值的公有静态方法
懒汉式：需要的时候才去实例化，不需要我就不实例化。

不加锁
	优点：需要的时候才会实例化变量，实现懒加载（资源利用率高）
	缺点：线程不安全
	
	同步锁
	优点：线程安全，懒加载
	缺点：方法进行同步效率太低
	
	双重锁
	优点...]]></description><category></category></item><item><title><![CDATA[Task 'assemblePlugin' not found in root project 'qiakr-android']]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/103287722</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/103287722</guid><author>u010629285</author><pubDate>Thu, 28 Nov 2019 09:48:22 +0800</pubDate><description><![CDATA[问题
Task 'assemblePlugin' not found in root project 'qiakr-android'

解决

方法1： 删除根目录下的xxx.iml文件中的…的内容，或者删除目录下的.idea和xxx.imi文件，重新导入
方法2：在根目录下的build.gradle中首行添加task assemble{}
方法3：在根目录下settings.gradle中的in...]]></description><category></category></item><item><title><![CDATA[滴滴插件化框架VirtualApk 接入]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/103239937</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/103239937</guid><author>u010629285</author><pubDate>Mon, 25 Nov 2019 16:25:00 +0800</pubDate><description><![CDATA[预览效果
空位
滴滴 VirtualApk git地址：https://github.com/didi/VirtualAPK
Demo git地址：https://github.com/caixiaoxu/DiDiVirtualApkDemo
接入流程

新建两个项目，一个为宿主项目(PluginMain)，一个是子项目(PluginSub),(保证两个项目中的文件不能有重名)
修改两个项目的gr...]]></description><category></category></item><item><title><![CDATA[自定义View——地铁显示牌效果]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/103109461</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/103109461</guid><author>u010629285</author><pubDate>Sun, 17 Nov 2019 15:43:19 +0800</pubDate><description><![CDATA[预览效果

目录
SubwayBoardView.java
代码
public class SubwayBoardView extends View {

    private Paint bgPaint, tbPaint, centerBgPaint, centerRingPaint, centerCirclePaint, centerCircleRingPaint, noStationPai...]]></description><category></category></item><item><title><![CDATA[自定义View——图片自由选区裁剪]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/102993554</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/102993554</guid><author>u010629285</author><pubDate>Tue, 12 Nov 2019 20:07:45 +0800</pubDate><description><![CDATA[Demo地址：https://gitee.com/olleh/ImageCrop.git
package cn.com.gyq.crop;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFacto...]]></description><category></category></item><item><title><![CDATA[ffmpeg视频的翻转vflip、hflip，旋转rotate、transpose、]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/102995565</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/102995565</guid><author>u010629285</author><pubDate>Tue, 12 Nov 2019 20:06:40 +0800</pubDate><description><![CDATA[原图

翻转vflip
//垂直翻转
ffmpeg -i fan.jpg -vf vflip -y vflip.png


翻转hflip
//水平翻转
ffmpeg -i fan.jpg -vf hflip -y hflip.png


旋转rotate
//旋转60°，是带有黑底的。图片的原始宽高并没有改变
ffmpeg -i fan.jpg -vf rotate=PI/3 -y rotate...]]></description><category></category></item><item><title><![CDATA[ffmpeg给视频添加个黑色的遮罩]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/102993650</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/102993650</guid><author>u010629285</author><pubDate>Tue, 12 Nov 2019 20:05:37 +0800</pubDate><description><![CDATA[数值越大越不透明@.3@.9
ffmpeg -i out3.mp4 -filter_complex color=s=1000x1000:c=black@.3[vc];[0:v][vc]overlay[out] -ss 0 -to 10 -map [out] -y ou4.mp4


ffmpeg -i 123.mov -filter_complex color=s=1000x1000:c=blac...]]></description><category></category></item><item><title><![CDATA[自定义View——翻页效果]]></title><link>https://blog.youkuaiyun.com/u010629285/article/details/103029000</link><guid>https://blog.youkuaiyun.com/u010629285/article/details/103029000</guid><author>u010629285</author><pubDate>Tue, 12 Nov 2019 19:54:29 +0800</pubDate><description><![CDATA[预览效果
目录
ChangePictureView.java
代码
public class ChangePictureView extends View {

    //Y轴方向旋转角度
    private float degreeY;
    //不变的那一半，Y轴方向旋转角度
    private float fixDegreeY;
    //Z轴方向（平面内）旋转的角度
    ...]]></description><category></category></item></channel></rss>