- 博客(91)
- 资源 (3)
- 收藏
- 关注
原创 Android中使用Glide加载图片闪烁问题
原因在于Glide会将我们传入的ImageView包装成ImageViewTarget对象,当Glide为Imageview重新加载新图片前会先调用com.bumptech.glide.request.SingleRequest的clear()方法,当使用Glide如上面的方式加载图片时,尤其是当图片资源比较大时,在更新图片资源(即将图a换成图b)时可能会出现ImageView短暂显示为透明状态,给人以闪烁的感觉,很不友好。这里会调用ImageViewTarget的onLoadCleared()方法,
2025-03-10 16:15:08
368
原创 解决微信支付在finish WXPayEntryActivity的时候会闪一下
关键就在于,在收到onResp()回调后进行适当的延时后再做页面跳转的动作,即等回调onResp()的函数执行完成后再做页面跳转,否则可能会引起微信支付页面的重绘,导致闪烁的问题。
2024-11-28 12:42:14
203
原创 kotlin 委托
CreateDB类需要实现的接口(DB)方法委托给了具体实现类(MySql、OracleDB、SqliteDB)来实现,我认为这和设计模式中的策略模式如出一辙。Tools -> kotlin -> show kotlin Bytecode ,然后点Decompile,将字节码进行反编译得到java代码。让我们稍感惊讶的是,经过转换后甚至都没有定义num这个属性,只是增加了getNum和setNum两个方法来获取和改变floatValue的值。通过委托封装Mmkv存取值的过程。上,因此会有上面的运行结果。
2024-10-02 15:58:15
1094
1
原创 jenkins拉取gitlab代码失败
依次打开:配置->Additional Behaviours->高级的克隆行为。看报错信息是git代码拉取超时了,所以在jenkins任务中增加超时时间。
2024-05-31 15:09:39
630
原创 windows与wsl互传文件
1.把windows上的文件传到wsl中,\\wsl.localhost\Ubuntu-22.04\mnt\wsl。将wsl中的文件放到 /mnt/c 或 /mnt/d 中,这两个路径代表着windows系统的c盘和d盘。将你要传的文件放到wsl这个路径下,Ubuntu-22.04是我的子系统,换成自己对应的。2.把wsl中的文件传到windows中。
2023-11-16 16:19:02
3671
原创 Android NDK 开发学习笔记(一) --jni
创建好工程后,会默认生成一个jni接口文件,一般命名为:main/cpp/native-lib.cpp。jfieldID fielD:通过GetStaticFieldID()获取到的。jfieldID fielD:通过GetStaticFieldID()获取到的。但如果我记不住或不确定该怎么办呢?const char* sig) //属性的签名。const char* sig) //属性的签名。const char* sig) //方法签名。const char* sig) //方法签名。
2023-08-09 10:21:53
573
原创 docker实践
2.Docker 容器与宿主服务器文件复制。3.docker run 选项设置。4.docker 内存占用情况查看。5.docker 清理cache。
2023-05-22 16:14:11
146
原创 Activity四种启动模式分析
而提到这四种启动方式的差异,必然要提到一个重要的概念Activity的Task任务栈,我们需要明确的一点是Activity从静态上来看它属于某一个Application,但Task并不对应某一个Application,Task是系统层级的调度结构,即一个Task中可以有多个Application的Activity,或一个Application中的不同Activity会存在于多个Task中。四种启动模式的差异主要在于创建新的Activity实例时不同的复用逻辑。二、四种启动模式差异。
2023-05-06 16:28:06
904
原创 The minCompileSdk (32) specified in adependency‘s AAR metadata (META-INF/com/android/build/gradle...
导致的问题,所以降低material的版本直到符合编译检查。报错背景:升级了androidstudio跑老项目...同理,可以按照此方法逐个排查此类问题。
2023-04-26 19:55:52
2503
原创 Android性能优化--ANR问题
注:input的超时机制与其他的不同,对于input来说即便某次事件超过限时,只要用户后续没有后续输入,则不会产生ANR问题。后台service:onCreate(),onStart(),onBind()等生命周期方法在200s内没处理完导致ANR。前台service:onCreate(),onStart(),onBind()等生命周期方法在20s内没处理完导致ANR。1.集成bugly,可以拿到手机品牌,型号,配置,以及anr的大概位置。前台广播:onReceiver在10s内没处理完导致ANR。
2023-04-21 16:05:06
906
原创 Android系统启动流程--system_server进程的启动流程
上一篇的结尾提到zygote进程中会fock出一个system_server进程,用于启动和管理Android系统中大部分的系统服务,本篇就来分析system_server进程是如何创建并运行的以及它都做了哪些重要的工作。到此,zygote进程fork出了systemserver进程,android系统启动流程也从zygote阶段过渡到了systemserver阶段,下面我们就可以看看在systemserver进程中主要都做了哪些事儿。到这里对SystemServer进程的分析就结束了。
2023-04-17 16:08:51
632
原创 Android系统启动流程--zygote进程的启动流程
这里放一张图用于表示进程与虚拟机的关系,即每个进程都有独立的虚拟机,而虚拟机就是一块大的内存区域,这块大内存又划分为堆、线程栈、方法区、程序计数器、本地方法栈等等更小的内存块。和上一篇中的init一样,zygote进程也具化到了设备中的执行程序,即app_process,我们来看下他是由那个文件编译出来的。至于怎么去找这么文件的路径目前没有发现太好的办法,只能是多熟悉每一层的bp编译脚本+关键字搜索。
2023-04-13 17:27:11
941
原创 Android系统启动流程--init进程的启动流程
"/bin/init"是在Android系统源码编译时编译出的一个可执行程序,路径为Android设备上的"system/bin/init",而这个init程序则是由system/core/init/main.cpp文件编译生成的(可查看同目录下的Android.bp,其中描述了编译规则),所以执行这个init程序其实就是运行到了main.cpp的main()方法。②init(pid=1)进程,它是用户空间的第一个进程,由此开始后面创建的进程都是由init或其子进程fork而来。基于Android11。
2023-04-13 10:15:17
2082
1
原创 Android IPC Binder机制学习(一)
在使用demo中也能看到AIDL文件在客户端和服务端中都要用到(且内容相同),但在客户端与服务端中使用的部分是不一样的,Proxy是给客户端使用的,Stub是服务端使用的,或者说Stub是服务端所持有的。答:有两点1是拷贝到内核会对uid和pid等进行身份检测,权限安全,2是有一次拷贝,这就是个单向操作,server端哪怕修改了内存映射中的数据,也不会影响到client端中的数据,保证数据安全。客户度想要请求系统服务时,要向serviceManager中传对应的系统服务名来获取对应的系统服务Binder。
2023-04-04 16:59:00
700
原创 Android系统启动流程 -- ServiceManager进程的启动流程
当执行到 start servicemanager 这条命令,就会运行android设备(比如手机)中 /system/bin/servicemanager这个可执行文件,而这个可执行程序就是servicemanager进程,他由 frameworks\native\cmds\servicemanager\main.cpp 文件编译生成的。1.ServiceManager是一个独立的进程,由init进程创建,且在创建zygote进程之前被创建。*注:基于Android11源码。
2023-03-30 20:08:48
1283
原创 Handler源码分析之Message类型
队头是同步消息时,就是正常取出,比如将m1取出了,m2就成了队头,就这样取当取到m3时发现这个msg.target=null,就知道m3是一个屏障消息,取到它代表后面跟着一个急需处理的异步消息(UI刷新消息),那么就会一直往后找直到遍历到m5时发现它是异步消息,那就赶紧把m5先取出并分发它去执行UI刷新的逻辑(这里对应MessageQueue的next()方法中的逻辑),还记得上面mTraversalRunnable吗?所以,当分发了异步消息后,在取下一个消息前,这个屏障消息就被移除了。
2023-03-22 17:42:19
582
原创 Handler源码分析之epoll机制
而阻塞是一个和 I/O 相关的概念,这涉及一个操作系统级的操作epoll_wait,当读取磁盘文件时会有内存速度不匹配的问题,中间需要有个缓存过程,是从磁盘读到缓存,缓存满了,再从缓存中读数据,等待缓存满的时候就需要阻塞住先不读取。举个例子,假设你要收个快递,但你不知道快递小哥什么时候送,你又没有其他事可做,那么你可以去睡觉了(释放cpu资源),因为你知道快递小哥到了会打电话通知你,这个睡觉的状态就是。epoll可以过滤出可以进行读写的流,而不用我们再去轮询了,此时我们对所有流的处理都是有意义的。
2023-03-22 11:05:17
593
原创 HandlerThread源码分析
它是一个封装了Looper(Handler)机制的Thread。你可以将一些需要串行执行的子任务(耗时任务)交给它去做。*注:阅读本文需要具备基本的Handler基础。HandlerThread是什么?它的应用场景是什么?
2023-03-20 16:19:24
110
原创 Android Studio Electric Eel:Could not resolve com.android.tools.build:gradle:7.4.1
Could not resolve com.android.tools.build:gradle:7.4.1
2023-02-21 17:12:56
355
原创 Camera2:获取Depth16深度图并进行可视化转换
到此,我们根据官方文档提供的方法可以得到每个像素点的深度值和置信度值,但遗憾的是这种格式的Image对象并不能像ImageFormat.JPEG格式的Image对象能直接生成Bitmap位图,而对于此种格式如何进行可视化操作,官方文档中也没有提及,可能官方也没想到会有这种需求吧。的api获取,在查看文档时捕捉到一个关键信息:即ImageFormat.DEPTH16的深度信息值为0~8191mm。,后来发现8191是2进制13位的值,也就是文档中提到的16位数据中,高3位是置信度值,低13位是深度值。
2022-12-30 16:45:22
1845
3
原创 android中MVC MVP MVVM三种架构对比
mvp架构由mvc架构发展而来,p层将业务逻辑处理从activity中抽离出来,实现了view层与model层的完全解耦,但view层和presenter层还是有耦合(p层需要持有v层的引用,来更新view)。缺点:随着业务的增加Activity会变的臃肿,因为activity中既要处理业务逻辑又要更新view,不符合单一职责设计思想,耦合度高,扩展性、可重用性差。presenter层:presenter接口,及实现类,View层与Model层的桥梁并对业务逻辑进行处理。优点:分层清晰,耦合降低。
2022-11-13 13:35:12
1148
原创 Rxjava学习(一)简单分析Rxjava调用流程
无论是看官方文档还是自己打log验证,都会得出以上一二三四五的执行步骤(步骤四会在onError()和onComplete()选其一执行)。当时我的第一感觉先不管设计合不合理,我就想知道它是怎么执行下来的?到此被观察者中发射的onNext()事件流程执行完毕,然后继续看执行四处发射了onComplete()或onError()事件。很明显能发现这是链式调用,链式调用的核心就在于每个方法都返回相同的对象,当先省略掉其中的回调细节,我们可能会看的更清晰...到此,调用到执行五,整个调用流程执行完毕。
2022-10-22 21:02:32
1272
原创 java基础-静态代理与动态代理
再说一个真实场景帮助大家理解,当我们进行Android开发时会用到网络请求框架,比如最早使用的是Volley框架,之后我想换成okhttp框架,如果之前是强关联(即在业务代码中直接引用Volley),想要做框架替换无疑是痛苦的,如果在设计之初,我们写了一个代理层则可以快速进行框架转换,哪怕将来要求替换为Retrofit也会毫不费力,代理模式可以增强我们代码的扩展性。首先需要说明的是静态代理和动态代理的思想和原理是一模一样的,只是实现代理类的方式不同。正因静态代理的缺点,由此引出动态代理。...
2022-08-16 11:25:49
2924
2
原创 java基础-注解
source使用场景:ide 语法检查,如:@IntDef。1.3、注解的保留级设置(@Retention)1.2、注解作用位置设置(@Target)1.4、保留级对应的使用场景。1.6、使用注解限定传参范围。
2022-08-10 18:08:13
209
原创 EventBus3.0源码分析(四)
这一篇我们来分析一下post()及postSticky()相关的源码,在进入post()方法之前,我们先来了解一个数据结构PostingThreadState,它也是EventBus的一个静态内部类:并且在EventBus中这个类是和ThreadLocal一起使用的,也就是说在使用中它是线程私有的。接下来打开post()方法:继续跟入方法postSingleEvent():继续跟入postSingleEventForEventType()方法:继续跟入postToSub
2022-07-06 12:02:08
198
原创 EventBus3.0源码分析(三)
这一篇我们来分析EventBus的register()方法。紧跟注释2,看他是怎么寻找Subscribe方法的:接下来进入注释1@findSubscriberMethods处的方法:这里先留个印象暂不往下分析,在上面findSubscriberMethods方法中的else分支中有一种情况也会调用到findUsingReflectionInSingleClass()方法后面一起看。ok,我们来到注释2@findSubscriberMethods处的方法:这个方法中反复提到了一个数据结
2022-07-05 12:29:39
334
原创 EventBus3.0源码分析(二)
根据上一篇的规划,本篇先分析EventBus使用过程中调用的第一个方法,即:首先看下ADT生成的类MyEventBusIndex的内容需要简单提一下的是,ADT在编译期会去解析和处理特定的注解(EventBus中就是@Subscriber),它会扫描出有关这个注解的方法信息,类信息等,拿到所需的信息后生成一些类。ADT的使用这里就不展开了,有兴趣的同学可以看下EventBus中的相关实现,EventBusAnnotationProcessor。......
2022-07-04 12:32:56
215
原创 EventBus3.0源码分析(一)两种使用方式
EventBus在3.0及以上版本中加入了以APT(Annotation Processing Tool)实现的方式,但他还是保留了之前反射的实现方式。下面将展示两种实现方式使用上的区别。
2022-07-01 17:45:48
775
原创 jenkins:Caused: java.io.IOException: Failed to create a temp file on /root/.jenkins/workspace/...
jenkins:Caused: java.io.IOException: Failed to create a temp file on /root/.jenkins/workspace/
2022-06-25 17:50:11
3748
原创 Android设备上直接运行C/C++程序,无需ROOT!!!
在Android开发过程中难免和JNI NDK打交道做混合开发,按一般方式当交叉编译完成得到so库后,我们将so库集成到Android项目里,打包成apk安装到手机上验证运行效果。但当我们想快速在手机上验证so的功能与性能时,上面提到的传统方式就过于繁琐了。那我们能不能在Android设备上直接运行C/C++程序来直接调用so库呢?答案是肯定的,因为我们在linux系统就可以直接运行C/C++程序,而Android系统与Linux系统的关系大家也都了解。下面来看一下具体的实现流程:首先先展示一下我需要用到的
2022-06-07 15:54:11
9487
5
原创 Android:启动优化
一、前言首先,我们先提出一个问题,为什么要做启动优化?随着项目的迭代,App的功能越来越丰富,无可避免的是我们将会引入更多的第三方库及各种SDK,因此App在启动时要做的初始化工作也会更繁重,不当的初始化行为就会拖慢App的启动响应速度,给用户带来糟糕的使用体验。既然是启动优化,我们就需要先了解应用的启动类型:冷启动 :应用从头开始启动,系统进程在冷启动后才创建应用进程,发生冷启动的情况包括应用自设备启动后或系统终止应用后首次启动。 热启动 :将处于后台中的应用进程恢复显示到前台,如果应用
2022-05-23 16:18:59
2021
原创 djinni使用实践(三)--Android项目中的使用
djinni使用实践(一) -- 官方文档djinni使用实践(二) -- djinni究竟都有哪些配置选项 本篇是介绍djinni在Android项目中JNI开发的使用场景,所以默认大家有一定的Android JNI开发经验,此篇中涉及到的JNI相关的知识点不做介绍,大家可自行学习。 djinni工具集成过程中需要用到该项目中的一些文件,我们先下载到本地以备使用djinni项目地址接下来先看下工程结构:着重看下djinni相关的文件夹: api_ge...
2022-05-08 19:07:37
1590
原创 Android报错:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader
开发过程中crash了,报错如下提示说一个so库找不到了,看了打包的apk文件发现armeabi-v7a和arm64-v8a中这个so,都存在所以确定不是缺so文件导致的,在排查过程中发现主module和lib module中的abiFilters配置不一致:主module:ndk { abiFilters 'armeabi-v7a' }lib module:ndk { abiFilters 'armeabi-v7a','a
2022-04-26 17:05:21
2124
原创 Android:NV21格式图片裁剪抠图(规则矩形)
首先需要大家对yuv数据格式有一定的了解,不了解的可以先看下YUV格式说明这篇文章,主要是看懂这两张图:上面的链接文章已经介绍的很清楚了,这里就不在赘述。代码如下: /** * @param src 原图 * @param w 原图宽 * @param h 原图高 * @param dstRect 要截取的块 * @return 截取后的图 */ public static...
2022-01-25 17:08:16
4569
原创 c++:报错Undefined symbols for architecture x86_64:
在学习c++是报了这个错:Undefined symbols for architecture x86_64: "StackMy<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::~StackMy()", referenced from: _main in main.cpp.old: symbol(s) not...
2021-11-29 19:15:37
2387
armeabi-v7a.rar
2019-05-24
ffmpeg-4.0.4编译的用于android平台的静态库
2019-05-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人