- 博客(3111)
- 资源 (6)
- 收藏
- 关注
转载 Native层崩溃的监听工具BreakPad
做Android开发的同学,基本上都遇到过程序崩溃,大部分的崩溃问题都存在于Java层。在开发过程中,如果遇到崩溃,我们可以在logcat中找到相关的信息进行修改;如果是线上出现的问题,我们可以使用Bugly,友盟等三方工具进行错误上报,或者自己做监控,生成错误文件进行上报分析,这时候需要用到UncaughtExceptionHandler接口如果是Native层发生的崩溃怎么办?基本这个问题我们都会略过,第一:看不懂,第二:三方的so库发生了问题我们也解决不了。
2025-03-19 18:44:31
62
转载 音视频编码:x264源码解析
本文对x264源码进行了解析,并深入探讨了其核心模块、编码流程以及性能优化等方面,相信读者通过本文的介绍可以更好地理解x264的内部工作原理,从而在实际应用中发挥其最大的价值。是一款开源的H.264/MPEG-4 AVC视频编码器,它实现了国际通用的视频编码标准H.264,因其出色的编码效率和广泛的适用性而在视频领域得到了广泛应用。编码控制模块是x264的核心部分,负责实现H.264标准中的各种编码工作,包括帧类型决策、运动估计、熵编码等。音视频编码:x264源码解析。三、x264编码流程解析。
2025-03-06 03:34:23
49
转载 聊聊Git中的引用
总体来说,引用机制让Git可以通过简单但唯一的ID来识别和追踪对象,管理项目版本以及支持分布式协作开发模式。Git中的引用主要包括HEAD引用,指向当前检出的分支或提交对象。HEAD管理 Git 当前操作所在的分支或提交状态。分支引用,存储在.git/refs/heads目录下,每个分支对应一个引用文件。指向某个提交对象,跟踪分支历史记录和进度。本地分支和远程分支分别保存在不同目录下。标签引用,存储在.git/refs/tags目录下,每个标签对应一个文件或对象。用于标记特定版本,不可变更。
2025-03-06 03:32:38
51
转载 Android APP 音视频(02)MediaProjection录屏与MediaCodec编码
这里主要是使用MediaProjection获取屏幕数据,将数据通过mediacodec编码输出到存储卡上。这里主要介绍 MediaProjection的基本原理和流程、 MediaCodec编码的简单说明,便于对代码有所理解。
2025-03-05 18:34:07
82
转载 WebRTC实现Android传屏demo
WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和音频流或其他任意数据的传输。目前,WebRTC的应用已经不局限在浏览器与浏览器之间,通过官方提供的SDK,我们可以很容易的实现本地应用间的音视频传输。在Android平台上,我们也非常容易的集成WebRTC框架,用非常简洁的代码就能实现强大、可靠的音视频传输功能。
2025-03-05 18:09:33
84
转载 Kotlin select使用方法介绍
select是Kotlin 1.6中的特性,即选择最快的结果。select与async、Channel结合使用,可以大大提高程序的响应速度,还可以提高程序的灵活性、扩展性。
2025-03-03 03:29:03
40
转载 理解 Kotlin 中的协程生命周期
协程是轻量级的线程,可以在不阻塞主线程的情况下执行异步任务。它们提供了一种编写非阻塞代码的方式,使代码易于阅读和维护。在 Kotlin 中,协程围绕 Job 的概念进行结构化。Job 是协程的句柄。它表示其生命周期,并允许你管理其执行,包括启动、取消和检查其状态。Job 提供了协程在其生命周期中可能处于的几种状态。
2024-12-26 01:22:06
132
转载 一文搞懂Android权限的各种类型
大牛:“关于权限各种类型就已经结束了,我用一张图来做下总结吧,如下图:”imagenormal权限,该类型权限对用户隐私或系统安全影响较小,因此在Apk安装后就自动授予了该类型的权限。正因如此一个Apk使用该类型的权限,该类型权限的权限状态可是与Android设备的用户没有关系的。dangerous权限,该类型权限是指可能会侵犯用户隐私或设备安全的权限,因此应用在使用这些权限之前必须获得用户的明确授权。一个Apk使用该类型的权限,该类型权限的权限状态可是与Android设备的用户有关系的。
2024-12-26 01:20:52
202
转载 Kotlin 中的密封类:理解其目的、优势
密封类(Sealed Classes)在 Kotlin 是一种限制继承的类类型。请把它想象成一个会员制的社团。在 Kotlin 中,可以定义一个密封类,并且只有某些类型可以成为这个“社团”的一部分。
2024-12-26 01:19:29
143
转载 m3u高清4K播放器1.14.0更新,附带安装使用教程
它不仅提供了高清内容观看体验,还通过不断的更新和改进,满足了用户对于现代媒体消费的期待。让我们一起享受高清内容的观看,让m3u成为你日常生活中不可或缺的一部分。1. U盘安装,下载的apk安装包拖到U盘,然后使用插到电视上,在电视的媒体或者存储空间管理模块打开点击安装,支持Android8.0以上系统。这些更新旨在提升用户体验,增加新功能,并解决用户在使用过程中遇到的问题。手机端点击这个悬浮的遥控器按钮,会出现输出TV端Code的界面,输入后即可建立与TV之间的连接。让我们一起迎接大屏娱乐的新体验!
2024-12-26 01:18:21
1811
转载 Android Studio 安装ASM插件
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.youkuaiyun.com/wangzhongshun/article/details/96274140。
2024-12-26 01:09:23
92
转载 Android Studio调试Gradle插件
使用ASM在编译期修改字节码来完成各种功能(统计方法耗时、全埋点统计...),就需要开发Gradle插件。开发插件中遇到问题排查使用日志输出效率太低了,能断点调试的话就更好了。其实已经有很多文章写了调试插件的方法,但是自己照着他们的步骤下来还是遇到一些问题,把这些问题记录下来方便大家少走弯路。Android Studio版本是3.5.2,Gradle版本是3.5.1
2024-12-26 01:03:56
131
转载 compileDebugJavaWithJavac task (current target it 1.8) and kaptGenerateStubsDebugKotlin task...
这个错误提示 “compileDebugJavaWithJavac task (current target is 1.8) and kaptGenerateStubsDebugKotlin task (current target is 17)” 表示在执行 compileDebugJavaWithJavac 任务时,Java 的编译目标版本为 1.8,而在执行 kaptGenerateStubsDebugKotlin 任务时,Kotlin 的编译目标版本为 17,它们应该设置为相同的版本。
2024-12-26 00:56:31
346
转载 ASM字节码插桩之Transform的替代方案
最近在学习asm字节码插桩相关的知识,发现在高版本的gradle上以前的Transform已经废弃,于是研究了一下新版本字节码插桩的实现,本文将简单地介绍下新版本gradle上字节码插桩的实现。GitHub - SmilingTeresa/AsmDemo: ASM插桩Demo。
2024-12-26 00:53:20
182
转载 Gradle第8课:Gradle 中自定义插件的实现
Gradle 插件功能可以很好的组织我们的编译逻辑代码,使它能在不同的项目和工程中重复使用。我们可以自定义实现自己的 Gradle 插件,然后分享给其他人使用。我们可以使用不同的语言来实现,不过本章中作者选择使用 Groovy 来实现的,大家也可以使用像 java、scala等喜欢的别的语言来实现。Gradle自定义插件的实现和自定义任务类型非常的相似,而它两一般都是结合使用的。所以如果还不了解如何自定义任务类的可以先看上一节的内容。首先有三种方式来编写我们的插件。
2024-12-26 00:39:50
53
转载 Gradle 自定义插件
maven 发布插件 https://docs.gradle.org/current/userguide/publishing_maven.html。开发辅助插件 https://docs.gradle.org/current/userguide/java_gradle_plugin.html。使用插件 https://docs.gradle.org/current/userguide/plugins.html。Gradle 教程 https://gradle.org/guides/?
2024-12-26 00:38:02
160
转载 Android-gradle plugin
都是可以直接使用gradle.properties中的key-value配置,例如在gradle.properties中配置了DEV_MODE=true,则可在gradle文件中直接使用if ("true" == DEV_MODE) {xxx},但这里有个限制,gradle.properties中配置的value,在使用的时候,都会被当作字符串类型的,就算写的是数字或者true/false这样的。这里的if是判断是否使用新的dsl和api,一般来说新的gradle这是都是返回false从而走到if分支。
2024-12-26 00:15:44
226
转载 Android plugin如何兼容App插件和library插件
最近由于工作需要,开发了一个jacoco与记录用例执行顺序的插件,整体功能开发没有问题,但是在应用到项目的时候,就出错了。被测试的项目是个多模块的项目,原则上需要对app和libraries都添加插件,不然library中的代码没有插入jacoco的桩,也没有记录用例执行顺序的桩,无法达到目的。通过这两个地方的兼容处理,就可以保证插件在app插件和library插件中同时使用,经过Demo测试没有问题。2,对apply函数中添加注册transform的兼容。
2024-12-26 00:14:27
44
转载 其实 Gradle Transform 就是个纸老虎 —— Gradle 系列(4)
而 Task 的依赖关系是通过 TransformTask 的输入输出关系隐式确定的,TransformManager 通过 TransformStream 链接各个 TransformTask 的输入输出,进而控制 Transform 的依赖关系顺序。是的,就是卷,而且这次直接是降维打击。Task 增量模式与 Transform 增量模式的区别在于,Task 增量执行时会跳过整个 Task 的动作列表,而 Transform 增量执行依然会执行 TransformTask,但输入内容会增加变更内容信息。
2024-12-26 00:13:31
159
转载 在Javassist学习时遇到的javassist.NotFoundException问题的解决办法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.youkuaiyun.com/weixin_43900321/article/details/105189867。与原来程序相比,在新程序的中间添加了insertClassPath()这一方法,猜测是jdk版本的问题。在加入该行代码后运行无误。
2024-12-26 00:07:21
139
转载 【Groovy】Groovy 扩展方法 ( 静态扩展方法配置 | 扩展方法示例 | 编译静态扩展类 | 打包静态扩展类字节码到 jar 包中 | 测试使用 Thread 静态扩展类 )
在 工程根目录\src\main\groovy\ 目录下创建 manifest\META-INF\services 目录 ,命令 , 将 classes 中的字节码文件按照 manifest/ 规则 , 打包到 thread.jar 文件中;在 Terminal 面临中 , 使用命令行执行该 Groovy 脚本 ,命令 , 进入到 src/main/groovy 目录中 ,参数 , 在该方法中 , 执行传入的闭包参数;代码语言:javascript。代码语言:javascript。
2024-12-25 00:55:16
63
转载 Android Gradle 自定义Plugin实现
Id 就是插件唯一标识,后续在其他项目中引用的时候,也是引用这个 id。这里有很多不需要的文件目录,包括用来测试和 Gradle 的一些相关内容,都可以删除(当然你也可以不处理),因为当我们把这个项目引入到一个 Android 项目中时,Android 项目提供了 Gradle 相关文件。如图所示,ExamplePlugin 目录下 gradle 相关的文件,在 Android 的根目录中都存在。实际上 Gradle 后续就是执行这个 Task ,来执行代码块中的代码的。
2024-12-25 00:52:18
290
转载 Android开发—APT注解处理器详解,传参
自定义注解处理器的话需要用到2个第三方库和JavaPoet,还有Java自带的AbstractProcessor。:Java内置注解处理器,注解处理器核心工作都在这个类进行。:Google开源用来自动注册我们自己的注解处理器。JavaPoet:Java代码生成器,方便我们生成Java文件;我们按照上文说的APT处理annotation的基本流程来自定义。1、定义注解,比如@Route。
2024-12-25 00:49:23
110
转载 android 代码读取annotationProcessorOptions;gradle注解传参
通过JavaCompiler的getProcessorOptions()方法,我们可以在Android代码中读取annotationProcessorOptions的值。在Android代码中,我们可以通过JavaCompiler提供的getProcessorOptions()方法来读取annotationProcessorOptions。annotationProcessorOptions是在build.gradle文件中配置的参数,用于指定注解处理器的选项。classNames:用于指定要处理的类名。
2024-12-25 00:42:48
63
转载 gradle 7.x 如何开发一个自定义 Plugin
这里我还是使用 buildscript 的方式引入(因为对 gradle 不熟悉),起码能 work 起来,有什么好的建议可以提给我,感激不尽。执行成功后,我们会看到,在我们的项目目录下,会创建 repo 目录,里面有我们的包名的路径和里面的 jar 文件。在 settings.gradle 中,添加本地仓库,注意,是往 PluginManagement 中添加仓库。再 sync 一下,我们会看到控制台输出了我们的那句话,说明我们的插件引入成功了。商业转载请联系作者获得授权,非商业转载请注明出处。
2024-12-24 01:50:21
67
转载 Android Gradle(九)自定义Transform,使用Javassist工具插入和删除代码
在安卓中,难免会碰到需要动态插入代码,或者删除代码。这时候就需要用到自定义Transform任务,来对Class文件进行扫描和获取。可以插入的代码场景有哪些?例如:打印方法的执行时间等。可以删除的代码场景有哪些?例如:把代码中Log.e日志打印的代码去掉等先看下代码前后效果,原始代码如下:经过修改后(通过反编译apk得到源码):接下来,让我们看看如何对以上两个场景进行代码的插入和删除。
2024-12-24 01:44:17
99
转载 Android Gradle(七)三种自定义插件方式
我们知道,在Android中每一次的编译和打包其实都是一个个task任务顺序执行或者并发执行最终生成一个Apk。也就是说所有的任务可以想象成一条线,上个任务的产出就是下一个任务的输入(流水线作业😄)。例如下图:一个简单的APK构建流程例如下图:实际构建中的task任务可以简单的理解为:前缀带有compile的task:一般是做编译转换的任务,例如:Java文件转换成Class前缀带有merge的task:一般是合并各种资源文件任务,例如:所有的Assets文件合成一个。
2024-12-24 01:40:13
340
转载 Android编译时技术(一)Javassist 基础使用
所谓的Javassist,其实就是如何生成一个Class文件或者修改一个Class文件的工具,包括对Class里的成员变量或者方法进行增加或修改。相比于ASM,Javassist最大的好处就是方便,简单,不用去关心字节码操作。
2024-12-24 01:28:39
104
转载 ButterKnife源码完全解析
从上图看到,提供了许多自定义注解,我们以@BindViewSOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;CLASS:注解被保留到class文件,但JVM加载class文件时候被遗弃,这是默认的生命周期RUNTIME:注解不仅被保存到class文件中,JVM加载class文件之后,仍然存在;如果需要在运行时去动态获取注解信息,只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作,就用 CLASS注解;
2024-12-24 01:19:38
35
转载 android注解之APT和javapoet
前面我们已经讲过注解的基本知识,对于注解还不太了解的,可以去看一下之前的文章,android 注解详解_袁震的博客-优快云博客。之前我们在讲注解的时候,提到过APT和JavaPoet,那么什么是APT和JavaPoet呢?下面我们来详细讲解一下。1,APT是什么?
2024-12-24 01:08:48
54
转载 javassisit提升反射效率
Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京技术学院的数学和计算机科学系的 Shigeru Chiba 所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。Javassist(JAVA编程ASSISTant)使Java字节码操作变得简单。它是一个用Java编辑字节码的类库;它使Java程序能够在运行时定义新类,并在JVM加载时修改类文件。
2024-12-24 00:59:20
83
转载 ARouter基本使用及原理分析
ARouter是阿里开源的一款帮助Android App进行组件化改造的路由框架,是Android平台中对页面和服务提供路由功能的中间件,可以实现在不同模块的Activity之间跳转。ARouter的特点是灵活性强还能帮助项目解耦。除了广为人知的Activity跳转之外,ARouter还支持获取Fragment,解耦服务使得跨模块API调用等等ARouter使用@Route注解,在编译时期通过APT技术生成类文件用于存储path和activityClass的映射关系。
2024-12-24 00:49:24
229
转载 ARouter启动优化引发的探索
笔者在做启动优化时,发现第一次启动应用时,ARouter初始化耗时占用了接近2s的时间。查询优化方案时,发现只需要通过一个插件就可以解决了。感觉解决方法挺新奇的,但由于对ARouter底层实现不是非常了解,所以本文就诞生了,从一个小白的角度分析下这个插件是如何做到的,实现思路对我们又有什么启发。ARouter最初通过扫描dex找到符合条件的类,完成注册表信息的存储。带来的弊端就是第一次启动非常耗时,对于低端机型影响更大。另外对一些加固应用来说,扫描dex文件也可能会失败。
2024-12-24 00:45:40
95
转载 ASM字节码插桩点击防抖以及统计方法耗时
Transform API 是 AGP1.5 就引入的特性,Android在构建过程中回将Class转成Dex,此API就是提供了在此过程中插入自定逻辑字节码的功能,我们可以使用此API做一些功能,比如无痕埋点,耗时统计等功能。不过此API在AGP7.0已经被废弃,8.0会被移除,取而代之的是Transform Action。
2024-12-19 00:20:45
81
转载 Android Gradle8.0 Transform 废弃如何适配,手撸Arouter插件教你使用
最近公司也在适配项目至Android14 否则市场不让上架,因此 gradle也必须适配升级了,就先来试试水。目前最新的AGP已经到8.3了,适配AGP8.0也要提上日程了,尤其是一些插件项目,因为8.0删除了transform API,所以需要提前做好适配工作。对于之前未了解过gradle自定义插件的同学可以看下我以前的7.0之前的gradle自定义插件的用法 教你如何一步步实现路由插件。Android 自定义Gradle插件,使用Transform。
2024-12-19 00:10:43
256
转载 “终于懂了” 系列:组件化框架 ARouter 完全解析(三)AGP/Transform/ASM—动态代码注入
本篇内容较多,前半部分都是在介绍铺垫知识,只有完全理解了才能掌握ARouter框架的核心。其中Gradle、AGP是Android开发中必定使用到的技术点,希望通过对ARouter的学习能更加深刻的理解Android编译构建的过程,以及使用Gradle插件能完成哪些事情。Transform是官方Gradle 插件中提供的API,它能获取和处理被打进dex文件之前的class文件。不过Transform在最新的Gradle插件版本中被废弃了,不过这不影响我们我们对它的学习。
2024-12-18 23:53:32
119
转载 什么是可重入锁(递归锁)
通过调用lock()方法获取锁,再调用unlock()方法释放锁,可以实现多次获取和释放同一个锁的操作。在存款(deposit)和取款(withdraw)方法中,首先使用lock.lock()获取锁,然后执行相应的操作,最后使用lock.unlock()释放锁。当一个线程已经获得了锁,但在持有锁的代码块中又调用了另一个需要同样锁的方法时,如果使用非可重入锁,线程会因为无法再次获得同一个锁而陷入死锁状态。当线程再次请求获取锁时,会检查当前线程是否已经持有锁,如果是,则增加持有锁的计数器;
2024-12-12 11:31:44
225
转载 多线程篇(基本认识 - 公平锁 & 非公平锁、独占锁 & 共享锁、可重入锁、自旋锁)(持续更新迭代)
根据线程获取锁的抢占机制,锁可以分为公平锁和非公平锁,公平锁表示线程获取锁的顺序是按照线程请求锁的时间早晚来决定的,也就是最早请求锁的线程将最早获取到锁。而非公平锁则在运行时闯入,也就是先来不一定先得。ReentrantLock 提供了公平和非公平锁的实现。公平锁:ReentrantLock pairLock = new ReentrantLock(true)非公平锁:ReentrantLock pairLock = new ReentrantLock(false)
2024-12-12 11:01:18
225
转载 SharedFlow 参数含义 replay等
MutableSharedFlow 是 Kotlin 协程库(Kotlin Coroutines)中的一个类,它是 SharedFlow 的可变版本,允许发射新的值。MutableSharedFlow 具有可变性,可以使用 emit 方法来发射新的值。版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。表示当新订阅者订阅时,会重放多少个最近发射的值。如果设置为正数,新的订阅者会接收到最近发射的这些值。: 额外缓冲区容量,默认值为 0。
2024-12-10 13:59:20
105
ormlite-4.48
2014-11-29
jdk-6u45-linux-x64.part2
2013-07-31
jdk-6u45-linux-x64.part1
2013-07-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人