- 博客(426)
- 资源 (53)
- 收藏
- 关注
原创 Kotlin - 函数与Lambda表达式
函数函数是以特定功能组织起来的代码块,函数定义格式如下:fun 函数名:[返回值类型]{[函数体]}fun 函数名 = [表达式]fun sum(arg1: Int, arg2: Int): Int { return arg1 + arg2}如果函数方法体只有一行代码,那可以将 {} 改为 =,去掉 return,表达式的值将作为函数返回值:fun sum(arg1: Int, arg2: Int) = arg1 + arg2默认返回值类型任何函数都是有返回值的,一般函数方
2021-01-30 22:06:38 195
原创 Kotlin - 常量与变量
常量Kotlin 中的常量使用 val 修改,一旦定义值后"不可再修改",常量类型分 2 种:运行时常量(val):编译期不能确定它的值,代码中会保留变量对它的引用。编译期常量(const val):编译期就知道值,并且会把代码中所有对它的引用都替换成它的值。下面我们来举例看看,这两者在代码层面上的区别到底是什么。运行时常量(val)这是一段很简单的 Kotlin 代码,先定义一个常量 FINAL_NAME,再定义一个变量 myName 引用常量 FINAL_NAME:val FINAL_
2021-01-30 22:05:05 818 1
原创 Kotlin - 区间与数组
区间(Range)区间是一个数学上的概念,表示范围。区间的声明Kotlin 中可以使用 .. 或 until 来声明区间:val range: IntRange = 0..1024 // 闭区间[0,1024],包括1024val rangeExclusive: IntRange = 0 until 1024 // 半开区间[0,1024),不包括1024val emptyRange: IntRange = 0..-1 // 空区间[]其实这里的 .. 操作符对应的是 Int 类中的一个 r
2021-01-28 23:02:21 687
原创 Kotlin - 空类型和智能类型转换
空类型Kotlin 跟 Java 的最大不同应当就属空类型这点了,使用 Kotlin 开发,IDE 会智能的对可能为空的地方进行报错提示,开发者必须处理该错误,否则连编译都通过不了,从而降低程序 NullPointException 异常的出现几率,所以,一般情况下使用 Kotlin 开发很少见到 NPE 异常。非空与可空类型fun getName(): String { return "lqr"}这是一个很普通的函数声明,它指明了函数返回值是一个 String 类型,对此,Kotlin
2021-01-28 22:59:19 247
原创 Kotlin - 类与构造器
类是什么?类是一个抽象的概念,是具有某些特征的事物的概括,不特定指代任何一个具体的事物。写法:class <类名> { <成员>}Number(Int、Float、Byte)、字符串(String)也是类class Girl constructor(var nature: String,var appearance: String,var sound: String){ // 构造方法的方法体 init { println("女
2021-01-21 21:08:01 414
原创 Kotlin - 数据类型
Boolean 类型示例代码:val aBoolean: Boolean = trueval anotherBoolean: Boolean = falsekotlin 中的 Boolean 在多数情况下,相当于 Java 中基本类型 boolean,只有在必要情况下才会装箱成 Java 中的装箱类型 Boolean,由编译器决定,通常我们不需要关心。Number 类型Number 即数字,主要包括整型和浮点型:分类类型位宽浮点型Double64Float32
2021-01-20 20:30:02 393
原创 RePlugin强制退出App
RePlugin强制退出需求:插件中按“退出”按钮,就完全退出整个app,包括宿主。一、前提以下所有的理论,都是基于宿主跟插件使用同个进程这个大前提下,即不需要常驻进程。apply plugin: 'replugin-host-gradle'repluginHostConfig { useAppCompat = true persistentEnable = false // 设置为“不需要常驻进程”}“不需要常驻进程” 的目的是为了减少整个app的内存开销。二、问题
2021-01-17 09:47:15 377
原创 RePlugin集成Fresco
Fresco版本说明目前fresco最新版本2.3.0,但无法直接在插件中集成从1.14开始要求使用AndroidX ,向下选择1.13.0从1.10.0开始没有armeabi, 向下选择1.9.0从1.8.0开始强制使用SoLoader,向下选择1.7.1插件集成Fresco遇到的问题这里需要重点说明一下SoLoader问题,fresco在1.8.0版本开始,就使用SoLoader替换了SoLoaderShim,原文:SoLoader has been released f
2021-01-17 09:46:00 255
原创 AndroidTV——获取Mac地址
一、核心工具类亲测 Android9、Android10 可用,注意:前提条件是,必须联网才能获取到Mac地址,否则为null。/** * @author LQR * @time 2020/8/24 * @desc 获取Mac地址工具类 * <p> * 必须在联网的情况下才能获取到mac地址 */public class MacUtil { private static final String TAG = "MacUtil"; private Mac
2020-10-10 16:58:22 1049 1
原创 Docker——配置国内源
1、创建或修改daemon.jsondaemon.json 文件路径为:/etc/docker/daemon.json,使用vi或vim打开daemon.json:vim /etc/docker/daemon.jsonetc目录下,可能没有docker文件夹,需要手动创建:mkdir /etc/docker2、daemon.json配置直接复制粘贴以下内容:{ "registr...
2020-04-01 11:07:50 3563
原创 AndroidTV——解决EditText焦点无法转移问题
经反馈,在AndroidTV9.0 盒子上发现EditText一旦获取了焦点之后,遥控器上的方向键就无效了,即焦点无法再转移到其他焦点控件上,但这个问题在Android7.0及以下盒子上却不会出现,应该是Android8.0及以上源码做了修改,故查看EditText源码,得知确实是官方源码对方向键进行了处理~一、源码分析EditText源码中搜索onKeyDown,定位到父类TextView中...
2020-03-31 14:09:48 1733
原创 AndroidNDK——Cmake详解
一、Cmake语法详解1、什么是CMake在Android Studio 2.2及以上,构建原生库的默认工具是CMake。CMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。CMake并不直接构建出最终的软件,而是产生其他工具的脚本(如makefile),然后再依据这个工具的构建方式使用。CMake...
2020-02-19 09:13:03 1596
原创 AndroidNDK——makefile语法详解
一、编译流程详解编译流程编译:将高级语言编写的程序转换为二进制代码可执行性目标程序的过程四大过程:预处理、编译、汇编、链接1、预处理完成宏替换、文件引入,以及去除空行、注释等,为下一步的编译做准备;也就是对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。// test.c文件内容#include <stdio.h>int main(){ ...
2020-02-12 15:24:18 505
原创 Android音视频——Libyuv使用实战
近期换部门,从事之前从未接触过的Android音视频开发,主要涉及到USB摄像头调用、libyuv处理Nv21图像、直播推流等功能,对应的库有【UVCCamera】、【libyuv】等,刚接触没经验也没人带挺难搞的,而且网上资料很凌乱,所以,开此篇总结&汇总一下近期的研究,兴许可以帮助到别人,本人亦是新手,文中如有不正确的地方,欢迎指出点评。一、libyuv入门先简单说明一下,不管是A...
2019-09-20 15:48:41 1252 1
原创 不一样的Gradle多渠道配置总结
好久没有写博客了,突然想把这段时间项目中使用到的技术和多渠道相关的认识总结分享一下~一、新增渠道使用AndroidStudio配合gradle,可以很方便的输出多个渠道包,只需要在app Module下的build.gradle中,对productFlavors领域进行配置即可,假设我当前开发的项目,需要上线不同的地区,一个是国内版,一个美国版,还有一个免费版,那么gradle可以这么配:a...
2019-05-15 19:18:03 1032
原创 DroidPlugin手札——home键强杀处理
DroidPlugin手札——home键强杀处理DroidPlugin是360开源的插件化框架,github地址为:https://github.com/DroidPluginTeam/DroidPlugin。因公司业务及项目历史原因,来公司的这段时间一直在使用DroidPlugin进行业务开发,期间遇到的一些问题在此进行总结记录。一、背景为了方便访客知道本章在解决什么问题,这里先把需求背...
2019-01-21 09:08:12 4929
原创 Gradle入门系列(五)——Gradle其它模块与Plugin插件
Gradle其它模块一、Settings类settings.gradle(对应Settings.java)决定哪些工程需要被gradle处理,占用了整个gradle生命周期的三分之一,即Initialzation初始化阶段。二、SourceSet类对默认的文件位置进行修改,从而让gradle知道哪种资源要从哪些文件夹中去查找。// sourceSets是可以调用多次的android {...
2019-01-05 17:33:19 979
原创 Gradle入门系列(四)——初识Gradle Task
Gradle中的Task一、Task定义及配置TaskContainer:管理所有的Task,如:增加、查找。定义(创建)Task// 直接通过task函数去创建task helloTask { println 'i am helloTask.'}// 通过TaskContainer去创建this.tasks.create(name: 'helloTask2') { ...
2019-01-05 17:32:41 1064 1
原创 Gradle入门系列(三)——初识Gradle与Project
初识Gradle一、Gradle的基本概念一个开源的项目自动化构建工具,建立在Apache Ant和Apache Maven概念的基础上,并引入了基于Groovy的特定领域语言(DSL),而不再使用XML形式管理构建脚本。同时,gradle还是一个编程框架,可以让开发者使用编程的思想来实现应用构建。gradle的组成:groovy核心语法build script blockgradle...
2019-01-05 17:32:06 1581
原创 Gradle入门系列(二)——groovy高级语法
groovy高级语法一、json操作使用groovy自带的json工具进行json操作groovy.json.JsonSlurper:将json原数据转成实体对象groovy.json.JsonOutput:将实体对象转成json数据def list = [ new Person(name: 'John', age: 25), new Person(name: 'Major'...
2019-01-05 17:31:28 674
原创 Gradle入门系列(一)——groovy基础语法
groovy基础语法一、变量1、类型对象类型、基本类型(本质是对象类型)int x = 0println x.classdouble y = 3.14println y.class输出:class java.lang.Integerclass java.lang.Double结论:从log输出可以得出,groovy中实质上是没有基本类型的,本质是java中的装箱对象...
2019-01-05 17:30:49 746
原创 解决ImageView超出父控件(或屏幕边界)时,图片挤压问题
一、需求在屏幕边缘显示一张图片,超出屏幕宽度时,只显示图片的左边部分,并且不被挤压,其余部分剪切。但我在实际开发中,踩了个坑,这里做个记录,下面通过图片直观了解一下情况: 理想 现实 目前可以确定,这种情况会出现在使用RelativeLayout作为ImageView父控件的情况下,其他类型的ViewGroup效果如何,暂不确定。二、分...
2018-09-05 11:37:40 3691 1
原创 热修复与插件化基础——Java与Android的类加载器
一、java中的ClassLoader1、类加载器2、加载流程Loading:类的信息从文件中获取并载入到JVM的内存中。Verifying:检查读入的结构是否符合JVM规范的描述。Preparing:分配一人上结构用来存储类信息。Resolving:把类的常量池中的所有符号引用变成直接引用。Initializing:执行静态初始化程序,把静态变量初始化成指定...
2018-05-18 00:28:20 550
原创 热修复与插件化基础——Java与Android虚拟机
一、Java虚拟机(JVM)1、JVM整体结构使用javac将java文件编译成class文件。类加载器(ClassLoader)将class字节码加载进JVM对应的内存中。JVM将内存分配给方法区、堆区、栈区、本地方式栈4个部分,这4个部分分别存储字节码不同的部分。垃圾回收器(gc)会管理整个内存空间中的垃圾。2、Java代码的编译和执行过程下图是Java代...
2018-05-13 20:31:07 665
原创 热修复与插件化基础——dex与class
一、dex/class浅析1、class与dex对比 类型 class文件 dex文件 定义 能够被jvm识别、加载并执行的文件格式 能够被dvm识别、加载并执行的文件格式 如何生成 使用java命令(javac) 使用java命令、dx命令 作用 记录一个类文件的所有信息 记录整个工程中所有类文件的信息2...
2018-05-13 20:21:58 579
原创 使用PorterDuff解决clipPath无法抗锯齿问题
一、简述前段时间公司史无前例的接了一个大数据外包项目(哇~我们又不是外包公司(╯°Д°)╯︵ ┻━┻),要求搞很多图表方便观察运营的数据情况,图表当然要用到MPAndroidChart啦,但并不是所有的图表都可以用它用实现,这时就需要自定义View了,其中有一个要求,如下图所示,这就是本篇要实现的效果:本篇全文适合像我一样的小白细细观看,如果你很赶时间,就只是进来看看标题上的解决方案,...
2018-03-16 14:20:07 4635 1
原创 Libgdx——使用pixmap绘制透明圆角矩形
一、简述1、需求最近在使用Libgdx进行游戏大厅开发,遇到这种需求:为个别文本控件(Label)设置纯色透明的圆角矩形背景。2、思路Libgdx中的Label是提供背景设置的:对Label的Style的background属性进行设置即可,这个background是个Drawable,可以使用图片作为Label的背景,很好很强大,但我这个项目中的Label背景只需要一种透...
2018-02-09 09:37:24 1618
原创 热修复——Bugly让热修复变得如此简单
一、简述在上一篇《热修复——Tinker的集成与使用》中,根据Tinker官方Wiki集成了Tinker,但那仅仅只是本地集成,有一个重要的问题没有解决,那就是补丁从服务器下发到用户手机上,如果你团队中的后台开发人员实力够强,那么完全可以自己做一个补丁管理系统,但我想应该没多少人愿意花精力在这个后台管理系统的开发上面吧,且开发有时候就是在造bug,鬼知道会挖出一个多大的坑呢?对于这样的一个问题,据我
2017-12-12 17:30:10 2197 3
原创 热修复——Tinker的集成与使用
一、简述 Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。当然,你也可以使用Tinker来更新你的插件。上面是Tinker官方Wiki的原话,意思嘛相信大家都看得明白,但注意啦,它并没有说Tinker可以让补丁实时生效(也叫无感知更新),它必须在打上补丁后重启App(重启进程),补丁才会发挥作用,这跟阿里的热
2017-12-06 17:51:26 1252
原创 使用注解打造自己的IOC框架
一、简述IoC和AOP可谓是后台开发入门必学的知识(Spring相关),但这两者都仅仅只是概念而已,并非具体技术实现,同样的,Android也可以使用IoC和AOP,之前已经写过如何在Android开发中使用AOP了,有兴趣的朋友可以看我之前的博客(顺便点个关注吧),所以,本文主题便是IoC。 控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征,并非面向对象编
2017-11-28 19:49:58 595
原创 手撸一个简易Android数据库框架
一、简述众所周知,移动端(不管是Android还是iOS)使用的数据库是Sqlite,这种小型的数据库很适合移动端存储大量的数据,使用上也跟mysql基本无差,但官方提供的API在操作性方面真不咋的,你必须掌握一定程度的sql语句,否则将很难驾驭。所以,有很多第三方的数据库框架就开始流行,如:GreenDao、Litepal等。这些ORM数据库框架,可以帮助开发者节省大量编写数据库操作代码的时间,只
2017-11-27 11:55:26 1609
原创 Android面向切面编程(AOP)
一、简述1、AOP的概念如果你用java做过后台开发,那么你一定知道AOP这个概念。如果不知道也无妨,套用百度百科的介绍,也能让你明白这玩意是干什么的: AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数
2017-11-16 18:12:00 637
原创 热修复——深入浅出原理与实现
一、简述热修复无疑是这2年较火的新技术,是作为安卓工程师必学的技能之一。在热修复出现之前,一个已经上线的app中如果出现了bug,即使是一个非常小的bug,不及时更新的话有可能存在风险,若要及时更新就得将app重新打包发布到应用市场后,让用户再一次下载,这样就大大降低了用户体验,当热修复出现之后,这样的问题就不再是问题了。目前较火的热修复方案大致分为两派,分别是:阿里系:DeXposed、andf
2017-11-14 19:28:43 13656 16
原创 LinkedList与Queue源码分析
java中的数据结构源码解析的系列文章: ArrayList源码解析 LinkedList源码解析一、简述上篇已经分析了基于数组实现数据存储的ArrayList(线性表),而本篇的主角是LinkedList,这个使用了链表实现数据存储的集合,它的增、删、查、改方式又会是怎样的呢?下面就开始对LinkedList的源码进行分析吧。二、分析List在分析LinkedList之前,还是先瞄一
2017-11-08 17:42:43 917
原创 ArrayList源码分析
java中的数据结构源码解析的系列文章: ArrayList源码解析 LinkedList源码解析一、简述我们知道,数据结构中有两种存储结构,分别是:顺序存储结构(线性表)、链式存储结构(链表),在java中,对这两种结构分别进行实现的类有:顺序存储结构:ArrayList、Stack链式存储结构:LinkedList、Queue本篇只对ArrayList的源码进行分析,对于其他
2017-11-08 17:42:00 1326
原创 项目实战 - 使用Fiddler抓取bilibili安卓客户端口数据并分析(http、https)
一、简述经过了一个多星期的时间(自2017/10/16开始),到目前(2017/10/24)为止,项目框架的搭建已基本完成、还完成了首页中「直播」与「推荐」Fragment的数据填充,可以说相仿度很高,说这么多不如先看看效果。很6吧,但这不是重点,本篇要记录的,是使用fiddler来抓取app客户端的数据(包括http和https的数据抓取),并记录下对接口与数据的分析结果,下面就直入主题吧。二、使
2017-10-24 16:57:39 4770
原创 项目实战-仿bilibili刷新按钮的实现
一、简述 最近跟小伙伴一起讨论了一下,决定一起仿一个BiliBili的app(包括android端和iOS端),我们并没有打算把这个项目完全做完,毕竟我们的重点是掌握一些新框架的使用,并在实战过程中发现并弥补自身的不足。 本系列将记录我(android端)在开发过程中的一些我觉得有必要记录的功能实现而已,并不是完整的从0到1的完整教程,若个别看官大爷觉得不好请出门左拐谢谢。以
2017-10-24 13:00:19 7589 18
原创 redis系列(二)- 语法与命令
redis系列文章: redis系列(一)- 安装与启动 redis系列(二)- 语法与命令一、简述Redis支持的键值类型有:String字符类型、map散列类型、list列表类型、set集合类型、sortedset有序集合类型。本篇将对这些键值类型在使用上进行总结,并介绍下Keys命令,虽然语法简单,但由于数量过多,还需要我们多多实践。二、String字符类型1、赋值语法:SET
2017-09-27 00:39:01 1314
原创 redis系列(一)- 安装与启动
redis系列文章: redis系列(一)- 安装与启动 redis系列(二)- 语法与命令一、Redis介绍Redis是NoSql的一种,在弄清楚Redis是个什么玩意之前,先了解下NoSql是什么。1、什么是NoSqlNoSql,全名:Not Only Sql,是一种非关系型数据库,它不能替代关系弄数据库,只是关系型数据库的一个补充,是可以解决高并发、高可用、高扩展、大数据存储等一
2017-09-27 00:38:26 4228 1
原创 SpringBoot详解(四)-优雅地处理日志
一、简介日志功能在j2ee项目中是一个相当常见的功能,在一个小项目中或许你可以在一个个方法中,使用日志表的Mapper生成一条条的日志记录,但这无非是最烂的做法之一,因为这种做法会让日志Mapper分布到了项目的多处代码中,后续很难管理。而对于大型的项目而言,这种做法根本不能采用。本篇文章将介绍,使用自定义注解,配合AOP,优雅的完成日志功能。 本文Demo使用的是Spring Boot框架,但
2017-09-09 16:52:23 3201
三级缓存网络图片查看器
2016-05-22
默认使用DES加密聊天信息的SocketChat(内含DES与RSA加密工具)
2016-05-19
视频缩略图和显示的缓存异步机制
2016-05-15
ViewPagerIndicator
2016-05-09
SlidingMenu侧边栏的lib及实例
2016-05-08
获取缓存及清理缓存会用到的aidl文件
2016-04-18
安卓shell工具RootTools.jar
2016-04-16
安卓桌面小火箭发射
2016-04-16
安卓挂断电话用到的aidl
2016-04-15
利用Filter全局中文过滤(get和post请求中文乱码问题)
2016-10-23
使用ThreadLocal解决代码分层问题
2016-10-22
使用jar使用验证码功能(ValidateCode.jar )
2016-10-15
使用makefile编译多个.c文件例子
2016-08-13
commons-beanutils-1.8.3-connections.jar
2016-07-01
genymotion 5.0以上的 ARM_Translation
2016-06-29
android vitamio在线视频播放demo
2016-06-29
Genymotion-ARM-Translation_v1.1
2016-06-29
xstream-1.4.7
2016-06-18
xml的解析、生成工具
2016-06-18
java解析json的工具--json-lib
2016-06-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人