自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(911)
  • 资源 (2)
  • 收藏
  • 关注

原创 Android面试总结

第一部分:Android部分Android基础知识 Android内存泄漏总结 Handler内存泄漏分析及解决 ListView详解 RecyclerView和ListView的异同 AsyncTask源码分析 插件化技术 自定义控件 Android绘制流程 Android动画机制 事件分发机制 ANR问题 Art和Da...

2020-07-15 01:42:11 1501

转载 Android的KeyStore保护数据

让我们先清除一些有关Android Keystore系统的知识。密钥库不一定只用于密码,它可以用于任何敏感数据,这样做的方式使攻击者或恶意/未经授权的软件很难从我们这里获取此信息。简单来说:应用程序只能编辑,保存和检索密钥。这个概念很简单,但功能强大。该应用将生成或接收私钥-公钥对,然后将其存储在Android Keystore系统中。然后,在将公用密钥存储在特定于应用程序的文件夹中之前,可以使用公用密钥对应用程序秘密进行加密,并在需要时使用专用密钥对相同信息进行解密。

2023-06-17 01:43:05 3879

转载 Android KeyStore的使用

先来看看官方对他的定义:AndroidKeystore系统可让您将加密密钥存储在容器中,以使其更难从设备中提取。一旦密钥进入密钥库,就可以将其用于加密操作,而密钥材料仍不可导出。而且,它提供了限制何时和如何使用密钥的功能,例如要求用户进行身份验证才能使用密钥,或者限制仅在某些加密模式下使用密钥。定义其实很简单,他就是用来保存加解密的Key和证书的。

2023-06-17 01:38:14 8166

原创 Kotlin高阶函数

高阶函数即指:将函数用作一个函数的参数或者返回值的函数。demoprivate fun testHightLevel() { MoreFun.loginEngine("helloo", "kotlin") { if (it) { println("登录成功") } else { println("登录失败") } }

2022-05-23 01:02:52 3997

原创 Kotlin lambda表达式

ex1://只有形参,返回值为空,参数的名称在函数中aStr, bStr运算是->printlnval method : (String, String) -> Unit= {aStr, bStr -> println("aStr: $aStr, bStr: $bStr")}method("Hello", "World")输出:I/System.out: aStr: Hello, bStr: Worldex2://函数只想执行printlnval metho

2022-05-20 23:57:27 1018

原创 Android Studio插件开发

我们使用独立的方式创建项目一个独立的Groovy/Java/Kotlin项目,该项目生成并发布一个jar然后可以在多个版本中使用它并与他人共享,并且此jar包可能包含一些插件,或者将多个相关的任务类捆绑到单个库中接下来我们先从基本的构建脚本中的插件开始操作步骤1.首先创建一个Android工程项目2.创建一个新的module下一步创建完成以后可以删除不用的目录或者文件新创建的myplugin的build.gradle配置参考如下:apply plugin: 'g

2022-05-19 00:20:56 3170

原创 Could not find method uploadArchives() for arguments [build_9y1ozxjm08lb8wodb59629wm8$_run_closure3

配置Gradle插件开发时出现下面的报错,报错处理 Could not find method uploadArchives() for arguments [build_9y1ozxjm08lb8wodb59629wm8$_run_closure3@70580117] on project ':myapplication' of type org.gradle.api.Project.原来的build.gradle配置如下:apply plugin: 'groovy'depende

2022-05-18 01:55:06 7798

原创 Build was configured to prefer settings repositories over project repositories but repository ‘Googl

关于Android Studio报错Build was configured to prefer settings repositories over project repositories but repository 'Google' was added by build file 'build.gradle'的解决方案本人的原因:增加kotlin的兼容支持;当然还有其他原因导致,这里不细述;有用解法步骤如下:1,将setting.gradle文件的该配置注释掉://dep.

2022-05-09 23:43:18 1388

转载 IdleHandler 的原理分析和妙用

我们都知道 Android 是基于消息处理机制的,比如应用启动过程,Activity 启动以及用户点击行为都与 Handler 息息相关,Handler 负责 Android 中的消息处理,对于 Android 中的消息处理机制来说,MessageQueue 和 Looper,Message 也是非常重要的对象,而 IdleHandler 是 MessageQueue 的静态内部接口。IdleHandler,这是一种在只有当消息队列没有消息时或者是队列中的消息还没有到执行时间时才会执行的 IdleHan

2022-05-01 22:33:14 589

转载 Retrofit 原理篇

1、Retrofit 实现原理Retrofit 通过 java 接口以及注解来描述网络请求,并用动态代理的方式生成网络请求的 request,然后通过 client 调用相应的网络框架(默认 okhttp)去发起网络请求,并将返回的 response 通过 converterFactorty 转换成相应的数据 model,最后通过 calladapter 转换成其他数据方式(如 rxjava Observable)通过 Retrofit. create( ciass)方法创建出 Service in

2022-04-01 01:40:22 4060

转载 ReentrantLock实现原理及源码分析

 ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁,同时也可以绑定多个Conditon。可重入性/公平锁/非公平锁  可重入性    所谓的可重入性,就是可以支持一个线程对锁的重复获取,原生的synchronized就具有可重入性,一个用synchroniz

2022-03-28 13:48:45 238

转载 HTTPDNS解析

简介HTTPDNS使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到阿里云的HTTPDNS服务器,从而绕过运营商的Local DNS,能够避免Local DNS造成的域名劫持问题和调度不精准问题。 HTTPDNS是面向移动开发者推出的一款域名解析产品,具有域名防劫持、精准调度等特性。开通HTTPDNS服务后,您就可以在管理控制台添加要解析的域名,调用服务API进行域名解析。HTTPDNS是一款递归DNS服务,与权威DNS不同,HTTPDNS并不具备决定解析结果的能力,而

2022-03-22 22:44:31 995

转载 深入分析Android ANR

ANR概述首先,ANR(Application Not responding)是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。ANR由消息处理机制保证,Android在系统层实现了一套精密的机制来发现ANR,核心原理是消息调度和超时处理。其次,ANR机制主体实现在系统层。所有与ANR相关的消息,都会经过系统进程(system_server)调度,然后派发到应用进程完成对消息的实际处理,同时,系统进程设计

2022-03-21 21:27:17 861

转载 Android性能优化之内存优化

前言成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。内存优化可以说是性能优化中最重要的优化点之一,可以说,如果你没有掌握系统的内存优化方案,就不能说你对Android的性能优化有过多的研究与探索。本篇,笔者将带领大家一起来系统地学习Android中的内存优化。可能有不少读者都知道,在内存管理上,JVM拥有垃圾内存回收的机制,自身会在虚拟机层面自动分配和释放内存,因此不需要像使用C/C++一样在代码中分配和释放某一块内存。Android系统的内存

2022-03-20 18:30:48 880

转载 Android性能优化之网络优化DNS和HttpDNS知识详解

本文转载自微信公众号「Android开发编程」,作者Android开发编程 。转载本文请联系Android开发编程公众号。前言小计在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认我们使用运营商的 LocalDNS 服务。有数据统计,在这一块 3G 网络下,耗时在 200~300ms,4G 网络下也需要 100ms。解析慢,并不是 LocalDNS 最大的问题,它还存在一些更为严重的问题,例如:DNS 劫持、DNS 调度不准确(缓存、转发、NAT)导致性能退化等等,这些才是网络优.

2022-03-20 13:44:43 829

转载 临时抱佛脚:IdleHandler 的原理分析和妙用

我们都知道 Android 是基于消息处理机制的,比如应用启动过程,Activity 启动以及用户点击行为都与 Handler 息息相关,Handler 负责 Android 中的消息处理,对于 Android 中的消息处理机制来说,MessageQueue 和 Looper,Message 也是非常重要的对象,而 IdleHandler 是 MessageQueue 的静态内部接口。IdleHandler,这是一种在只有当消息队列没有消息时或者是队列中的消息还没有到执行时间时才会执行的 IdleHan

2022-03-20 13:39:14 648

转载 Android异常处理之卡顿

参考自动化卡顿检测方案及优化深入探索Android卡顿优化(上)深入探索Android卡顿优化(下)卡顿关于什么是卡顿?可以参考什么是卡顿原理一个线程不管有多少Handler,它只会有一个Looper存在,主线程执行的任何代码都会通过Looper.loop()方法执行。而在Looper函数中,它有一个mLogging对象,这个对象在每个message处理前后都会被调用。主线程发生了卡顿,那一定是在dispatchMessage()方法中执行了耗时操作。那么,我们就可以通过这个mLogg

2022-03-20 13:33:22 1297

转载 你真的懂 Fragment 吗?Fragment 的过去、现在和未来~

Fragment 是一个历史悠久的组件,从 API 11 引入至今,已经成为 Android 开发中最常用的组件之一。在这个专题里,我们将从「使用 & 核心原理 & 面试」三个层面来讨论 Fragment。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。Fragment 的过去、现在和未来1.1 Fragment 解决了什么问题?(过去)Fragment 可以将 Activity 视图拆分为多个区块进行模块化地管理 ,避免了 Activity 视图代码过度臃肿混乱。

2022-03-04 22:45:39 399

原创 SpringBoot将项目打包成jar包

步骤1:1.首先在pom.xml文件中导入Springboot的maven依赖;<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>&lt

2021-08-28 11:00:06 4107

转载 静态代理和动态代理

什么是代理代理是设计模式的一种,代理类为委托类提供消息预处理,消息转发,事后消息处理等功能。Java中的代理分为三种角色:代理类(ProxySubject) 委托类(RealSubject) 接口(Subject)三者关系可以表示如下图:Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成,而动态代理代理类则是在Java运行时动态生成。静态代理Java中的静态代理要求代理类(ProxySubject)和委托类(RealSubject.

2021-08-23 01:10:24 2982

转载 TCP/IP协议与Http协议的区别

TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。 关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/I...

2021-08-22 20:35:07 475

转载 线程池ThreadPoolExecutor实现原理

引言线程池:可以理解为缓冲区,由于频繁的创建销毁线程会带来一定的成本,可以预先创建但不立即销毁,以共享方式为别人提供服务,一来可以提供效率,再者可以控制线程无线扩张。合理利用线程池能够带来三个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利..

2021-06-14 01:52:59 3407

转载 SurfaceView及TextureView对比

SurfaceView是什么 ?SurfaceView优点及缺点?SurfaceView中双缓冲?TextureView是什么?TextureView优点及缺点?两者的性能相比如何?播放器应该选择谁?SurfaceView是什么?它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有对应的WindowState,在SurfaceFlinger中有Layer。我们知道,一般的Activity包含的

2021-05-23 23:47:58 6212

转载 认识ClassLoader

写在前面今天继续《热修复与插件化》专题的分享,专栏的上一篇是说到了JVM的一些基础知识点,本篇接着来说一下ClassLoader的相关内容,当然这里说的是Android中的ClassLoader哈,上一篇《带你认识JVM》中我们已经介绍过了Java中的类加载器、它们各自的作用以及加载流程,这里就不再说了,有需要的自行查看,接下来就直奔主题了,去看Android的类加载机制!一、androidClassLoader基本介绍1.1、种类详解BootClassLoader:它的作用和Java中的B

2021-04-26 01:04:38 3469 1

转载 Android热修复实战之AndFix

目录写在前面目录一、AndFix基本介绍1.1、AndFix简介1.2、AndFix方法体替换规则1.3、AndFix BUG修复过程二、AndFix代码实战2.1、AndFix集成2.2、AndFix初始化2.3、构建APK三、AndFix源码解析写在前面上一篇《Android热修复技术简介》中对Android的热修复技术的概念和常用的技术方案做了一个简单的介绍,那么今天就来实战一下热修复技术,我们使用的是AndFix,为什么是它?因为无论是从使用上

2021-04-26 00:38:11 217

转载 Android 实现搜索历史(2)

该demo使用了自定义的流式布局+AutoCompleteTextView+SharedPreferences实现了各大APP常用到的搜索历史记录的功能,代码简单实用。废话不多说,上效果图为证:上代码:第一步:自定义流式布局ZFlowLayout(让标签自动换行)package cn.cnpp.searchhistory;import android.content.Context;import android.util.AttributeSet;import android

2021-03-12 20:48:38 318

转载 Android 实现搜索历史(1)

SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空1. 判断搜索内容是否含表情,不需要可以不判断 /** * 校验字符串是否含有表情 * @param content * @return */ public static boolean hasEmoji(String content){ Pattern pattern = Pattern.compile("[\ud83c\udc00.

2021-03-12 20:44:29 676

转载 Listview与RecyclerView对比浅析【重点对比缓存】

RecyclerView和ListView都是用于加载大量数据的控件,RecyclerView作为listview的改进加强型,相对于ListView,RecyclerView做出了以下优化:1.布局效果ListView 的布局比较单一,只有一个纵向效果;RecyclerView 的布局效果丰富, 可以在 LayoutMananger 中设置:线性布局(纵向,横向),表格布局,瀑布流布局在RecyclerView 中,如果存在的 LayoutManager 不能满足需求,可以自定义 Layout

2021-03-06 21:12:52 2047

转载 Java进阶--编译时注解处理器(APT)详解

本文同步发布在掘金,未经本人允许不得转载上篇文章《Java进阶–Java注解及其实例应用》我们使用注解+反射实现了一个仿ButterKnife功能的示例。考虑到反射是在运行时完成的,多少会影响程序性能。因此,ButterKnife本身并非基于注解+反射来实现的,而是用APT技术在编译时处理的。APT什么呢?接下来一起来看。一、APT简介1.什么是APT?APT即为Annotation Processing Tool,它是javac的一个工具,中文意思为编译时注解处理器。APT可以用来在编译时扫描

2021-03-01 01:01:17 572

转载 ReentrantLock实现原理及源码分析

ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁,同时也可以绑定多个Conditon。可重入性/公平锁/非公平锁  可重入性    所谓的可重入性,就是可以支持一个线程对锁的重复获取,原生的synchronized就具有可重入性,一个用synchronize

2021-02-24 01:24:25 1390

转载 Android UI性能优化 检测应用中的UI卡顿

一、概述在做app性能优化的时候,大家都希望能够写出丝滑的UI界面,以前写过一篇博客,主要是基于Google当时发布的性能优化典范,主要提供一些UI优化性能示例:Android UI性能优化实战 识别绘制中的性能问题实际上,由于各种机型的配置不同、代码迭代历史悠久,代码中可能会存在很多在UI线程耗时的操作,所以我们希望有一套简单检测机制,帮助我们定位耗时发生的位置。本篇博客主要描述如何检测应用在UI线程的卡顿,目前已经有两种比较典型方式来检测了:利用UI线程Looper打印的日志 利用C

2021-02-20 00:10:33 210

转载 Android性能优化-检测App卡顿

在移动APP性能评测-流畅度评测中,我们介绍了如何准确客观评价APP的流畅度,最终采用SM指标来评价应用的流畅度,在知道如何评价流畅度之后,我们应该如何来检测出APP中的UI卡顿就是我们面临的一个新的问题;在Android性能优化-App卡顿中介绍了Google官方提供的检测卡顿的方法,除此之外还有那边比较好的方法来检测应用卡顿?目前主流的方法主要有:1.利用UI线程Looper打印的日志,典型代表就是BlockCanary;2.采用Choreographer;BlockCanary:blockcana

2021-02-20 00:06:30 530

转载 Choreographer全解析

前言今天继续屏幕刷新机制的知识讲解,上文说到vsync的处理,每一帧UI的绘制前期处理都在Choreographer中实现,那么今天就来看看这个神奇的舞蹈编舞师是怎么将UI变化反应到屏幕上的。代码未动,图先行UI变化上期说到app并不是每一个vsync信号都能接收到的,只有当应用有绘制需求的时候,才会通过scheduledVsync方法申请VSYNC信号。那我们就从有绘制需求开始看,当我们修改了UI后,都会执行invalidate方法进行绘制,这里我们举例setText方法,再回顾.

2021-02-20 00:04:03 5528

转载 Choreographer机制和卡顿优化

Choreographer 是 Android 4.1 google的黄油计划新增的机制,用于配合系统的 VSYNC 中断信号。其主要用途是接收系统的 VSYNC 信号,统一管理应用的输入、动画和绘制等任务的执行时机。也就是(CALLBACK_INPUT,CALLBACK_ANIMATION,CALLBACK_TRAVERSAL,CALLBACK_COMMIT),而我们主要的用途就是来查看app的帧率情况,下面来具体分析下这个神秘的类当我们进行invalidate或者requestLayout时,总会执行

2021-02-20 00:01:46 1596

转载 MemoryFile匿名共享内存使用

Android提供了一个高效的共享内存机制。如果应用中涉及到在多个进程间交换数据时使用Android提高的共享内存机制将会大大的提高效率。但是也许是出于安全考虑,在应用层使用共享内存机制将会遇到很多障碍,这篇文章旨在解决这些障碍frameworks/base/core/java/android/os/MemoryFile.java的源码位置下面是5.0版本的网上源码MemoryFile.java使用共享内存的流程大概是:在一个进程中创建一个共享内存。在Android应用层中,用MemoryF

2021-02-19 01:03:26 1185

转载 Android匿名共享内存(Ashmem)原理

阅读之前,不妨先思考一个问题,在Android系统中,APP端View视图的数据是如何传递SurfaceFlinger服务的呢?View绘制的数据最终是按照一帧一帧显示到屏幕的,而每一帧都会占用一定的存储空间,在APP端执行draw的时候,数据很明显是要绘制到APP的进程空间,但是视图窗口要经过SurfaceFlinger图层混排才会生成最终的帧,而SurfaceFlinger又运行在另一个独立的服务进程,那么View视图的数据是如何在两个进程间传递的呢,普通的Binder通信肯定不行,因为Binder不太

2021-02-19 00:57:21 554

原创 AndroidStudio 的Profiler+Mat检测内存泄漏

什么是内存泄漏申请了一块内存空间,但是一直没有释放。如果不断的申请还会引起内存溢出(OOM)什么是内存抖动频繁的GC操作,如果垃圾回收的速度没有生成的快,也会引起OOM如何检测?我使用的是Profiler+Mat,前提是必须要ADB调试MAT工具下载地址(https://www.eclipse.org/mat/)运行完Profiler会出现点击MEMORY部分点击下载 开始记录生成右键Heap Dump导出文件然后将该文件通过sd.

2021-02-19 00:30:10 507

转载 linux内存映射mmap原理分析

内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。以下是一个把普遍文件映射到用户空间的内存区域的示意图。基本函数 mmap函数是unix/linux下的系统调用,详细内容可参考《Unix Netword programming》卷二12.2节。mmap系统调用并不是完..

2021-02-18 20:23:54 161

原创 git报错[email protected]: Permission denied

新PC安装git和Android studio以后尝试拉取代码自己分支的代码会出现下面的错误23:43 Update failed Warning: Permanently added 'gitlab.com,172.65.251.78' (ECDSA) to the list of known hosts. [email protected]: Permission denied (publickey,keyboard-interactive). Could not read from

2021-02-17 00:24:55 23204 1

转载 Android性能优化常见Q

1、图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理?参考回答: 首先我们要清楚图片的三级缓存是如何的 如果内存足够时不回收。内存不够时就回收软引用对象 2、内存中如果加载一张500*500的png高清图片.应该是占用多少的内存?参考回答: 不考虑屏幕比的话:占用内存=500 * 500 * 4 = 1000000B ≈ 0.95MB 考虑屏幕比的的话:占用内存= 宽度像素 x (inTargetDensity ..

2021-02-16 15:31:57 245

Android高级进阶 顾浩鑫

《Android高级进阶》的主要目的在于给读者一个完整的Android中高级开发者知识图谱

2018-09-26

android stuido从入门到精通

android stuido从入门到精通

2017-07-03

空空如也

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

TA关注的人

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