自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 资源 (1)
  • 收藏
  • 关注

原创 Synchronized锁的升级

偏向锁标志位置1对象头中的标志位默认为“01”,即偏向模式使用 CAS 操作 让锁对象的对象头的 偏向线程 id 指向当前线程 id偏向锁的释放只有有竞争时才会释放锁。释放锁只能发生在全局安全点(这个时间点是上没有正在执行的代码)暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态撤销偏向锁,恢复到无锁或轻量级锁的状态当 锁对象的对象头的 偏向线程 id 指向当前线程 id时,直接执行同步块的代码当另一个线程获取锁时发现偏向线程 id和自己不一样,需要再测试一下Mark Word中偏向锁的标识是否设置成1(是

2022-06-26 00:45:56 233 1

原创 Android调试Plugin

首先在plugin项目中,点击Edit Configurations点击+号,选择remote然后修改一下名字将command line的命令复制一下复制任务接下来切到使用这个plugin的项目中然后改下名字,将上面复制的命令粘贴到VM options文本框中,然后修改suspend的值为y然后AndroidStudio会将当前任务切换为刚创建的这个任务,我们几点run按钮接下来任务会进入等待状态然后我们切到plugin项目,debug第一步骤创建的remote任务然后等一会就可以发现断点停在了我们需

2022-06-26 00:38:26 1102

原创 ASM字节码插桩解决国内隐私问题

2021年政府加强了对用户隐私的保护,App 的上架更新必须通过隐私合规扫描,而对 App 开发者来说就是必须在用户同意隐私政策前不能调用政府规定的隐私相关的 api。对于大家自己项目内部的代码来说,可以自己手动改掉,但是对于一些用到的第三方库就束手无策了,也许这些库有隐私版本的更新,但是对大家来说,可能版本差距太大,项目改动会比较多,当公司老项目比较多时,这种修改方案就耗费时间太久了。而使用Gradle插件+ASM的方式可以很好的解决我们的困难。ASM是AOP编程中一种比较成熟的框架,而 AOP是面向切面

2022-06-26 00:31:41 764

原创 Crash和Anr以及启动优化记录

通过Vcm捕捉到的崩溃信息和Firebase Crashlytics的崩溃信息和埋点日志,初步猜测定位问题可能是广告刚好崩溃率上升大概跟广告位的上增长比较相近。于是就需要上线去广告灰度版本进行测试。Glide首页瀑布流图片很多是Webp,然后Vcm捕获到一部分Glide的解析崩溃大量的Anr发生在FCM 的 FirebaseInstanceIdReceiver ,因为App里面使用的是透传通知,Fcm收到后台消息后需要后台启动App响应透传通知信息,怀疑启动过慢导致了FirebaseInstanceIdRe

2022-06-26 00:25:28 519

原创 12-属性动画源码分析

属性动画主要使用 ObjectAnimator 和 ValueAnimator 两个类,其中ObjectAnimator 是 ValueAnimator 的子类,ObjectAnimator 对 ValueAnimator 做了一层封装,实现了对属性值的自动改变,api调用更加简略我们一般使用 ObjectAnimator 的静态方法去创建 ObjectAnimator 对象。例如上面的,我们来看下它里面是如何创建的1.调用了 ObjectAnimator 的私有构造方法首先设置目标对象然后设

2022-06-26 00:22:11 215

原创 5-Canvas

Canvas.save会将一个Matrix矩阵保存到一个栈中,当调用Canvas.restore时,会将栈顶的Matrix出栈,并将其应用到当前Canvas,Matrix是一个3*3的矩阵,他里面有9个参数,cosX -sinX translateXsinX cosX translateY0 0 scale其中,sinX和cosX,代表的是旋转角度的sin和cos值。注意旋转的正方向是顺时针方向。translateX和translateY代表的是平移的X和Y。scale代表的是缩放的大小。Canvas.

2022-06-26 00:20:30 71

原创 7.理解WindowManager

Window是一个抽象类,具体的实现类是PhoneWindow,它对View进行管理。WindowManager是一个接口类,继承自接口ViewManager,它是用来管理Window的,它的实现类为WindowManagerImpl。对Window(View)进行添加、更新和删除操作可以使用WindowManager,WindowManager会将具体的工作交给WMS来处理,WindowManager和WMS通过Binder来进行跨进程通信,WMS作为系统服务有很多API不会暴露给WindowManage

2022-06-25 23:55:09 633

原创 6.理解ActivityManagerService

由于AMS的逻辑多而复杂,因此是有一些类帮助AMS完成相关逻辑,而AMS和这些类就被称为AMS家族。Android7.0和Android8.0对于AMS相关部分处理有较大区别,需要区别看待ActivityManager是一个和AMS相关联的类,它主要对运行中的Activity进行管理,但是这些管理工作并不是由ActivityManager来处理的,而是交给AMS来处理的。ActivityManager中的方法会通过ActivityManagerNative(简称AMN)的getDefault方法来得到Act

2022-06-25 22:46:41 580

原创 5.理解上下文Context

Context,上下文。是一个 应用程序环境信息 的接口Context的使用场景分为两个大类由于Activity,Service和Application都间接继承自Context,所以一个应用程序进程中Context的数量等于Activity和Service的总个数+1(Application)Context是一个抽象类,它的内部定义了很多方法以及静态常量,它的具体实现为ContextImpl。和Context相关联的类,除了ContextImpl还有ContextWrapper、ContextThemeW

2022-06-25 12:19:22 475

原创 4.四大组件的工作过程

Activity的启动分为两种一种是根Activity的启动过程,另一种是普通Activity的启动过程。根Activity指的是应用程序启动的第一个Activity,因此根Activity的启动过程也可以理解为应用程序的启动过程。普通Activity指的是除第一个Activity外其他的Activity。Launcher桌面上应用程序的快捷图标就是启动根Activity的入口,当我们点击某个程序的快捷图标时,就会通过Launcher请求Ams来启动该应用程序。Launch请求Ams的时序图如下当我们点击应

2022-06-25 00:33:18 541

原创 3.应用程序进程启动过程

应用程序进程创建过程可以分为两个部分,分别是AMS发送启动应用进程请求以及Zygote接受请求并创建应用程序进程时序图如下Ams如果想要启动应用就需要向Zygote进程发送创建应用进程的请求,AMS通过调用startProcessLocked方法向Zygote进程发送请求/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java/frameworks/base/core/java/android

2022-06-24 23:02:54 894

原创 2.Android系统启动

Android系统的启动流程有以下几个部分启动电源以及系统启动当电源按下时,引导芯片从预定义的地方(固化在ROM)开始执行。加载引导程序(BootLoader)到RAM,然后执行引导程序BootLoader引导程序BootLoader是在Android操作系统开始运行前的一个小程序,主要作用是把系统OS(Linux系统?)拉起来并运行Linux内核启动当Linux内核启动时,先进行系统设置(设置缓存、被保护存储器、计划列表、加载驱动)。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动i

2022-06-24 14:11:39 726

原创 Android性能优化

一、防止程序闪退Android出现闪退和崩溃主要有以下三个原因ANR(程序无响应):原因是系统规定在四大组件中不能做耗时过多的操作解决:看anr日志具体分析Exception(异常) 出现了程序员意想不到的错误。一般用try-catch包裹可能抛出异常的代码。通过Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)不过全局异常LMK(低内存)Android默认分配给虚拟机的内存是有限的。

2020-07-11 12:35:05 235

原创 View绘制流程的开启

上一篇文章《Activity的创建》中我们说到了创建后会调用其生命周期,而我们的方法一般这么写我一般会使用方法设置的界面布局,今天我们就看下它做了什么显然自己并没有对其做处理,而是交给了方法处理,方法返回的是中的全局变量,它是窗口类型。是一个抽象类,在Android中它唯一的子类是,也就是说Activity的全局变量必定是类型的。我们看下是如何被创建的。我们在上一篇文章《Activity的创建》讲到了Activity是在的创建的,而在创建Activity后,会调用方法将和与绑定,而就在该方法里我们创建了

2020-06-24 00:18:35 180

原创 App启动(三)Activity的创建

上一篇我们讲到AMS在被远程调用attachApplication方法后,会在attachApplicationLocked方法里远程调用ApplicationThread的bindApplication创建Application对象。实际上attachApplicationLocked方法不止进行了Application对象的创建在创建完Application对象后还进行了Activity的创建,我们这次多看一点它的源码1.ActivityManagerService#attachApplication

2020-06-24 00:17:14 538

原创 App启动(二)AMS在Application创建过程中的调度

上一篇文章中我们说到ActivityThread通过AMS的attachApplication方法将mAppThread对象关联到了AMS中,并且后面通过mAppThread对Application进行创建、生命周期的管理等。这次我们就研究下它是怎么做到上述这些的。首先我们继续看ActivityThread#attach方法搬过来public void attach(boolean system){ ... //获得IActivityManager实例,他是一个ActivityManag

2020-06-24 00:16:03 770

原创 App启动(一)Application的创建

大家都知道Java程序的入口是 main 方法,但在Android中我们只知道App启动从Application开始,而Android是基于Java的,本身也是从main方法开始的,而这个 main方法是在ActivityThread类的。下面我们就看下ActivityThread的main方法是如何工作的。1. ActivityThread #mainpublic static void main(String[] args){ ... //初始化Looper Looper.p

2020-06-24 00:15:01 4138

原创 Activity启动流程

一、创建Application首先 ActivityThread main()方法public static void main(String[] args){ ... //初始化Looper Looper.prepareMainLooper(); ... //实例化一个ActivityThread ActivityThread thread = new ActivityThread(); //这个方法最后就是为了发送出创建Applicati

2020-05-24 22:43:32 345

原创 13.RecyclerView

一、什么是RecyclerViewRecyclerView介绍为有限的屏幕显示大量数据的灵活的ViewListView的局限只有纵向列表一种布局没有支持动画的Api,动画实现复杂接口设计和系统不一致?setOnItemClickListenersetOnItemLongClickListenersetSelection()没有强制实现ViewHolder性能不如RecyclerViewRecyclerView的优势默认支持Linear、Grid、StaggeredGr

2020-05-24 21:43:11 159

原创 6.自定义View-绘制

绘制的基本要素自定义绘制的最基本的步骤是,提前创建好Paint对象,重写onDraw(),把绘制代码写在onDraw里面.一、Canvas.drawXXX() 和 Paint 基础drawXXX() 方法:在整个绘制区域统一涂上指定的颜色。Canvas.drawColor(@ColorInt int color) 颜色填充drawRGB(int r, int g, int b) 和 drawARGB(int a, int r, int g, int b) 作用同上drawCirc

2020-05-24 00:13:19 761

原创 5.okhttp

简单使用OkHttpClient client = new OkHttpClient.Builder() .build();Request request = new Request.Builder() .url(ENDPOINT) .build();Call call = client.newCall(request);call.enqueue(new Callback() { @Overri

2020-05-22 22:51:41 282

原创 4.retrofit

简单使用新建接口,并用注解声明请求public interface GitHub { @GET("/repos/{owner}/{repo}/contributors") Call<List<Contributor>> contributors( @Path("owner") String owner, @Path("repo") String repo); }创建Retrofit对象Retrofit retrofit = new

2020-05-19 23:13:55 160

原创 3.登录协议Tcp-IPHTTPS

登录和授权的区别登录:身份认证,确认【你是你】的过程授权:由身份或持有的令牌确认享有某些权限(例如获取用户信息)。登录实质上的目地也是为了确认权限在实际的应用中,多数场景下“登录”和“授权”界限是模糊的HTTP 中确认授权的两种方式通过Cookie通过Authorization HeaderCookie起源:“购物车”功能的需求,由Netscape 浏览器的开发团队打造工作机制服务器需要客户端保存的内容,放在Set-CookieHeader里返回,客户端会自动保存

2020-05-18 23:41:08 898

原创 2.加密解密和hash

现在密码学可以加密任何二进制数据非对称加密的出现使得密码学有了更广泛的用途:数字签名对称加密通信双方使用同一个密钥,对 原数据 使用加密算法配合上密钥加密生成 密文。解密时对 密文 使用加密过程的完全逆过程配合密钥来进行解密 生成原文。经典算法DES(56为密钥,密钥太短而被逐渐弃用)AES(128位、192位、256位密钥,现在流行对称加密的作用加密通信,防止信息在不安全的网络上被截获后,信息被人读取或篡改对称加密的破解破解思路拿到一组或对组原文-密文对设法找到一个密钥

2020-05-18 23:11:00 904

原创 1.http的概念、原理及其工作机制

HTTP 的定义HTTP是一个简单的请求-响应协议,位于TCP/IP协议簇的最顶层–应用层,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出,而消息内容则具有一个类似MIME的格式。TCP/IP协议簇参考链接: https://www.cnblogs.com/xiaochi/p/9020290.htmlMIME格式MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,是

2020-05-18 22:33:58 1207

原创 retrofit设计模式

retrofit 的设计模式1. 建造者模式建造者模式的定义是:将一个复杂对象的构造与它的表示分离,使得建造过程可以创建不同的表示我们来看一下retrofit的构建代码很明显的建造者模式2. 门面模式门面模式要求一个子系统的外部与其内部通信必须通过一个统一的对象进行,而retrofit里这个统一的对象就是我们创建的Retrofit对象,我们只管配置Retrofit,然后获取接口对象...

2020-01-05 22:09:14 759

原创 24-桥梁模式

桥梁模式一、定义将抽象和实现解耦,使得两者可以独立的变化桥梁模式的通用类图Abstraction是抽象化角色,它的主要职责是定义出该角色的行为,同时保存一个队实现化角色的引用,通常是抽象类;Implementor是实现化角色,他是接口或抽象类,定义角色必须的行为和属性;RefinedAbstraction是修正抽象化角色,它引用实现化角色对抽象化角色进行修正;ConcreteImplem...

2020-01-05 20:29:57 117

原创 23-享元模式

享元模式一、定义使用共享对象可有效的支持大量的细粒度的对象要求细粒度对象,就会使得对象数量多而且性质相近,为了区分,将对象分为两个部分:内部状态与外部状态内部状态,内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随着环境改变而改变,他们可以作为一个对象的动态附加信息,不必直接存储在具体某个对象中,属于可共享的部分外部状态,外部状态是对象得以依赖的一个标记,是对环境改变而改变的、...

2020-01-05 20:28:24 104

原创 22-解释器模式

解释器模式一、定义给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子解释器模式的类图AbstractExpression是抽象解释器;TerminalExpression是终结符表达式,实现与文法中的元素相关联的解释操作,通常一个解释器模式只有一个终结符表达式,但可以有多个实例,对应不同的终结符;NonterminalExpression是非终结...

2020-01-05 20:26:59 85

原创 21-状态模式

状态模式一、定义当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。状态模式的通用类图如下State是抽象状态角色,负责对象状态定义,并且封装环境角色以实现状态切换;ConcreteState是具体状态角色,完成本状态的行为管理以及趋向状态管理(本状态如何股过度到其他状态);Context是环境角色,定义客户端需要的接口,并且负责具体转台的切换;状态模式的通用源码...

2020-01-05 19:13:20 100

原创 20-访问者模式

访问者模式一、定义封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作通用类图Visitor是抽象访问者,生命访问者可以访问那些元素,在程序中visit方法的参数定义那些对象是可以被访问的;ConcreteVisitor是具体访问者,它定义访问者访问到一个类后要做什么事情;Element是抽象元素,生命接收哪一些类访问者访问,通过acce...

2020-01-05 19:11:40 122

原创 19-备忘录模式

备忘录模式一、定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。通俗地说,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法备忘录模式的通用类图如下Originator是发起人角色,记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据;Memento是备忘录角色,负责存储Or...

2020-01-05 18:40:46 104

原创 18-门面模式

门面模式### 一、定义要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。门面模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生门面模式的类图Facade是门面角色,此角色知晓子系统的所有功能和责任,一般会将客户端发来的请求委派到相应的子系统中,没有实际的业务逻辑 ,只是一...

2020-01-05 18:36:24 172 1

原创 17-观察者模式

观察者模式一、定义定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。观察者模式的通用类图Subject是被观察者,它必须能够动态地增加、取消观察者。它一般仅仅完成管理观察者并通知观察者的职责;Observer是观察者;concreteSubject是具体的观察者,定义被观察者自己的逻辑,同时定义对那些事件进行通知;ConcreteO...

2020-01-05 18:35:07 358

原创 16-组合模式

组合模式### 一、定义将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性组合模式的通用类图Component是抽象构件角色,定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。 Leaf是叶子构件,其下再没有其他的分支,是遍历的最小单位。Composite是树枝构件,作用是组合树枝节点和叶子节点形成一个树形结构。组合模式的通用...

2020-01-05 18:31:38 99

原创 15-迭代器模式

迭代器模式一、定义提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发迭代器的通用类图Iterator是抽象迭代器,负责定义访问和遍历元素的接口; ConcreteIterator是具体迭代器,要实现迭代器接口,完成容器元素的遍历;Aggregate是...

2020-01-05 18:29:58 91

原创 14-适配器模式

适配器模式一、定义将一个类的接口变换为客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式又叫做变压器模式,也叫做包装模式(Wrapper)适配器模式的类图Target是目标角色,该角色定义把其他类转换为何种接口,也就是我们的期望接口;Adaptee,是源角色是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会变成 Adapter适...

2020-01-05 18:28:47 103

原创 13-策略模式

策略模式一、定义定义一组算法,将每个算法搜封装起来,并且使他们之间可以互换。策略模式的通用类图Context是封装角色,起承上启下作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化;Strategy是抽象策略角色,抽象策略算法,通常为接口,定义每个策略或算法必须具有的方法和属性;ConcreteStrategy是具体策略角色,实现抽象策略中的操作;策略模式的通用源码抽象...

2020-01-05 18:27:33 79

原创 12-装饰模式

装饰模式一、定义在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式的类图Component为抽象构件,是一个接口或抽象类,定义最核心的对象,也就是最原始对象;ConcreteComponent 为具体构件,是抽象构件的实现,需要装饰的对象;Decorator是装饰角色,一般是一个抽象类,它的属性里必然有一个pri...

2020-01-05 18:26:00 95

原创 11-责任链模式

责任链模式一、定义使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链条传递该请求,直到有对象处理它责任链的通用类责任链模式的核心在“链”上,“链”是由多个处理者ConcreteHandler组成责任链的通用源码抽象处理者public abstract class Handler { private Handler...

2020-01-05 18:24:03 83

移动开发经典Demo

学校C语言商机试题

2015-08-16

空空如也

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

TA关注的人

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