自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 资源 (7)
  • 收藏
  • 关注

原创 Anddroid 性能优化——ANR 实践集锦

本文意在记录个人在学习和做项目过程中遇到的 ANR 问题以及如何解决这些 ANR 问题的个人心得。应用的卡顿、ANR 性能问题除了和我们编码息息相关,设备等级、系统环境因素也占据了半壁江山。对于“系统问题”,我们是否无作为就好了?其实我们可以在应用层面做好最佳编码姿势~

2023-03-12 11:57:20 1859

原创 Android 获取真实的进程运行时内存

实时获取进程运行时内存方法

2022-03-05 18:46:34 7098 2

原创 Android NDK开发1——开发流程+依赖外部so+生成自实现so+静态注册JNI+动态注册JNI

背景:在越来越卷的安卓生态中,一名安卓开发不仅要懂四大组件、Handler、View绘制与事件分发、RecyclerView、动画、JetPack、组件化、插件化、热修复、性能优化、Framework、各种开源框架OKhttp、Retrofit、Eventbus、MMKV等等。近年来开始卷到了Native层,NDK开发是安卓领域必备的技能。项目开发过程中,往往有需要在Native层开发的场景:隐私数据加解密、音视频编解码、人脸检测追踪等AI能力......本文是个人学习NDK开发小结:NDK开发流程

2022-01-23 22:08:44 4121 1

原创 Android 11 拍照+录制视频保存到外部共享区域

本文是Android 11 从外部存储读取文件到应用沙盒存储 和Android 11 从沙盒拷贝文件到外部共享存储区域实践篇。项目中我们有拍摄图片或者录制视频保存到外部共享存储区域的需求。Android 10之前,我们可以直接new File的形式访问外部存储区域的任意路径。Android 10后,Google推出了沙盒机制,应用通过new File形式访问只能访问自己沙盒下路径;可以通过ContentResolver访问外部共享存储区域。外部共享存储区域:主要是指Enviromn.....

2021-11-28 00:29:10 4015

原创 Android 11 从沙盒拷贝文件到外部共享存储区域

本文是Android 11 从外部存储读取文件到应用沙盒存储 兄弟篇 :Android 11 从沙盒拷贝文件到外部共享存储区域,效果:1. 需求中我们需要把自己应用沙盒的文件拷贝到外部共享存储区域,提供给其他app使用1)外部共享存储区域:主要是指Enviromnent下的 如Environment.DIRECTORY_DCIMEnvironment.DIRECTORY_DOCUMENTSEnvironment.DIRECTORY_DOWNLOADSEnvironme...

2021-11-27 23:26:15 5045 3

原创 Android 11 从外部存储读取文件到应用沙盒存储

Android10之前,访问外部存储目录只需要Environment.getExternalStorageDirectory().getPath()获取根目录,再通过new File()的形式访问。Android 10 开始,Google建议开发者使用文件选择访问外部存储,但是没有强制。Android 11以上,开始强制不能再通过new File()的形式访问外部存储了。效果:1. FileHandlePresenter.java实现。封装方法:发Intent拉起文件选择器..

2021-11-20 17:24:56 7379 2

原创 Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放

1. 实现效果 效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频源本身就不适合全屏,会把视频拉伸,效果不好。 抖音上的视频源应该都有严格的宽高尺寸,才能做到全屏有很好的效果。2. 技术选型1)翻页功能:网上有不少例子是使用RecyclerView + PagerSnapHelper 来实现翻页功能,但是笔者认为使用ViewPager2更加简洁。....

2021-10-07 11:18:12 7358 15

原创 android 嵌套ViewPager + Fragment实现仿头条UI框架Demo

1. 实现效果2. 核心实现 1)BaseViewPagerAdapter.javapublic class BaseViewPagerAdapter extends FragmentPagerAdapter { protected ViewPager mViewPager; protected LinearLayout mTabContainer; protected int[] mTabResArray; protected List<....

2021-10-03 16:42:09 955

原创 MVVM: ViewModel+LiveData+DataBinding+Retrofit+Room+Paging+RxJava 总结与实践(Java实现)

最近,阅读了国外一篇关于viewmodel+livedata的文章https://proandroiddev.com/mvvm-architecture-viewmodel-and-livedata-part-1-604f50cda1 ,收益良多,纸上得来终觉浅,绝知此事要躬行,决定自己也亲手撸一个demo。一两句话和一两个图总结:LiveData作用(1)实际上就是一个观察者模式的......

2019-03-21 17:39:53 5939 25

原创 【Android 性能优化:内存篇】——ExoPlayer 释放后内存没有恢复问题探索

最近笔者承接项目的内存优化指标,在内存调研的过程中发现项目中视频播放结束后,内存没有恢复到播放前到水平。项目中用的 EXO 版本为2.19.1,并且笔者自己也写了个简单的 Demo,发现也是如此。虽然有一些偏门方法可以优化,但是暂时还是未能正面突破,各位看官,如果有什么idea,欢迎留言多多指教~

2024-02-23 19:30:49 1425 2

原创 Android 基础技术——Framework

第一个原因,我们可以设想一下采用binder调用的话该怎么做,首先zygote要启用binder机制,需要打开binder驱动,获得一个描述符,再通过mmap进行内存映射,还要注册binder线程,这还不够,还要创建一个binder对象注册到serviceManager,另外。好处:应用在启动的时候需要做很多准备工作,包括启动虚拟机,加载各类系统资源等等,这些都是非常耗时的,如果能在zygote里就给这些必要的初始化工作做好,子进程在fork的时候就能直接共享,那么这样的话效率就会非常高。

2024-02-20 18:35:40 1002

原创 【Android 性能优化:内存篇】——优化 GPU 内存的神秘方法

笔者最近承接项目的内存优化工作,在预研的过程中发现一篇关于内存优化的文章里面介绍了一个方法但是应用层无法直接访问 WindowManagerGlobal,因此笔者采取反射来验证这个方案的可行性。

2024-02-18 21:12:51 424 2

原创 Android 基础技术——HashMap

你说说我们引入红黑树就是为了查找数据快,如果链表长度很短的话,根本不需要引入红黑树的,你引入之后还要付出代价维持它的平衡。而如果数组的长度n是2的x幂,当容量大小 n 为2的x次方时,n -1 的二进制的后几位全是1,在h为随机数的情况下,与n-1进行与操作时,会分布的更均匀。2)同时在扩容时,每个key需要重新确定自己在数组中的index,这时如果数组每个位置的元素都变了一次,显然开销会比较大。,那么0001,1001,1101等尾数为1的位置就永远不可能被entry占用,就造成了空间浪费。

2024-02-18 19:48:32 364

原创 Android 基础技术——Volatile 关键字

volatile变量通过这样的机制就使得每个线程都能获得该变量的最新值,即满足数据的“可见性”在生成汇编代码时会在volatile修饰的共享变量。进行写操作的时候会多出Lock前缀。3)当处理器发现本地缓存失效后,就。2)一个处理器的缓存回写到内存会。会从主内存中重读该变量数据。导致其他处理器的缓存失效。,即可以获取当前最新值。作用2: 防止指令重排序。1)Lock前缀的指令。会引起处理器缓存写回主。

2024-02-18 19:45:09 359

原创 Android 基础技术——Synchonized 关键字

当执行 monitorenter时,若对象未被锁定,或者当前线程已经拥有了此对象的monitor 锁,则锁计数器+1,该线程获取该对象锁。当执行monitorexit 时,锁计数器-1,当计数器为0 时,此对象锁就被释放了。在虚拟机器执行到monitorenter指令的时候,会请求获取对象的monitor 锁,基于monitor 锁又衍生出一个锁计数器的概念。区分一个方法是否同步方法。,是指当锁是偏向锁时,被另一个线程所访问,偏向锁会升级为轻量级锁,,还没有获取到锁,就会进入阻塞状态,该锁升级为重量级锁,

2024-02-18 15:57:46 343

原创 Android MMKV 接入+ 替换原生 SP + 原生 SP 数据迁移

背景:项目中一直使用的是原生 SP,众所周知,使用原生 SP 存在卡顿性能问题。因此,替换原生 SP 迫在眉睫。本文记录如何使用腾讯开源框架 MMKV 替换原生 SP、以及替换后当中遇到的一些问题解决。

2024-02-18 15:33:46 1127

原创 Android 基础技术——Binder 机制

MMAP 原理:让一块虚拟的内存指向一块已知的物理内存如文件,返回一个文件句柄。然后我们直接操作这个文件句柄就可以实现数据的一次拷贝。

2024-02-18 14:41:05 1046

原创 Android 基础技术——列表卡顿问题如何分析解决

发生内存泄露,会导致一些不再使用到的对象没有及时释放,这些对象占用了宝贵的内存空间,很容易导致后续需要分配内存的时候,内存空间不足而出现OOM(内存溢出)。无用对象占据的内存空间越多,那么可用的空闲空间也就越少,GC就会更容易被触发,GC进行时会停止其他线程的工作,因此有可能会造成界面卡顿。,避免了卡顿现象的发生。硬件加速能够更快地完成绘制操作,并且能够更好地应对复杂布局和过度绘制等问题,提供更好的用户体验。列表滑动时绘制操作就会交由GPU来处理,减少了CPU的负担,从而提升了滑动的流畅性。

2024-01-28 10:02:47 639 1

原创 Android 基础技术——m3u8格式与mp4格式的区别

由国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组”(Moving Picture Experts Group,即MPEG)制定,第一版在1998年10月通过,第二版在1999年12月通过。m3u8准确来说是一种索引文件,使用m3u8文件实际上是通过它来解析对应的放在服务器上的视频网络地址,从而实现在线播放。,视频网站可以根据用户的网络带宽情况,自动为客户端匹配一个合适的码率文件进行播放,从而保证视频的流畅度。,mp4是封装好的h364或h365媒体文件。,是m3u的一种,只是。

2024-01-28 09:46:28 634

原创 Android 基础技术——Bitmap

要获取图片本身的大小,如果直接decodeResource加载一遍的话,那么就会增加内存了,所以官方提供了这样一个参数inJustDecodeBounds。所以一般在复用之前,还要判断下,新的Bitmap内存是不是小于可以复用的Bitmap内存,然后才能进行复用。bundle最常用于Activity间传递,也属于跨进程的一种方式,但是传递的大小有限制,,从而达到缩放图片的效果。,文件本身被放到一个共享内存中,然后获取到这个fd之后,只需要。将图片保存到文件,然后只传输文件路径,这样肯定是可以的,但是。

2024-01-28 09:43:59 1133

原创 Android 基础技术——Choreographer作用

下一个VSync到来时会执行TraversalRunnable-->doTraversal()--->performTraversals()-->绘制流程。虽然可以手动多次调用requestLayout,但是在一个vsync周期内,requestLayout只会执行一次。,保证绘制拥有完整的16.6ms,避免绘制的随机性。,当下一次vsync信号过来时,系统服务SurfaceFlinger在第一时间通知我们,应用层绘制可能随时发起,应用程序调用requestLayout发起重绘,请求同步vsync信号。

2024-01-27 10:26:36 450

原创 Android 基础技术——Handler

我们向主线程发送了一个UI绘制操作Message,而此时消息队列中的消息非常多,那么这个Message的处理可能会得到延迟,绘制不及时造成界面卡顿。同步屏障的删除:ViewRootImpl unScheduleTraversals---->removeSyncBarrier 删除屏障的节点。先判断 如果msg.target==null 轮询消息队列,直到找到一个异步消息为止,执行这个异步消息。刷新UI 使用了同步屏障就是为了保证及时执行消息,如果保证不了16ms 刷新一次, 会导致掉帧。

2024-01-27 10:21:33 1158

原创 Android 基础技术——RecyclerView

当mCachedViews满了以后,会利用先进先出原则,把旧的ViewHolder存放到RecycledViewPool中后移除掉,腾出空间,再将新的ViewHolder添加到mCachedViews中,最后剩下的ViewHolder都会缓存到终极回收池RecycledViewPool中,它是根据itemType来缓存不同类型的ArrayList<ViewHolder>,最大容量为5。二是:在滑动的时候,重复利用原来的ViewHolder,尽可能减少重复创建ViewHolder和绑定数据的工作。

2024-01-27 09:34:16 1378

原创 Android 基础技术——View 的宽高

当View树状态发生改变,或者View树内部的view的可见性发生改变时,onGlobalLayout会被回调,所以这也是获取宽高的一个很好的时机。利用 Handler 通信机制,通过post将添加一个 Runnable到message queue的队尾,当View初始化完成之后,Looper会调用此runnable,然后通知UI线程。因此可在第一次调用完后,移除监听事件。,也就是view完成layout之后,这个时候能第一时间获取宽高,MessageQueue里的消息处理的则是下一次loop到来的时候。

2024-01-21 17:48:14 936

原创 Android 基础技术——addView 流程

设置DectorView的Parent为 ViewRootImpl 后续 view.requestLayout 都会触发 ViewRootImpl.requestLayout() 这里回答了DectorView是什么时候添加到Window的。ViewRootImpl 是 DecorView 的 parent,但是他并不是一个真正的 View,只是继承了 ViewParent 接口,用来掌管 View 的各种事件。Window:每个Activity都会创建一个Window用于承载View视图的显示,

2024-01-21 14:13:08 1250

原创 Glide 源码解析与原理总结——Glide.with

Glide.with 原理:Glide 初始化并且生成RequestManager,RequestManager 与 空白Fragment 的 lifecycle 生命周期绑定来管理后续的请求。

2023-11-05 14:26:44 409 1

原创 java.lang.RuntimeException: Unable to get provider com.baidu.mobads.sdk.api.BdFileProvider

最近公司项目里需要接入穿山甲聚合SDK来实现变现,按照接入文档接入后,启动 APP 发生崩溃问题找不到 Provider,以前笔者在使用其他聚合 SDK 时候也遇到过,折腾了不少时间,特意记录下。

2023-11-04 23:41:29 875

原创 【Android 性能优化:内存篇】——WebView 内存泄露治理

本文列举了项目中治理 WebView 内存泄露的手段:1)Fragment、Activity 销毁时释放WebView。2)释放WebView 需要释放完全,WebView 注册的各种监听器都需要释放。3)同时要考虑Fragment、Activity 有没用到匿名内部类,如果有要改成静态内部类,并且要静态内部类有使用Fragment、Activity的话要使用弱引用。

2023-10-15 14:10:13 1963

原创 Android new WebView Fatal Exception: android.content.res.Resources$NotFoundException

项目中采用了 new WebView 的方案初始化,再添加到 WebViewContainer,上线后,5.0系统 报了个崩溃问题 Fatal Exception: android.content.res.Resources$NotFoundException

2023-09-26 12:02:59 135

原创 Android google admob Timeout for show call succeed 问题解决

在 App 的 AndroidManifest 里重新声明 Admob 的广告 Activity,增加支持多进程属性 android:multiprocess = "true"后来对比了下 官网 Demo 和自己项目的差异,不同点在于我项目是在子进程加载和显示广告的,但是搜索 Admob sdk 技术文档,里面并没有接口是设置支持多进程的。问题困扰很久, 使用官网 Demo 可以正常显示结果的,网络上搜索不到相关问题。尝试去掉子进程后,果然不再报错,基本可以确定这个就是和多进程有关。

2023-08-07 00:20:52 870

原创 this version of the Java Runtime only recognizes class file versions up to 52.0 问题解决

java.lang.UnsupportedClassVersionError: com/xxx/xxx has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 问题解决。

2023-03-12 10:47:04 478 1

原创 Non-fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library “libmmkv.so“ not found

Non-fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library "libmmkv.so" not found 问题解决

2022-10-10 19:15:18 5337 2

原创 2 files found with path ‘META-INF/lib_release.kotlin_module’

记录项目开发中遇到的一个问题,防止后续再踩雷:自己封装了一个功能库,库名字叫lib,满心欢喜接入到app 工程。编译打包时却报错:2 files found with path 'META-INF/lib_release.kotlin_module'。

2022-08-13 17:01:08 3308

原创 Android 接入微信性能监控框架Matrix实践

本文主要是记录笔者接入微信性能监控框架Matrix的过程,以及简单阐述如何分析Matrix输出的监控数据。

2022-07-24 20:11:33 3543

原创 Runnable是否可以中断

如何终止子线程的Runnable

2022-07-03 16:21:56 882

原创 Android 短时间内多次启动同一个Service会不会有多次的binder调用

Android 短时间内多次启动同一个Service会不会有多次的binder调用

2022-06-18 12:59:31 2210

原创 mac sublime配置命令行启动

记录mac下sublime配置快捷方式启动命令行的过程。

2022-06-10 13:07:37 2816 2

原创 Retrofit原理学习总结

Android 面试中经常被问到Retrofit的原理是什么。面试官这样问,如何回答呢?本文意在用总结的方式+流程图来描述Retrofit源码。1. 总结Retrofit是什么:Retrofit 是一个RESTful的HTTP网络请求框架的封装开源库,网络请求的工作是Okhttp完成的,Retrofit本身是对网络请求接口的封装。2. 结合Retrofit的使用谈原理2.1 创建Retrofit的实例2.2 创建网络请求接口实例2.3 执行网络请求...

2022-04-17 15:42:33 2237

原创 Android LayoutInflater.inflate耗时解决方法

最近项目中收到公司APM反馈的一个ANR问题,具体堆栈指向LayoutInflater.inflate。这句原生调用怎么会发生ANR呢?于是使用Android Studio的 Layout Inspector工具查看了下View层次,发现View层次过多,并且有复杂的自定义View,这个应该就是耗时的主因。针对复杂的布局,我们通常的布局优化手段:简化布局的层级;include和merge结合使用;ViewStub 按需加载;减少使用wrap_content,最好使用固定宽高或者match_par

2022-04-05 16:47:59 4524

原创 Android架构——LifeCycle和LiveData原理学习总结

本文是楼主学习LifeCycle和LiveData原理的一些总结,本文不会长篇分析源码,而是利用类图和总结性的文字归纳原理。由于Livedata和LifeCycle有紧密联系,所以本文先总结LifeCycle原理,再总结LifeData原理。本文LifeCycle基于版本androidx.lifecycle:lifecycle-runtime:2.1.0, LiveData基于版本androidx.lifecycle:lifecycle-livedata-core:2.0.0本文内容结构一、简单

2022-02-20 16:22:47 4302

Android 自定义AlertDialog 控制系统媒体音量

最近项目里有个功能点,需要使用定制seekbar调节媒体音量,不能使用【按物理音量上下键】弹出的系统dialog做音量调节。我需要继承AlertDialog,设置自己的内容view,重写onKeyDown方法,设置dialog的位置等...... 写了个demo

2019-04-06

Android 自定义AlertDialog 的内容view控制系统媒体音量

最近项目里有个功能点,需要使用定制seekbar调节媒体音量,不能使用【按物理音量上下键】弹出的系统dialog做音量调节。我需要继承AlertDialog,设置自己的内容view,重写onKeyDown方法,设置dialog的位置等...... 写了个demo. Demo是在5.0手机上测试的, 6.0以上系统还需要添加动态运行时权限的逻辑 。

2019-04-05

Mvvm: ViewModel+LiveData+DataBinding+Retrofit+Room总结与实践demo

Mvvm: ViewModel+LiveData+DataBinding+Retrofit+Room实践

2019-03-21

机器学习1-2章习题答案

1-2章机器学习习题答案,1-2章很全面

2013-03-24

网络白板源代码

具有中心服务器,使用TCP/IP协议通信的网络白板源代码

2013-03-23

JMF需要的JAR包 完整版

完整的JAR包,用于JMF开发,添加到工程中即可使用。 包括音频视频捕捉等

2012-10-28

SOA设计模式PDF

SOA设计模式PDF英文版本,介绍了83种基于服务架构的设计模式;

2012-10-28

空空如也

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

TA关注的人

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