
Android系列
文章平均质量分 86
轻口味
十年的工作经验,精通C、C++、Python、JAVA、JS、GO等多种编程语言,擅长音视频、即时通讯、人工智能等领域的技术实现与系统设计。在音视频技术、实时通讯系统、AI算法等方面有深入的研究与实践,参与过多个大规模项目的开发与优化。欢迎合作与交流,私信我一起探讨技术发展与项目经验!
展开
-
Android Studio 常见问题解决备忘
通过上述方法,很多常见的 Android Studio 问题都能得到有效解决。保持 Android Studio 和相关工具的更新,及时清理缓存和配置优化,可以显著提升开发体验。希望这篇文章能够帮助你在 Android Studio 开发过程中减少问题,提升效率!如果你遇到了其他问题,欢迎在评论区留言,我们会及时解答!原创 2025-04-14 07:44:18 · 1674 阅读 · 0 评论 -
Android 代码中修改shape背景色问题方案
上面方法虽然解决了动态设置颜色的问题,但是发现所有使用这个drawable的控件都被改了颜色,原来Android 为了优化系统性能,资源Drawable只有一份拷贝,修改了一个,等于将所有的都修改了。这里可以用Drawable提供的。Drawable资源是对图像的一个抽象,你可以通过getDrawable(int)得到并绘制到屏幕上。有需求需要通过服务端返回颜色值,动态修改该shape的值。不会拷贝内存中公共的Bitmap,只会拷贝一份Bitmap的状态值,这样便达到了我们想要的效果了。原创 2025-02-14 08:43:15 · 399 阅读 · 1 评论 -
C/CPP中的编程技巧及其概念
如果一个类需要自定义的拷贝构造函数、拷贝赋值操作符、析构函数中的任何一个,那么他往往同时需要三者。因为编译器生成的隐式定义的copy constructor和operator=语义是逐成员拷贝(memberwise)的,所以如果编译器生成的操作不能够满足类的拷贝需求(比如类成员是具有管理某种资源的句柄),使用编译器的隐式定义会具有浅拷贝,导致两个对象进入某种共享状态。A y;y=x;原创 2024-09-28 21:23:18 · 1344 阅读 · 0 评论 -
Linux下C开发使用小技巧
Linux下C语言编程中有几个很实用的调试宏int main()return 0;line 行数 文件名指令可以改变它的值,简单的讲,编译时,它们包含程序的当前行数和文件名。DATE 宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。TIME 宏指令包含程序编译的时间。时间用字符串表示,其形式为时:分:秒__func__代表这条语句所在的函数的函数名va_list ap;FILE *fp;if (fp!va_end(ap);原创 2024-09-28 21:22:09 · 810 阅读 · 0 评论 -
Android听筒与喇叭切换遇到的坑
在聊天场景中,收到对方语音时,用户可以选择外放播放,也可以选择插入耳机收听.更人性化一点当用户把手机靠近耳朵时屏幕关闭自动切换到听筒中播放,播放完毕后拿开手机屏幕自动点亮.比如微信就是如此.原创 2024-09-27 10:29:04 · 1584 阅读 · 0 评论 -
AndroidStudio常见问题
运行./gradlew :PandaAndroidDemo:release出现如下错误:直接点击 run按钮 或者 Build→Generate Build APK 却运行正常。这里面有两个问题:为什么出现Unsupported major.minor version 52.0?为什么gradle命令和android studio按钮运行结果不一样?在网上找了一圈,最后在stackoverflow找到了本质原因简单来说,就是java的编译环境版本太低,java 8 class file的版本是52,J原创 2024-09-27 10:28:07 · 1106 阅读 · 0 评论 -
Android开发小贴士
可以看到,list中的数据类型不是Student,而是LinkedTreeMap,LinkedTreeMap是Gson库内部数据模型,换句话说我们的解析失败了,尝试着将parseString2List方法中的泛型T去掉,运行结果一样,说明Gson解析时不支持泛型。现在在回过头来看看,ParameterizedType的几个方法的含义吧,以HashMap为例。假设不只一个json数组字符串需要你解析,很显然重复的代码应该抽象成一个方法。原创 2024-09-26 09:59:39 · 556 阅读 · 0 评论 -
Android TextView对URL识别
IM开发过程中,对文本消息中的超练级进行点击处理,使用系统的Android自带的表达式(android.util.Patterns),在不同的ROM上表现形式是不一样的,在一些比较诡异的case上基本识别不出来,比如对于。原创 2024-09-26 09:58:37 · 1000 阅读 · 0 评论 -
Android 布局RecyclerView布局介绍
RecyclerView 的 support 包里默认提供了三个 LayoutManager,分别是下列三个,可用于实现大部分场景的布局需求:线性布局、网格布局、瀑布流布局等等。原创 2024-09-25 10:57:07 · 2135 阅读 · 0 评论 -
Android 版本适配
此项新增的行为不会影响有关使您的应用适应Android 6.0(API级别23)中所推出的旧版本低电耗模式的建议和最佳做法,如。原创 2024-09-25 10:55:14 · 1607 阅读 · 0 评论 -
Android线程使用总结
在程序开发的实践当中,为了让程序表现得更加流畅,我们肯定会需要使用到多线程来提升程序的并发执行性能。但是编写多线程并发的代码一直以来都是一个相对棘手的问题,所以想要获得更佳的程序性能,我们非常有必要掌握多线程并发编程的基础技能。众所周知,Android 程序的大多数代码操作都必须执行在主线程,例如系统事件(例如设备屏幕发生旋转),输入事件(例如用户点击滑动等),程序回调服务,UI 绘制以及闹钟事件等等。那么我们在上述事件或者方法中插入的代码也将执行在主线程。原创 2024-09-24 10:19:11 · 1751 阅读 · 0 评论 -
应用targetSdkVersion升级指导
运行时权限此版本引入了一种新的权限模式,用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,为安装的应用分别授予或撤销权限,同时为开发者精简了安装和自动更新过程。对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。确定应用是否已被授予权限,可调用新增的 checkSelfPermission() 方法。请求权限,可调用新增的 requestPermissions() 方法。具体参考:####(二)适配指导。原创 2024-09-24 10:15:25 · 1295 阅读 · 0 评论 -
android system_server进程
system_server进程是系统进程,java framework框架的核心载体,里面运行了大量的系统服务,比如这里提供ApplicationThreadProxy(简称ATP),ActivityManagerService(简称AMS),这个两个服务都运行在system_server进程的不同线程中,由于ATP和AMS都是基于IBinder接口,都是binder线程,binder线程的创建与销毁都是由binder驱动来决定的。系统为什么不允许在子线程中访问UI?原创 2024-09-23 08:03:27 · 1166 阅读 · 0 评论 -
Android启动过程深入解析
Android是一个基于Linux的开源操作系统。x86(x86是一系列的基于intel 8086 CPU的计算机微处理器指令集架构)是linux内核部署最常见的系统。然而,所有的Android设备都是运行在ARM处理器(ARM 源自进阶精简指令集机器,源自ARM架构)上,除了英特尔的Xolo设备(http://xolo.in/xolo-x900-features)。Xolo来源自凌动1.6GHz x86处理器。原创 2024-09-23 08:01:28 · 1648 阅读 · 0 评论 -
Android Sqlite知识点
错误原因CursorWindow缓存数据达到最大限制(2M不同的机器和SQLite版本其值可能不同)后,仍有查询结果集需要缓存,在申请内存分配时申请失败发生了OOM内存溢出;SQLite查询出的数据集cursor,都由native层的CursorWindow进行数据管理,包括内存空间的申请和数据的填充。CursorWindow实际上是共享内存的抽象,以实现跨进程,跨应用数据共享(ContentProvider作为数据通道,也支持跨进程,跨应用的数据访问)原创 2024-09-22 21:43:05 · 1222 阅读 · 0 评论 -
Android SharedPreference详解
SharedPreferences作为一种数据持久化的方式,是处理简单的key-value类型数据时的首选。原创 2024-09-22 21:41:33 · 1824 阅读 · 0 评论 -
Android数据序列化总结
可以看到,Serializable 的使用比较简单,创建一个版本号即可;而 Parcelable 则相对复杂一些,会有四个方法需要实现。一般在保存数据到 SD 卡或者网络传输时建议使用 Serializable 即可,虽然效率差一些,好在使用方便。而在运行时数据传递时建议使用 Parcelable,比如 Intent,Bundle 等,Android 底层做了优化处理,效率很高。原创 2024-09-21 12:56:51 · 1575 阅读 · 0 评论 -
Android开发中必备的代码Review清单
本文收集了我自己工作以来提交代码前的所有检查点。事实证明,这样能有效提高自己的代码质量和功能的稳定性。所以推荐大家以后每次提交代码前,都可以看下这份Review清单哈。此外,可能还有些检查点我并没有发现,欢迎大家踊跃在评论区补充哈~原创 2024-09-21 12:55:48 · 1447 阅读 · 0 评论 -
Android逆向相关知识
JD-GUI去http://jd.benow.ca/下载。dmg可能不支持最新版本的mac用不了,打开就报错。安装apktool和dex2jar,jd-gui。原创 2024-09-20 10:05:17 · 358 阅读 · 0 评论 -
Android应用内多进程
Serializable使用简单但是开销很大,序列化和反序列化过程需要大量的IO操作,一般用于将对象序列化到存储设备中或者将对象序列化后通过网络传输。Parcelable使用麻烦,但效率很高。原创 2024-09-20 10:01:08 · 2725 阅读 · 0 评论 -
Android插件化(五)基础之用到Android源码类探讨
获取:通过Context的getPackageManager()原创 2024-09-19 09:57:59 · 288 阅读 · 0 评论 -
Android插件化(四)基础之文件存储
/媒体存储已经移除了//存储媒体没有挂载//正在检查存储媒体//存储媒体是空白或是不支持的文件系统no_file_system//存储媒体已经挂载,并且挂载点可读/写//存储媒体已经挂载,挂载点只读//存储媒体正在通过USB共享//在没有挂载前存储媒体已经被移除//存储媒体无法挂载,可能是文件系统损坏了//存储媒体正在移除//未知的存储状态下面图片大概地概括了上面的方法![[Android插件化(四)基础之文件存储-1.png]]原创 2024-09-19 09:57:00 · 1496 阅读 · 0 评论 -
Android插件化(四)基础之Hook
Android中主要是依靠分析系统源码类来做到的,首先我们得找到被Hook的对象,我称之为Hook点;什么样的对象比较好Hook呢?一般来说,静态变量和单例变量是相对不容易改变,是一个比较好的hook点,而普通的对象有易变的可能,每个版本都不一样,处理难度比较大。我们根据这个原则找到所谓的Hook点。原创 2024-09-18 10:30:29 · 1080 阅读 · 0 评论 -
Android插件化(三)基础之Android应用程序资源的编译和打包过程分析
我们知道,apk包括代码和资源,在apk编译过程中,dex工具将代码打包成.dex文件,资源文件会由aapt工具生成对应的ID,aapt在打包的时候组织成resources.arsc文件,resources.arsc文件是用来描述资源ID和资源位置配置信息,从18个维度描述了一个资源ID的配置信息(语言、分辨率等),就是资源ID和资源的索引表。【输入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),库文件(.jar文件)原创 2024-09-18 10:29:23 · 1983 阅读 · 0 评论 -
Android插件化(三)基础之反射与代理
这个静态函数的第一个参数是类加载器对象(即哪个类加载器来加载这个代理类到 JVM 的方法区),第二个参数是接口(表明你这个代理类需要实现哪些接口),第三个参数是调用处理器类实例(指定代理类中具体要干什么)。这个函数是在代理对象调用任何一个方法时都会调用的,方法不同会导致第二个参数method不同,第一个参数是代理对象(表示哪个代理对象调用了method方法),第二个参数是 Method 对象(表示哪个方法被调用了),第三个参数是指定调用方法的参数。通过上面的方法就成功调用了 invoke() 方法。原创 2024-09-17 22:57:12 · 1063 阅读 · 0 评论 -
Android插件化(二)基础之类加载器
因为Java中提供的默认ClassLoader,只加载指定目录下的jar和class,如果我们想加载其它位置的类或jar时,比如:我要加载网络上的一个class文件,通过动态加载到内存之后,要调用这个类中的方法实现我的业务逻辑。在这样的情况下,默认的ClassLoader就不能满足我们的需求了,所以需要定义自己的ClassLoader。继承java.lang.ClassLoader重写父类的findClass方法深入探讨 Java 类加载器。原创 2024-09-17 22:53:48 · 1695 阅读 · 0 评论 -
Android插件化(一)技术调研
有关APK更新的技术比较多,例如:增量更新、插件式开发、热修复、RN、静默安装。插件化、热修复(思想)的发展历程。原创 2024-09-16 17:18:33 · 2481 阅读 · 0 评论 -
Android权限适配
从Android6.0版本开始google将权限分为普通权限和特殊权限,app必须在AndroidManifest.xml添加引用权限的语句。在安装apk时安卓会将普通权限授予该app,但特殊权限需要运行时申请。安卓按照权限类别分为权限组和权限, 每个权限都隶属于一个权限组。当安卓系统授权一个权限时, 那么该权限所属权限组的权限都会自动被授权。目前如果app的targetSdkVersion等于21,即按照Android5.0版本特性运行。原创 2024-09-16 17:14:21 · 1880 阅读 · 0 评论 -
Android架构之网络优化
常规的网络框架设计和常用的网络优化方案。原创 2024-09-15 08:55:05 · 1319 阅读 · 0 评论 -
Android NDK工具
PS: 必须是带symbols的so,也就是在’\app\src\main\obj\local\下面的so’, 否则行号打印出来降是???原创 2024-09-14 10:23:18 · 884 阅读 · 0 评论 -
Android mmap分析
对文件的读取操作跨过了页缓存,减少了数据的拷贝次数,用内存读写取代I/O读写,提高了文件读取效率。实现了用户空间和内核空间的高效交互方式。两空间的各自修改操作可以直接反映在映射的区域内,从而被对方空间及时捕捉。提供进程间共享内存及相互通信的方式。不管是父子进程还是无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动,达到进程间通信和进程间共享的目的。同时,如果进程A和进程B都映射了区域C,当A第一次读取C时通过缺页从磁盘复制文件页到内存中;原创 2024-09-14 10:22:13 · 1918 阅读 · 0 评论 -
Android内存知识总结
通过手机上Running services的Activity查看,可以通过Setting->Applications->Running services进。PS.其实现在有很多查看内存管理的第三方应用了,例如手机管家。原创 2024-09-13 10:00:10 · 1382 阅读 · 0 评论 -
Android系统编码MediaCodec
除了使用MediaCodec进行编码之外,另外一种比较流行的方案就是使用ffmpeg+x264/openh264进行软编码,ffmpeg是用于一些视频帧的预处理。这里主要是使用x264/openh264作为视频的编码器。原创 2024-09-13 09:56:59 · 1521 阅读 · 0 评论 -
Android系列基础知识总结
明确需求,确定你想实现的效果确定是使用组合控件的形式还是全新自定义的形式,组合控件即使用多个系统控件来合成一个新控件,你比如titilebar,这种形式相对简单,参考如果是完全自定义一个view的话,你首先需要考虑继承哪个类,是View呢,还是ImageView等子类。根据需要去复写View#onDraw、View#onMeasure、View#onLayout方法根据需要去复写dispatchTouchEvent、onTouchEvent方法。原创 2024-09-12 16:41:49 · 3704 阅读 · 0 评论 -
Android JobScheduler介绍
JobScheduler上手还是比较简单的,由于本文是基于api23的源码,因此还有很多新功能没有在源码中展示出来,如setRequiresBatteryNotLow(设置Job对电量的要求)、setRequiresStorageNotLow(设置Job对存储空间的要求)等.原创 2024-09-12 16:34:29 · 1352 阅读 · 0 评论 -
android逆向(1)之root方式注入apk
启动注入程序,入口main函数中输入将被注入的进程名称以及欲注入动态库路径;根据进程名获取进程id:打开/proc目录,读取;并暂停目前进程;,并保持读取到的寄存器;原创 2024-09-11 14:12:47 · 932 阅读 · 0 评论 -
Android Handler消息处理机制
消息处理机制本质:一个线程开启循环模式持续监听并依次处理其他线程给它发的消息。简单的说:一个线程开启一个无限循环模式,不断遍历自己的消息列表,如果有消息就挨个拿出来做处理,如果列表没消息,自己就堵塞(相当于wait,让出cpu资源给其他线程),其他线程如果想让该线程做什么事,就往该线程的消息队列插入消息,该线程会不断从队列里拿出消息做处理。原创 2024-09-11 14:11:43 · 2538 阅读 · 0 评论 -
android系统设计模式
在Android的Activity、Service等核心组件中,都定义了onCreate()方法,例如,当我们要显示用户界面时,一般都会在onCreate()使用setContentView这个方法,这个方法是在Activity中定义的,在编写具体的。Android中两个进程间的通信,如 框架在支持Android应用程序间的跨进程通信时就是基于Binder的,要实现进程间通信的双方只需要遵循共同的AIDL接口即可,而在背后是使用了代理模式的,下面举具体的例子说明。我们在5.4节中已经进行了详细的阐述。原创 2024-09-10 16:04:04 · 1783 阅读 · 0 评论 -
最近应用杀掉进程application不销毁问题探讨
这两种情况下onTaskRemoved()都会被调用,但在大多Android机型上,这两种情况有所不同:第一种情况即应用被浅杀(用户只划掉这一个Task),该Task栈会被清理,但如果有后台service在运行,该应用的进程不会被杀掉,后台service仍然在运行。(3).浅杀+深杀时(service 的 onStartCommand 返回 STICKY):onTaskRemoved()立刻被调用(浅杀后),深杀后过段时间onCreate()和onStartCommand()相继被调用。原创 2024-09-09 14:46:42 · 952 阅读 · 0 评论 -
你可能不知道的Activity启动的诡异现象探索
这篇文章主要是为了阐述一下activity连续启动的异常问题的跟踪过程。如果在同一个message连续启动同一个activity或者相邻message中分别启动同一个activity,就会出现生命周期诡异的问题,当然现在已经不诡异了。从探索方法和源码的角度给出了解释。解释了为什么singleTop在这种模式下会失效的问题给出了解决的思路,就是破坏消息顺序。此外,阐述了Activity栈和启动activity流程相关的知识。原创 2024-09-09 14:45:05 · 1384 阅读 · 0 评论