自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android APK瘦身实战总结

随着APP版本的不断迭代,apk的包体积也越来越大,apk瘦身便显得很有必要。做apk瘦身不但能减少包大小,还能一定程度上加快IDE的编译打包速度。下面以我司项目为例,阐述我在做项目瘦身的过程。既然是瘦身,我们肯定要先分析下apk里哪些文件所占体积比较大,通过Android Studio 自带的Analyze Apk工具,我们可知:通过上图可知,资源文件、lib包、dex文件、resources.arsc所占比例较大,其中dex文件里压缩的主要是我们的字节码文件,可以将dex里跟debug相关的

2020-09-29 14:14:58 671

原创 2020年5月 每日收获的知识点

1.字符串的最大长度是多少? 在String对象内部是使用一个char数组来维护字符序列,也就是说,字符串的最大长度取决于字符数组的最大长度,我们知道在指定数组长度时,我们可以使用byte、short、char、int,而不能使用long,也就是说最大值为Integer.MAX_VALUE,十进制数就是2147483647,而一个char类型占2字节,那最大字符串长度也即是占4294967294个字节,将近4G。计算机能够承受多大的数组跟软硬件等诸多因素有关。 ...

2020-05-11 14:12:38 241

原创 读《见识》

读书收获

2022-07-10 18:27:53 190 1

原创 Android卡顿优化

我们知道,当APP进程的UI Thread和Render Thread在接到VSync信号后,绘制一帧所花的时间超过16.6ms,APP就会发生掉帧,实际上,在画面显示时,不仅仅和当前帧的数据有关,还跟相邻帧的步长有关系,如果相邻的步长没有规定到一个固定的范围内,用户也会感觉到明显的卡顿而Systrace看不出来。工欲善其事必先利其器,分析掉帧我一般通过以下几种方式分析卡顿。SysTrace使用1.首先要装Python 2.x的版本,SysTrace脚本不支持Python 3.x版本2.cd

2021-11-03 15:33:08 1359 2

原创 Charles抓包安全证书配置

1.系统是如何设计ANR的,都有哪些组件或者服务会发生ANR? ANR全程Application No Response,Android设计ANR的用意,是为了在系统与组件(四大组件)以及系统与用户(InputEvent)交互时进行超时监控,以判断应用进程(主线程)是否是卡死或相应过慢的问题,通俗来说,就是很多系统中看门狗(WatchDog)的设计思想。组件超时分类: 系统在通过Binder向应用进程发送上述组件或Input事件时,在AMS或Input服务端同时设置...

2021-07-01 10:13:22 647

原创 Android中的ANR

1.系统是如何设计ANR的,都有哪些组件或者服务会发生ANR?ANR全程Application No Response,Android设计ANR的用意,是为了在系统与zujian

2021-07-01 09:39:48 350 2

原创 滥用SharedPreference导致ANR

Google在设计之初为了方便开发者,实现了一套轻量级的数据持久化方案---SharedPreference,因为其简便的API,得到了开发者的青睐,对其依赖也越来越严重。随着版本迭代可以发现,越是重量级的应用,出现ANR的问题越来越严重。SP导致ANR原因分析问题一:sp文件创建后,会单独使用一个线程来加载解析对应的sp文件,但是当UI线程尝试访问sp中内容时,如果sp文件还未被完全加载解析到内存,此时UI线程会被block,直到sp文件被完全加载到内存中为止。具体ANR的情况如下:主

2021-05-24 11:31:48 698 1

原创 问题记录-Android调用finish()方法后,后续代码仍继续执行

代码中有个逻辑,针对某个条件做非空判断,如果为空,则调用finish()页面销毁,本以为后续代码不会走,实则不然,后续使用到判空对象的地方直接空指针了。在onCreate()生命周期方法里调用finish()并不会立马执行onDestory(),只是将当前页从栈顶移除,上一页显示到栈顶,当主线程处理完CREATE_ACTIVITY消息,才会处理H_DESTROY_ACTIVITY消息,然后回调Activity 的onDestory()方法。...

2021-01-27 11:57:11 979 1

原创 问题记录-部分手机视频全屏播放后,从屏幕右侧左滑一下,然后返回半屏,底部虚拟导航栏不显示问题

有部分小米手机在视频全屏播放后,从屏幕右侧左滑一下,然后返回半屏,发现半屏页面底部的导航栏不显示,实际上点击导航栏是有效果的。开始觉得是不是设置导航栏显隐的代码有兼容性问题,显隐方法让如下:/***隐藏导航栏*/private void hideSysBar(ViewGroup decorView) { int uiOptions = decorView.getSystemUiVisibility(); if (Build.VERSION.SDK_INT >

2021-01-07 18:29:24 666

原创 读《Head First 设计模式》记录

第一章设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。 针对接口编程,而不是针对实现编程,针对接口编程真正的意思是“针对超类型”编程。...

2020-12-30 09:45:27 110

原创 2020年10月份面试问题记录

映客1.ConstraintLayout 、FrameLayout 右下方放一个view2.从架构层面介绍自己设计的模块3.项目中遇到多线程的问题4.Recycler中onCreateViewHolder何时被调用多次 ,利用RecyclerView如何画圆环5.线程池的原理,线程个数最优分配 ,如果是无限长队列,如何设置拒绝策略6.volatile的作用7.Activity生命周期方法,透明和非透明两种8.onDraw方法需要注...

2020-12-03 16:06:01 2717 10

原创 adb 常用命令记录

1.安装apk(强制安装)adb installapk包的文件路径 adb install -r apk包的文件路径 2.卸载apkadb uninstall apk的包名 例如:adb uninstallcn.ubia.ubellplus3.启动APP首页adb shell am start -n 包名/要启动页面的全路径 例如:adb shell am start -n cn.u...

2020-11-25 11:11:26 341

原创 持续学习-WebView优化

加载速度慢 -----》性能提升内存消耗大 ------》内存优化用户体验不好 -----》提高用户体验安全性不高 -----》安全性不高程序层面加载流程:WebView初始化 ----》建立连接 -----》接收页面(接收样式、渲染)---》脚本下载、解析 ---》展现优化方案一:在客户端刚启动时,就初始化一个全局的WebView。经测试,仅创建一个WebView对象就花了126ms,但第二次new的时候时间是4ms,因为他们使用的是同一个浏览器...

2020-10-15 22:50:11 243

原创 设计模式二:七种结构型模式(上)

结构性模式就像搭积木,将不同的类结合在一起形成契合的结构,包括以下几种:适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式适配器模式适配器模式适用于有相关性但不兼容的结构,源接口通过一个中间件转换后才可以适用于目标接口,这个转换过程就是适配,这个中间件就是适配器。class HomeBattery { int supply() { // 家用电源提供一个 220V 的输出电压 return 220; }}cl

2020-10-14 14:28:33 218

原创 设计模式一:五种构建型模式

设计模式基于六大原则:单一职责原则:一个类应该只做一件事,一个类应该只有一个引起它修改的原因。 开闭原则:一个软件实体如类、模块、函数应该对扩展开发,对修改关闭。 依赖倒置原则:细节应该依赖于抽象,抽象不应该依赖于细节。把抽象层放在程序设计的高层,并保持稳定,程序的细节变化由底层的实现层来完成。 里氏替换原则:子类应该可以完全替换父类,也就是说在使用继承时,只扩展新功能,而不要破坏父类原有的功能。 迪米特原则:又叫最少知道原则,一个类不应该知道自己操作的类的细节,换言之,只和朋友谈话,不和朋友的

2020-10-14 09:21:41 1210

原创 持续学习--网络优化

一次网络请求从DNS域名解析开始,然后建立连接并发送数据到服务端,随后读取从服务端返回的数据,最后将连接释放,这样一次网络请求就结束了。那么网络优化可以从DNS解析开始:1.DNS优化(速度和安全性),安全性当然是DNS防劫持,可以使用收费的腾讯云或阿里云的HttpDNS,或者七牛提供的免费的happy-dns,其作用就是绕过运营商的DNS服务器,直接与DNS服务器的80端口进行交互,有效的防止了劫持;速度方面可以从ip直连(跳过了DNS解析,所以速度会变快)、DNS超时处理等方面入手。2.GZ

2020-10-12 22:24:50 429

原创 持续学习-存储优化之Protobuffer使用与原理

Protobuffer是谷歌开发出来用来替代XML和JSON。需要在项目的build.gradle和app的build.gradle里添加一些配置。1.序列化和反序列化速度更快(二进制方式存储),体积小、传输速度快,但可读性差了些。2.默认需要在main文件夹加创建文件夹proto,如果需要改,需要配置下。3.安装GenProtoBuf插件;在proto文件夹下创建比如person.proto文件。4.protobuffer在存储上有优势,因为他根本就没有存key,而json有存,5.需

2020-10-12 14:28:31 776 1

原创 重学数据结构与算法(15~19)

15 | 定位问题才能更好地解决问题:开发前的复杂度分析与技术选型我们前面学习的数据结构和算法思维,是解决问题和代码优化的基础。本节课开始,我们进入实战模块,从真正解决问题的角度来看看,如何将我们此前学到的知识灵活运用到实际工作中。问题定位和技术选型加入我现在面对一个实际的算法题,我需要从以下两个方面进行思考。首先,我们要明确目标。即用尽可能低的时间复杂度和空间复杂度,解决问题并写出代码;接着,我们要定位问题。目的是更高效地解决问题。这里定位问题包含很多内容。例如:这个问题时什么类型

2020-09-25 18:21:38 143

原创 重学数据结构与算法(1~12)

01 | 复杂度:如何衡量程序运行的效率?复杂度通常包括时间复杂度和空间复杂度,在具体计算时要注意以下几点:它与具体常系数无关,O(n)和O(2n)表示的是同样的复杂度。 复杂度相加时,选择高阶作为结果,也就是说O(n^2)+O(n)和O(n^2)表示同样的复杂度。 O(1)也是表示一个特殊的复杂度,即任务与算例个数n无关。时间复杂度与代码的结构设计高度相关,空间复杂度与代码中的数据结构的选择高度相关。02 | 数据结构:将“昂贵”的时间复杂度转换成“廉价”的空间复杂度我们需要从时间复

2020-09-25 15:15:16 890 2

原创 重学数据结构与算法(面试现场)

20 | 代码之外,技术面试应该具备哪些软素质技术面试一般涉及以下6个环节:简历筛查好的简历要满足以下3个必要条件,分别是信息完备、抽象概括、重点突出。信息完备,指的是必备的东西不可缺。例如姓名、学历、联系方式、工作经历等。 抽象概括,指的是可有可无的东西不要写。例如,政治面貌、户籍等。 重点突出,指的是对你有利的东西要放大放粗。例如,电话、S绩效、系统性能提高50%等。自我介绍建议控制在5分钟,按照时间顺序,比如从大学开始分段介绍,高度抽象出来,以10句左右为限制。说的时候语

2020-09-25 15:01:40 226

原创 经典排序算法原理与优劣对比

二分查找要求原数组必须有序。其实,由有序到无序,这是算法领域最常见的一类问题。本课时主要学习4种常见的排序算法,包括冒泡排序、插入排序、归并排序以及快速排序。衡量一个排序算法的优劣,我们主要从以下3个角度进行分析:时间复杂度,具体包括,最好时间复杂度、最坏时间复杂度以及平均时间复杂度。 空间复杂度,如果空间复杂度为1,也叫作原地排序。 稳定性,排序的稳定性是指相等的数据对象,在排序之后,顺序是否能保证不变。常见的排序算法及其思想1.冒泡排序原理:从第一个数据开始,依次比较相...

2020-09-24 17:18:44 217

原创 Android进阶课学习收获(27~28)

第27讲:面对UI卡顿,如何入手分析解决问题? 对于UI性能分析,Systrace是目前使用最广的工具。它能够帮助开发者分析多个模块的运行状态以及详细信息。比如SurfaceFlinger、View刷机机制等。通过Android提供的脚本systrace.py,可以设置数据采集方式并收集相关程序运行数据,最终生成一个网页文件,提供程序开发者分析程序性能问题。Systrace简单使用在Android SDK中提供了运行Systrace的脚本,具体路径在 android-sdk/plat...

2020-09-23 16:55:59 308

原创 持续学习--Android性能优化

2020.9.21 性能优化之运用设计模式优化代码结构 好的设计模式可以增强代码的可阅读性、易维护性、可扩展性。例如门面模式,我们在使用某个三方库(比如网络库)之前,可以先创建一个门面类,这个门面类是使用该三方库的唯一入口,这样就降低了业务逻辑和三方库的耦合度,一旦我们想更换三方库,只需要在门面类中修改即可。 然后在门面类中修改却不符合设计模式的开闭原则,什么是开闭原则呢,简单的讲就是,对修改关闭,对扩展开放。延续上面的例子,比如我们有一个VolleyFacade门面类,现在要将...

2020-09-22 11:17:47 168

原创 Android进阶课学习收获(29~30)

第29讲:MVP中presenter生命周期管理 我们经常在Android MVP架构中的Presenter层做一些耗时操作,比如请求网络数据等。然后根据请求后的结果刷新View。但是如果按返回结束Activity,而Presenter仍然在执行耗时操作,那么就有可能造成内存泄漏,严重时甚至会造成程序崩溃,因为Presenter中的View已经变为null。为了解决这个问题,我们需要将Activity的某些生命周期方法与Presenter保持一致。Lifecycle绑定Presente...

2020-09-22 08:53:12 191

原创 Android进阶课学习收获(31~33)

第32讲:解析动态权限适配遇到的问题 Android 6.0之前,APP需要的权限会在安装阶段向用户展示,APP运行期间不需要动态判断权限是否已申请。从6.0之后的版本开始,对于部分权限,APP需要在代码中动态申请相应的权限。 Android权限分2种,分为普通权限和危险权限,这两种权限都需要在AndroidManifest清单文件中声明。普通权限在程序运行期间自动获取,危险权限比如通讯录、图库、位置等这类操作,Android系统要求App主动向用户展示操作所需要的权限,只有用户...

2020-09-17 14:45:33 644

原创 Android进阶课学习(24-26)

第24讲:APK如何做到包体积优化?因为每个项目的背景、实现方式都不尽相同,导致各个项目之间能列出的共性相对较少。本节主要从两部分谈谈对包体积优化的一些尝试:安装包监控、安装包大小优化。安装包监控Android Studio 的APK Analyser analyser的使用非常简单,只需将需要分析的apk文件拖入Android Studio即可,它会显示各项内容所占的大小,并按照大小排序,比如图片占用了比较大的资源空间,可以针对其做压缩优化等操作。Matrix 的ApkCh...

2020-09-16 11:48:19 324

原创 Android进阶课学习收获 (19~22)

第19讲:startActivity启动过程分析 在手机桌面上点击某一个icon后,实际上最终就是通过startActivity去打开某一个Activity页面,在startActivity操作中还需要判断目标Activity的进程是否已经创建,如果没有,则在显示Activity之前还需要将进程Process提前创建出来。假设ActivityA跳转到另一个APP中的ActivityB,整个startActivity的流程分为3大部分,也涉及3个进程之间的交互:ActivityA --&gt..

2020-09-10 19:04:50 339

原创 Android进阶课学习收获 (13~18)

第13讲:Android是如何通过Activity进行交互的?taskAffinity 单纯使用taskAffinity不能导致Activity被创建在新的任务栈中,需要配合使用singleTask或者singleInstance。我们可以在命令行里输入 adb shell dumpsys activity activities 来输出日志 查看任务栈情况,其中一个TaskRecord代表一个任务栈,如下:taskAffinity + allowTaskReparenting...

2020-08-28 18:47:58 453

原创 持续学习--PMS服务启动原理、AMS服务执行流程详解

1.PMS服务启动原理?从开机到APP启动,PMS服务处理机制及流程?PMS全称Package Manager Service,由System Server启动,PMS运行在单独的系统进程中,启动的时候通过ServerManager.addService()存入PMS对象,应用层通过ServerManager.getService()获取对象,由于PMS运行在单独的进程中,所有其获取的对象是一个IBinder接口。 PMS的作用时期主要集中在手机开机时期,它会扫描/data/system和/data/

2020-08-25 13:49:18 1333

原创 持续学习--Handler原理

线程之间通过Handler机制通信的大致流程:Handler通过sendMessage()、postMessage()以及对应的一些delay方法来发送消息; 消息队列MesageQueue通过enqueueMessage()将消息加入队列(其实是单链表,并且在插入的时候是从头部开始,按照时间优先原则插入); Looper对象的loop()方法,不间断的通过MessageQueue的next()方法取message,取到msg后,调用msg.target.dispatchMessage(msg),其

2020-08-17 11:21:19 142

原创 正确的认知自我和世界

认知是一件非常重要的是事情,俗话说,“人贵有自知之明”,一个人只有对自己有正确的认识,才能对标世界,找准自己的位置。 对事物只凭片面的了解或局部的经验,就乱加猜测,做出判断,这种做法是非常可怕的。如果用于做商业判断,就很容易将企业推向深渊。 要想更好地认识世界,获得最详实、最可靠、最接地气的一手信息,还需要与大量的市场参与者交流,从他们口中获得真实的信息,这是最基本的认知态度。在交流的过程当中尽可能少的表达自己的观点,多去有意识地锻炼自己的提问能力。 因为每...

2020-08-11 12:09:10 1343

原创 Android进阶学习收获(7~12节)

第07节:Java内存模型与线程 Java内存模型(Java Memory Model)简称JMM,它所描述的是多线程并发、CPU缓存等方面的内容。在每个线程中,都会有一块内部的工作内存,这块工作内存保存了主内存共享数据的拷贝副本。我们在第一节课中,了解到JVM内存结构中有一块线程独立共享的内存空间----虚拟机栈,所以这里我们会自然而然的将线程工作内存理解为虚拟机栈。实际上这种理解是不正确的,虚拟机栈和线程的工作内存并不是一个概念,在Java线程中并不存在所谓的工作内存,它只是对CPU寄存...

2020-07-03 16:31:19 230

原创 Android进阶学习收获(1~6节)

第一节《程序运行时,内存到底是如何分配的》 Java虚拟机在执行Java程序时,会把他管理的内存区域划分为不同的数据区域,下面这张图描述了一个HelloWorld.java文件被JVM加载到内存的过程:HelloWorld.java文件首先经过编译器编译,生成HelloWorld.class 字节码文件。 当Java程序访问这个类时,需要通过ClassLoader将HelloWorld.class字节码文件加载到JVM的内存中。 JVM的内存可以划分为若干个不同的数据区域,主要分为:程序计..

2020-05-25 10:51:17 339

原创 读《刻意练习》收获

天才是训练的产物,他们进行大量正确、有效的训练。

2020-05-08 13:49:41 271

原创 问题记录-Git打tag命名重复导致的问题

最近遇到的问题,当代码发版后,我在稳定分支上打了一个tag(比如tag名为v_tag_1.0.0),然而过了几天后,产品告知有一个UI显示的问题,迅速改了后,准备再打一个tag,考虑到新的包并没有改版本号,就想着先删除本地和远端的tag(v_tag_1.0.0),然后重新打一个名字相同的tag。打完后,没发现有什么问题,但几天后有组内同学说jekins打包报错了:ERROR: Error f...

2020-05-06 17:26:56 3202

原创 Vue学习每日收获

2020.4.271.通过Vue官方推荐的脚手架Vue Cli 来创建项目,安装脚手架命名如下:npm install -g @vue/cli or yarn global add @vue/cli2.创建一个名为hello-world的vue项目,命令如下:vue create hello-world3.进入 hello-world文件夹下:cd hello-wo...

2020-04-27 19:32:03 558

原创 极客网个人刷题记录汇总

1.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 /** * 思路:左下角的值是一行中最小,一列中最大的,所以从这个值开始比较,如果比这个值大,就将列加1,再比较, * 如果比这个值小,就将行加1,往上查,总的时间复杂度为O...

2020-04-10 18:33:35 399

原创 问题记录-Android Studio 升级到3.6.1以后,每次编译编译的是否提示gradle download maven-metadata.xml

前段时间将Android Studio升级到了3.6.1稳定版本,升级完了没有感觉编译速度有什么影响,但今天突然每次编译的时候gradle都提示“download maven-metadata.xml”,而且这个时间一般在20分钟左右,特别熬人! 难道是之前的gradle offline 设置不能用了?检查了下gradle,配置正常,最后的解决方案是,打开菜单栏 View--...

2020-04-05 18:30:40 4512 5

原创 问题记录-Android应用内版本升级时,覆盖安装时报ActivityNotFoundException问题

项目内提示升级的时候,有部分华为用户报下载完APP后应用闪退。赶紧找机型复现了下,报错信息如下:E/AndroidRuntime: FATAL EXCEPTION: main Process: com.qding.guanjia, PID: 30428 android.content.ActivityNotFoundException: No Activity found t...

2020-03-31 10:15:56 736

原创 Android高手课----内存优化1

Android中的内存优化是我们性能优化中比较重要的一环,其主要包括两方面的工作:优化RAM(Random Access Memory 也即主存,是与CPU直接交换数据的内部存储器,可以随时读写,而且速度快),即降低运行时内存。目的是防止程序发生OOM异常,以及降低程序由于内存过大被LMK机制杀死的概率。另外,不合理的内存使用会使GC大大增多,从而导致程序变卡。 优化ROM(Re...

2020-02-29 21:33:47 533

自定义列表选择Dialog

自定义列表选择Dialog,适用网络请求数据

2015-08-11

空空如也

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

TA关注的人

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