自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 实用博客||工具||网页收藏导航(持续更新)

博客AndroidHensen_的博客目录(全站式导航) Android学习知识大全、面试复习必备工具视频处理Gif在线处理工具 支持视频转Gif、Gif压缩、Gif裁剪、Gif合成...

2018-12-26 16:04:13 472

原创 Android 错把setLayerType当成硬件加速

采用什么来绘制 View 不是关键,关键在于当设置了 View Layer 的时候,它的绘制会被缓存下来,而且缓存的是最终的绘制结果,而不是像硬件加速那样只是把 GPU 的操作保存下来再交给 GPU 去计算。通过这样更进一步的缓存方式,View 的重绘效率进一步提高了:只要绘制的内容没有变,那么不论是 CPU 绘制还是 GPU 绘制,它们都不用重新计算,而只要只用之前缓存的绘制结果就可以了。setLayerType() 这个方法,它的作用其实就是名字里的意思:设置 View Layer 的类型。

2022-11-11 21:33:34 1829 1

原创 Android CoordinatorLayout嵌套横向ViewPager2导致嵌套滑动失效问题

当CoordinatorLayout嵌套横向ViewPager2时,在ViewPager2上点住上下滑动会失效。ViewPager2使用RecyclerView实现,RecyclerView吃掉了nested的一系列方法,导致无法回传至CoordinatorLayout,导致behavior失效,最终无法滑动对CoordinatorLayout内部嵌套的 一切、一切、一切 横向ViewPager2使用下面这个方法即可,禁止它的nested拦截...

2022-07-09 08:32:01 2107

原创 Android_NDK JNI实现Android Parcel(D9)

Android_NDK JNI实现Android ParcelParcel 原理通过C结构体存储对象,返回结构体首地址(long类型)java层获取long之后申请从native层按照顺序写入数据把long值传递给另外的地方通过long值拿到native层的对象通过顺序读取顺序Parcel 思路实现// 结构体和对象 Parcel.cppclass Parcel{ char* mData;// char 1 共享内存的首地址 int mDataPos = 0; // =

2022-04-13 00:30:38 520 1

原创 【线上bug】使用viewModelScope导致网络请求中断

问题现象网络请求发出去了,没有返回。使用Charles抓包,返回是一个红X。问题解决viewModelScope生命周期中断导致网络请求http断开,原因是使用了DialogFragment的viewmodel,网络请求之后就把弹窗取消了,导致生命周期中断了协程。改用GlobalScope解决。...

2022-04-11 16:48:35 458

原创 Android_NDK JNI Native层构建java对象(D8)

Android_NDK JNI Native层构建java对象常量指针和指针常量//常量指针 100也就是常量不能改变int num1 = 100;const int *p = &num1;//指针常量 p1指向的&num2也就是地址不能改变int num2 = 200;int * const p1 = &num2;Native层构建java对象JNIEXPORT jobject JNICALL Java_com_sweet_lib_1network_1sig

2022-04-10 22:53:07 2320

原创 Android_NDK JNI实现原理和简单实现(D7)

Android_NDK JNI实现原理和简单实现JNI开发一般流程定义本地native方法生成.h头文件添加.h的工程目录依赖添加实现头文件中的native方法load动态库定义java native方法kotlinexternal fun signatureParams(params: String): Stringinit { System.loadLibrary("lib_network_sign") }System.load 加载一个具体路径

2022-04-10 00:43:59 264

原创 Android 多进程知识点总结

本文引用和复制资料来源如下https://juejin.cn/post/6844903657511583752开启多进程的方法Android 中使用多进程只有一种方法,那就是给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidMenifest中指定android:process属性<service android:name="com.xxq2dream.service.BookManagerService" and.

2022-04-08 20:28:19 154

原创 Android_NDK C文件操作(D6)

Android_NDK C文件操作读取文本文件void main(){ //打开文件 (文件名,模式[r,w,,rb,wb(二进制读写)]) char * filename = "C:\\a.text"; FILE * file = fopen(filename,"r"); if(file){ char buffer[10]; while(fgets(buffer,10,file)){ printf("%s",bu

2022-04-07 23:44:41 1791

原创 Android_NDK C结构体和枚举(D5)

Android_NDK C结构体和枚举结构体定义和使用struct Worker{ char name[10]; int age; double salary;};//不初始化,有默认值struct Worker1{ char name[10]; int age; double salary;}jack = {"jack",18,200},darry;struct Name{ char fisrtName[10]; char

2022-04-06 23:25:53 1799

原创 Android 点九(.9)图自动aapt脚本

点九(.9)图自动aapt脚本shell代码#! /bin/bash# dirname $0,取得当前执行的脚本文件的父目录basepath=$(cd `dirname $0`; pwd)# 打印当前路径echo "当前文件夹路径: $basepath"in="/in"out="/out"aapt="/aapt"outFore="out_"fanxiegang="/"tools="/tools"inpath="$basepath$in"outpath="$basepath

2022-04-06 11:57:53 1402

原创 Android_NDK C字符串基本操作(D4)

Android_NDK C字符串基本操作字符串长度void main(){ char arr[] = {'a','a','a','a','a','\0'}; printf("%s",arr);}字符串结尾是\0,也就是字符串长度数据要比数组长度少1。void main(){ char *str = "aaaaaa"; printf("%s",str);}和上面的区别就是下面的不能修改。void main(){ char *str = "aaaaaa

2022-04-04 23:38:14 1017

原创 Android_NDK C内存开辟(D3)

Android_NDK C内存开辟内存开辟栈:占用内存空间大约2M,静态内存开辟,方法结束自动回收,栈虚拟机(jvm也是栈虚拟机,安卓虚拟机是寄存器虚拟机)堆:占用内存空间最大值的80%,动态内存开辟,必须手动回收内存void main(){ int arr[5];//静态开辟 //动态开辟 int* arr = (int*)malloc(10*1024*1024*sizeof(int)) //动态释放 free(arr) //arr[i] = *(

2022-04-03 23:56:14 403

原创 Android_NDK C指针运算和函数指针(D2)

Android_NDK C指针运算和函数指针二级指针和多级指针对地址再取地址int a = 12;int* p = &a;int** dp = &p;int* op = *dp;int* op2 = dp[0] ;dp的值是p的地址,p的值是a的值。如果想知道dp的地址,就需要3级指针指向dp的地址即可。如果想要最终的值,就用多级n个*进行取值即可。最后两个op的写法其实是一样的。看别人代码的时候可以灵活思维。数组和数组指针int arr[] = {1,2,3,4}

2022-04-02 23:54:11 578

原创 Android_NDK C基本类型和指针(D1)

Android_NDK C基本类型和指针推荐一个C++ VSCODE环境配置的博文 VSCODE C++环境配置基本数据类型short int long double float char变量地址&a : 取变量a的地址sizeof() : 获取数据类型占内存字节数*(&a) : 获取地址a对应的值int * : 代表int类型的指针(别的类推)*p : 可以通过指针取值再修改值通过指针相当于java传递引用写个方法对两个值进行交换指针修改开辟新空间void ch

2022-04-01 23:27:37 1714

原创 Android (2022 xml版)LinearLayout添加间隔(Divider)的正确姿势

最优解我们直接看最优解divider_line.xml<?xml version="1.0" encoding="utf-8"?><inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetLeft="16dp" android:insetTop="4dp" android:insetRight="16dp" android:insetBottom="4

2022-03-31 20:49:32 1072

原创 Android Glide源码分析两张图

经典两张图缓存策略使用流程原文地址文章1文章2原文作者解析的非常清晰,图引用原作者,轮子不重复造。结束!

2022-03-31 19:51:24 147

原创 【性能优化】Android Glide配置图片加载格式防止OOM

优化点根据不同机型的数据给机型进行打分,之后根据不同的分数通过Glide统一设置图片加载格式。可参考的数据有:Android 系统version code分辨率内存大小近期oom等优化代码@GlideModulepublic class MyAppGlideModule extends AppGlideModule { @Override public void applyOptions(@NonNull Context context, @NonNull Glide

2022-03-31 19:45:22 1198

原创 Android 用Flow封装一个FlowBus

用途用安卓jetpack提供的flow封装一个事件总线。支持黏性非粘性等一系列事件。对比RxBus:不用引入RxJava库,安卓端即可LiveData:LiveData不知道谁发明的封装事件总线,反射源码不说,LiveData就不是用来干这事的。Flow:代码简洁,Android封装代码(给个赞,不要伸手党)import androidx.lifecycle.LifecycleOwnerimport androidx.lifecycle.Observerimport androidx.li

2022-03-31 17:41:30 1953 1

原创 Android 硬件加速对照表(记录)

硬件加速硬件加速指的是使用 GPU 来完成绘制的计算工作,代替 CPU。它从工作分摊和绘制机制优化这两个角度提升了绘制的速度。硬件加速可以使用 setLayerType() 来关闭硬件加速,但这个方法其实是用来设置 View Layer 的:参数为 LAYER_TYPE_SOFTWARE 时,使用软件来绘制 View Layer,绘制到一个 Bitmap,并顺便关闭硬件加速;参数为 LAYER_TYPE_HARDWARE 时,使用 GPU 来绘制 View Layer,绘制到一个 OpenGL te

2022-03-31 17:35:21 178

原创 【线上bug】Arouter导致的跳转白屏

问题现象使用Arouter跳转时,finish当前页面。跳转到目标页面会出现白屏问题。问题解决https://github.com/alibaba/ARouter/issues/396参照官方解决方案,轮子不多造,记录。

2022-03-28 20:01:26 344

原创 【线上bug】Only fullscreen opaque activities can request orientation

bug原因因为SplashActivity跳转MainActivity时会出现白屏问题,为了解决白屏把MainActivity设置成了透明。结果就显而易见了,在8.0机型上奔溃了。解决方案连接如下,轮子就不重新造了https://blog.csdn.net/LoveDou0816/article/details/79129324...

2022-03-28 11:03:20 331

原创 ADB环境变量 配置bash_profile每次都要执行source .bash_profile

问题如题解决方案vim .zshrc## 编辑此文件添加source .bash_profile:wqsource .zshrc

2022-03-07 16:00:56 302

原创 Android ConstraintLayout你不知道的好用功能

本文只说功能,用法自行搜索()里面为陌生度,100为很陌生 0为这都不知?1. 角度约束(90)一个控件在某个控件的某个角度的位置app:layout_constraintCircle="" 目标控件id app:layout_constraintCircleAngle="" 对于目标的角度(0-360) app:layout_constraintCircleRadius="" 到目标中心的距离2. 百分比偏移(30)让控件在父布局的水平方向或垂直方向的百分之多.

2021-12-30 10:24:35 719

原创 Android 布局既wrap_content又match_parent实现

期望效果布局时,我们希望达到内容不多时wrap_content,内容多时match_parent的效果。如果只用wrap_content,是限制不住子布局的。这时就需要特殊处理。解决方案1.postValue在父布局中实现一个invisible的view,让他宽高0dp然后布满布局。使用的时候,如果我们targetView宽高大于不可见的,就设置targetView的宽高为不可见view的宽高即可。2.constrainedWidth/constrainedHeight利用ConstraintL

2021-12-28 15:46:36 1749

原创 Android MutableContextWrapper、IdelHandler实践之预加载View工具类

MutableContextWrapperMutableContextWrapper是Context家族中一员。其显著特点是可以动态替换baseContext来达到预加载需要Context创建的资源。预加载工具类不多解释了,里面运用了IdelHandler和MutableContextWrapper,在资源不紧张时返回预加载View。object PreViewHelper { private val viewMap = ConcurrentHashMap<Class<*>

2021-12-23 11:15:23 2935

原创 Android Dialog隐藏消失时软键盘无法收回问题解决

原因Dialog 的 OnDismissListener 回调时View可能已经回收,导致无法根据View收起软键盘。解决重写dismiss方法,强制收起软键盘即可override fun dismiss() { val view = currentFocus if (view is TextView) { val mInputMethodManager = context.getSystemService(Co

2021-12-23 10:48:10 2174

原创 Android 内存相关知识点记录

原文地址:https://juejin.cn/post/6844904099998089230Android 内存分配模型在Android系统中,堆实际上就是一块匿名共享内存。Android虚拟机仅仅只是把它封装成一个 mSpace,由底层C库来管理,并且仍然使用libc提供的函数malloc和free来分配和释放内存。大多数静态数据会被映射到一个共享的进程中。常见的静态数据包括Dalvik Code、app resources、so文件等等。在大多数情况下,Android通过显示分配共享内存区.

2021-12-15 14:46:38 1262

原创 Android 解决TextView使用shader无故有透明度

现象使用paint.shader实现渐变文字时,发现文字有透明度,开始代码里明明没有设置。paint画笔的透明度也是255正常。解决方案如果没有给TextView设置默认的颜色,会有一个有透明度的颜色在字体上。我们给TextView设置一个没有透明度的颜色就行了。简单的问题,排查半天。...

2021-12-14 17:37:31 1552

原创 Android 稳定性(二) ANR和容灾知识点记录

原文地址:https://juejin.cn/post/6844903972587716621#heading-56ANR优化和容灾建设1.使用FileObserver监听 /data/anr/traces.txt的变化缺点:高版本ROM需要root权限。解决方案:海外Google Play服务、国内Hardcoder。2.监控消息队列通过给主线程的Looper设置一个Printer,打点统计dispatchMessage方法执行的时间,如果超出阀值,表示发生卡顿,则dump出各种信息无法准.

2021-12-10 10:56:39 1720

原创 Android 稳定性(一) Crash知识点记录

原文地址:https://juejin.cn/post/6844903972587716621#heading-56稳定性维度:Crash率,性能,业务可用性重预防,稳监控UV、PV采集、处理(清洗、聚合、分类、趋势)、展示(数据还原、维度、版本分析)、预警Crash优化治理根据堆栈及现场信息分析原因找共性:机型、OS、实验开关、资源包,考虑影响范围线下复现、远程调试Crash解决三步走常规直接解、系统及Hook绕、疑难重点突破常用代码出现未捕获异常,导致出现异常退出,进程唯一.

2021-12-08 20:15:17 1364

原创 Android ANR终极解决 android.app.RemoteServiceException: Context.startForegroundService()

问题现象android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()通过startForegroundService(Intent intent)启动服务时,如果服务没有及时(5s)使用startForeground()响应,那么就会报这个异常。问题原因和解决1. Service startForeground之前的代码过于复杂在Se

2021-12-08 14:02:28 5411

原创 Android ABC 解决传感器抖动(帕金森)方案

问题在哪?在使用移动设备传感器时,会出现数据抖动现象(帕金森),传感器数据会在极小的范围内来回抖动,导致业务展示出现帕金森现象。最常见的就是手机姿态传感器,xyz的值一直在变化。为了让数据的变化平滑,我们必须对数据进行清洗和处理,再使用。解决方案1.窗口平均我们可以取一个窗口,一般为4或者6,然后我们对这个窗口里的值进行取平均,然后得出输出值,然后再使用。代码就不附了,这个思路非常简单。优点:使用简单,可以更换窗口的大小来调优缺点:趋势性被大幅降低,转折点钝化2.N阶低通滤波器其实这个也

2021-12-08 11:51:41 1320

原创 Android ABC 网络加载NinePatch(.9)图方案及实现

网络加载NinePatch图本地制作和使用ninePatch图不多赘述了,网上教程一大堆。下面给出网络使用ninePatch图的方案方案1.PNG转NinePatch通过Android Studio自带的Create 9-Patch file制作NinePatch图2.NinePatch预编译使用Android sdk build-tools目录下的aapt对制作出来的NinePatch图进行转化,命令如下aapt s -i /xxx/xxx/FirstStep.9.png -o /xxx/x

2021-12-07 17:37:52 1386

原创 Android ABC 基于字节跳动的SP ANR优化方案实现

原理字节跳动SP优化方案方案根据字节跳动的文章和Android源码分析可知,SP的apply方法会将每一次的apply做成一个任务去执行,然后添加到Activity的sPendingWorkFinishers去执行。分析Android11的源码可知,apply()方法之后,代码就开始执行了。如果我们等待片刻,onStop的时候就会发现,finish队列已经空了,并不会引起ANR。什么时候会引起ANR?当apply加入后的finish队列还没执行完我们就退出时才会ANR或者卡顿,根本问题就是主线程

2021-12-04 17:42:24 1155

原创 Android recyclerview notify闪烁问题修复

使用notify刷新全部不会闪,但是notify刷新一条会闪,问题修复

2021-10-22 19:51:43 1025

原创 Android 冷启动系统优化(附实践思路)

思路分析前言冷启动涉及的因素很多,从流程上说,分为以下几个阶段点击Launcher的图标,AMS处理intent,与Zygote socket交互fork进程,新进程运行ActivityThread代码,AMS和ApplicationThread互相绑定,AMS发binder信息反射启动Application。以上是第一阶段,这个阶段到Application的attchbasecontext方法之前,我们基本上都无法参与,但ContentProvider的初始化是在Application之前的,它的

2021-10-09 11:04:09 495

原创 Android 文件选择获取路径(亲测并踩坑)

权限配置open failed: EACCES (Permission denied)必须按照下面的方式配置否则报错,下面是解决方法首先需要检查是否添加读写权限。<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />然后再确认

2021-09-26 17:36:36 5268 1

原创 Android反编译工具介绍,一定看到最后!!!

解压app将apk后缀改为zip,然后就可以得到manifest文件和dex文件,如果是乱码的继续往下看dex2jar官网github:https://github.com/pxb1988/dex2jar主要功能就是把刚刚解压的dex文件转化为jarJD-JUI官网github:http://java-decompiler.github.io/用来查看jar文件,已经转化成java文件,转化不成功的部分会显示bytecode,可以根据需求进行人工读写appTool官网github:http

2021-09-14 18:13:07 219

原创 Google浏览器禁用JavaScript

效果Google浏览器破解网页无法复制/无法转载/不登录无法复制原理网页端的无法复制都是通过JS代码限制来实现的。So,想破解非常容易,只要禁用JS就可以了。操作如下步骤1、打开Google浏览器设置2、打开隐私设置和安全性(或者关于隐私的类目)3、选择网站设置4、选择JavaScript(也就是JS)5、在禁止中添加你要破解的网站例如:[*.]baidu.com6、刷新后就可以复制了,大功告成其他浏览器参考以上,对JS进行禁用即可...

2021-01-23 11:23:10 1097

AccessibilityService学习Demo

通过分析Auto.js来学习AccessibilityService,当然了这里的思路并不一定是Auto.js作者的,但是我们能实现相关方法了解AccessibilityService就可以了。

2018-12-04

空空如也

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

TA关注的人

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