Android
文章平均质量分 76
在Android学习过程中,记录相关的Android开发相关知识点
cj5785
知其然,更要知其所以然
展开
-
MMKV getAll 不支持的解决思路
MMKV 是按字节进行存储的,这意味着类型信息被擦除了,导致我们无法准确地识别存储的数据类型。虽然 MMKV 提供了一个 getAll() 方法来获取所有数据,但它会直接抛出异常,无法直接使用,对于怎么解决这个问题,经过一番探索,有一点点心得,在此记录一下。思路:既然获取全部时候不能获取到类型,那么在设置时候记录类型就行了,但不记录在key中,而是使用MMKV专门记录key值的类型,这样在获取时候不会产生任何的额外开销,只是在设置的时候有设置操作,直接上代码吧,no BB, show Code。原创 2024-04-28 00:34:11 · 1097 阅读 · 2 评论 -
Exoplayer 扩展 FFmpeg 支持
使用软解,支持格式较多,可通过自编译so扩展格式。基本上是可以满足绝大多数的视频正常播放的,库里面默认的支持格式并不全,要解决问题需要重新编译出so文件,替换了原本的so就好了,流程也是非常的简单。可随着业务的发展,需要播放用户的音视频,随之而来的就是出现了不支持的音视频格式,这下好玩了。的开源项目直接使用,正常来说,是没啥问题的。上去看了下,上次的更新维护时间已经是两年前了,,从而得到更多的格式支持,并且可以选择多种扩展模式,官方说明如下。的,但本着能不改就不改的原则,这里就使用默认的就好了,把。原创 2024-04-26 19:27:40 · 1176 阅读 · 0 评论 -
默认电话研究
默认电话研究背景Android 从6.0开始,允许用户设置默认短信和默认电话应用,使用相应的 Intent 便可以设置默认应用从一个框架说起从 API 21 开始,谷歌添加了 TelecomManager 用于提供对电话通讯状态的监听API 23 之后,又开放了 Telecom framework,这个框架允许第三方应用开发者编写应用来替换系统默认电话应用,而其中大部分接口就添加在 an...原创 2019-08-05 10:01:10 · 1211 阅读 · 0 评论 -
Android基础知识(一)
此篇文章开始逐步记录一些Android开发的一些相关知识。本文主要讲了一些adb的常用指令,Toast的常规使用,Intent的显式启动活动,按钮点击事件的四种处理方法,一些常见布局。1. ADB常用指令 Android Debug Bridge adb android调试桥adb start-server :开启adb服务adb kill-server :杀死a...原创 2017-12-20 22:41:46 · 2877 阅读 · 0 评论 -
AndroidMainfest详解
基于TV settings和SettingsProviderAndroid启动模式对activity行为的影响AndroidManifest.xml文件详解Manifest文件中,application和activity标签属性详解android之manifest.xml内provider详解coreApp<manifest ··· coreApp="true...原创 2019-04-04 22:44:37 · 3148 阅读 · 0 评论 -
优化apk的odex处理
前文讲到了apk的反编译流程,但在有的情况下会出现apk的资源文件和代码文件分开的情况,这种情况会出现如下目录结构,并且在apk文件里面并没有dex文件。 所需工具smali.jar和baksmali.jar平台相关的framework文件夹,主要是core.jar(平台不同略有差异)合并流程将xxx.odex放在与framework同级目录下,有的平台不需...原创 2018-03-03 17:50:29 · 3509 阅读 · 0 评论 -
Android 反编译技术流程
为何需要反编译 作为一名Android开发者,很多的时候需要去学习别人优秀的代码,原本在GitHub上就有很多开源的项目代码,但有的时候在使用软件时候遇到自己想要的功能时,想要学习实现的代码时,这时候就需要使用到反编译这项技术了。什么是反编译总的来说反编译指两个部分的反编译,一个是代码的反编译(src),一个是资源的反编译(res)。反编译的工具这里同样分成两个部...原创 2018-03-03 16:14:59 · 3011 阅读 · 0 评论 -
Android SDK目录说明
在SDK目录下有很多文件夹,了解这个文件夹都包含哪些内容,更有利于Android的开发,也是作为Android开发者应该了解的。本文就SDK目录进行说明。原创 2017-12-19 22:44:47 · 3486 阅读 · 0 评论 -
ffmpeg学习笔记-多线程音视频解码
之前的视频解码仍然存在问题,那就是是在主线程中去完成解码的,会造成线程阻塞,这里将其改为多线程解码,使其主线程不被阻塞前面介绍了音视频的主线程解码,那样会阻塞主线程,在前面学习了多线程以后,就可以对音频和视频分离开来在子线程里解析了,但这样存在音视频同步的问题了,这里贴出代码,只是提供一种思路,其运行存在大量问题,还需要慢慢解决。例如,退出发生异常,音视频不同步#include <and...原创 2019-04-05 23:35:53 · 9795 阅读 · 0 评论 -
ffmpeg学习笔记-编译脚本
之前已经用他人的编译脚本对ffmpeg进行了成功编译,那么在裁剪ffmpeg的时候需要指定文件,这时候应该怎么编写编译脚本呢?本文目的在于说明ffmpeg编译脚本的编写首先在ffmpeg的目录下新建编译脚本touch android_build.sh #新建编译脚本chmod 755 android_build.sh #修改权限打开编译脚本,进行脚本编写vim android_...原创 2019-04-05 23:27:47 · 1627 阅读 · 0 评论 -
ffmpeg学习笔记-音频播放
前文讲到音频解码,将音频解码,并且输入到PCM文件,这里将音频通过AudioTrack直接输出音频播放说明在Android中自带的MediaPlayer也可以对音频播放,但其支持格式太少使用ffmpeg可以支持更多格式常用的音频播放有很多种方式,但播放PCM就只有OpenSL和AudioTrack这里使用AudioTrack进行实现在上文中已经实现了音频的解码,而在本文中,将对解码完成...原创 2019-04-05 23:26:56 · 1295 阅读 · 0 评论 -
ffmpeg学习笔记-音频解码
在之前的文章已经初步对视频解码有个初步的认识了,接下来来看一看音频解码音频解码步骤音频解码与视频解码一样,有者固有的步骤,只要按照步骤来,就能顺利的解码音频以上是ffmpeg的解码流程图,可以看到,无论是音频还是视频,其步骤都是一样的,差别在于在视频处理和音频处理的方法不一样音频解码步骤由于音频解码步骤与视频类似,这里就直接使用之前测试ffmpeg生成是否可用的demo进行改进注册...原创 2019-04-05 23:26:06 · 1407 阅读 · 0 评论 -
ffmpeg学习笔记-native原生绘制
上次已将ffmpeg的动态库编译出来了,并且使用了ffmpeg的转码功能,成功将mp4格式视频转化为yuv视频,这篇文章基于上次测试的demo,使用surfaceview显示解码完成的像素数据布局设置和权限添加布局<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools...原创 2019-04-05 23:24:46 · 1597 阅读 · 0 评论 -
ffmpeg学习笔记-Linux下编译Android动态库
Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库文件准备要编译生成Android需要以下文件NDKffmpeg源代码NDK下载NDK可以去Google下载,也可以在国内一些Android网站下载这里推荐两个Android的下载网站Android Studio 中文组AndroidDevToolsffmpegffmpeg...原创 2019-04-05 23:23:29 · 1973 阅读 · 0 评论 -
ffmpeg学习笔记-ffmpeg在VS下的运用
ffmpeg官网提供了window平台下额开发工具供开发者使用,这篇文章主要以3.2版本的ffmpeg作为演示,记录在VS2013下,怎么去编译ffmpeg下载在官网中,按照以下步骤下载下载Windows版选择需要的版本下载版本这里接下来就是选择版本,这里我选择3.2版配置环境将下载源文件解压,新建win32空项目,将dev目录下的include和lib文件夹复制到项...原创 2019-04-05 23:10:27 · 1409 阅读 · 0 评论 -
ffmpeg学习笔记-初识ffmpeg
ffmpeg用来对音视频进行处理,那么在使用ffmpeg前就需要ffmpeg有一个大概的了解,这里使用雷神的ppt素材进行整理,以便于复习音视频基础知识视频播放器的原理播放视频的流程大致如下:常用播放器跨平台VLC,Mplayer,ffplay等Windows平台完美解码,终极解码,暴风影音信息查看工具综合信息查看:MediaInfo二进制信息...原创 2019-04-05 23:06:22 · 1459 阅读 · 0 评论 -
NDK学习笔记-C语言
本文简要回顾了C语言的一些注意事项和理解细节,不再赘述C语言的所有语法头文件头文件作为引入文件,在编译的时候,加载到源代码,参与编译在VS2013中可以看到,当引入头文件时候,只能看到函数的声明,其实现是在编译时候查找的C的动态库函数不可重名,而C++可以,这是因为C++有命名空间的存在,而C没有//引入头文件#include <stdio.h>void main(){...原创 2019-04-05 22:40:21 · 1336 阅读 · 0 评论 -
NDK学习笔记-JNI开发流程
JNI(Java Native Interface)Java本地化接口,Java调用C/C++,C/C++调用Java的一套API接口实现步骤在Java源文件中编写native方法public native static String getStringFromC();到Java源代码src路径下,使用javah命令生成.h头文件注意:此处的参数为包名+类名//生成的头文件为...原创 2019-04-05 22:41:44 · 1352 阅读 · 0 评论 -
NDK学习笔记-JNI数据类型和属性方法的访问
JNI实现了C/C++与Java的相互访问,那么这篇文章就从C/C++访问Java开始说起native函数说明每个native函数,都至少有两个参数(JNIEnv *和jclass或jobject)当native方法为静态方法时,采用jclass,此时jclass代表native方法所属类的class对象当native方法为非静态时,使用jobject,此时jobject代表native...原创 2019-04-05 22:48:50 · 1436 阅读 · 0 评论 -
NDK学习笔记-JNI的引用
JNI中的引用意在告知虚拟机何时回收一个JNI变量JNI引用变量分为局部引用和全局引用局部引用局部引用,通过DeletLocalRef手动释放对象原因访问一个很大的Java对象,使用之后还用进行复杂的耗时操作创建了大量的局部引用,占用了太多的内存,而且这些局部引用跟后面的操作没有关联性局部引用示例Java中存在native方法public native void localR...原创 2019-04-05 22:49:43 · 1346 阅读 · 0 评论 -
NDK学习笔记-JNI的异常处理与缓存策略
在使用JNI的时候,可能会产生异常,此时就需要对异常进行处理异常处理JNI抛出Throwable异常,在Java层可以用Throwable捕捉而在C只有清空异常这种处理但如果在JNI中通过ThrowNew抛出异常,则在Java曾可以捕获例子(在native访问不存在的属性)Java中声明native方法public native void exception();在native中...原创 2019-04-05 22:50:28 · 1274 阅读 · 0 评论 -
NDK学习笔记-NDK开发流程
本文主要是说明一下在eclipse下如何对NDK进行配置配置NDK虽然现在基本上都使用Android Studio进行Android开发,但一些项目在eclipse中仍有运用,这里讲一讲eclipse的NDK配置在最开始下载的adt里面是没有NDK这个选项的,那么就要进行配置,手动安装eclipse界面下Help -> Install New Software... -> W...原创 2019-04-05 22:51:27 · 1588 阅读 · 0 评论 -
NDK学习笔记-文件的拆分与合并
文件的拆分与合并在开发中经常会用到,上传或是下载的时候都有这样的运用文件拆分的思路将文件大小拆分为n个文件那么,每个文件的大小就是等大小的如果文件大小被n除不尽,那么就使用n+1个文件来拆分最后一个文件的大小就是整除不尽的那一部分数据文件合并的思路将拆分出来的全部文件胺顺序读取挨个数据写入到指定文件中所有文件数据写入完毕那么合并就完成了代码实现布局文件(activity_m...原创 2019-04-05 22:52:15 · 1287 阅读 · 0 评论 -
NDK学习笔记-增量更新
虽然现在有插件化开发和热修复,但为何还需要增量更新?插件化开发和热修复依赖于宿主程序,增量更新适合更新宿主程序。差分包生成的前提差分包的生成依赖于BsDiff开源项目,而BsDiff又依赖于Bzip2BsDiff源代码下载地址:BsDiffBzip2源代码下载地址:Bzip2Window服务器端配置新建Java Web项目new -> Web -> Dynamic We...原创 2019-04-05 22:53:45 · 1420 阅读 · 0 评论 -
NDK学习笔记-使用现有so动态库
前面将的都是如何使用C/C++文件生成so动态库,那么在使用别人的so动态库的时候应该怎么做呢?这篇文章就是使用一个变声功能的动态库,完成对于以有so动态库的说明。动态库来源在互联网中,有着许许多多动态库,很多厂商也对外提供动态库供开发者调用,例如高德地图的动态库,做地图开发的时候还是很方便的本文主要讲一个可以使声音改变的动态库,这个动态库主要用于游戏中,游戏引擎中有使用到这就...原创 2019-04-05 22:55:37 · 1443 阅读 · 0 评论 -
NDK学习笔记-多线程与生产消费模式
在做NDK开发的时候,很多情况下都是需要使用多线程的,一方面是提高程序运行效率,另一方面就是防止主线程阻塞C的多线程在C语言里,可以通过对于POSIX标准的运用,使得C语言执行多线程提高程序的执行速度,以及对资源的合理利用POSIXPOSIX原理POSIX可以让C语言实现多线程其实现是是通过POSIX函数库的调用实现的POSIX函数库可以看作是C语言库函数的超集,对C语言尽行了增强...原创 2019-04-05 23:33:12 · 1266 阅读 · 0 评论 -
NDK学习笔记-gdb调试
在做开发的时候,难免会crash,那么在这时候需要进行调试,在C/C++的代码调试中,gdb是很常用的gdb在这不做过多介绍,之前在C语言中已经做过总结,这里简要回顾一下要使用gdb,在编译的时候需要添加-g参数gcc test.c -g -o test进入调试gdb test开始调试start显示gdb命令帮助信息help 显示gdb命令种类help subcommand ...原创 2019-04-05 23:34:05 · 1443 阅读 · 0 评论 -
NDK学习笔记-JNI多线程
前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了简单示例在native实现中,直接调用pthread的多线程方法,这样就可以在JNI层实现多线程,下面是一个简单的实现多线程的例子#include <stdlib.h>#include <unistd....原创 2019-04-05 23:34:53 · 2262 阅读 · 0 评论 -
性能优化-内存泄漏
由于Java的特有属性,其垃圾回收机制的垃圾回收的时间不确定性,造成了Android的内存泄露问题,本文主要是说明一些Android中的内存泄露问题内存泄漏概念在C/C++中,堆内存的开辟和销毁是通过程序员通过malloc/free和new/delete去完成的,而在Java中,程序员只用开辟内存,而不用关心内存怎么去释放,这一切都交由Java的GC去完成而内存泄漏问题,也就出在GC...原创 2019-04-06 20:21:09 · 1294 阅读 · 0 评论 -
性能优化-内存分析工具的使用(整理)
前文讲到了内存泄漏的原因,那么要怎么定位内存泄漏呢?这里列出了常用的分析工具及其使用方法以下Heap Snapshot、MAT、Heap Viewer、Allaction Tracking、LeakCanary和TraceView资料均来源于网络Heap Snapshot获取Java堆内存详细信息,可以分析出内存泄漏的问题在2.X版本中,Android Studio使用的分析工具点击Mo...原创 2019-04-06 20:44:15 · 3593 阅读 · 0 评论 -
性能优化-内存泄露常见例子
之前说了内存泄漏和检测工具,这里就记录一下常见的内存泄露有哪些前言在举例子以前,需要明白两个概念内存泄露(Memory Leak):某些对象已经不再使用,但仍然直接或间接的被引用到GC ROOT中,此时GC没法对其进行回收,就造成了内存泄露内存溢出(OOM):当应用占用了大于虚拟机分配的内存空间时,会造成内存溢出静态变量引起的内存泄露当调用getInstance时,如果传入的con...原创 2019-04-06 20:49:14 · 1637 阅读 · 0 评论 -
性能优化-渲染机制及优化
在手机上显示图片,播放视频,这是很常见的手机操作,也就是屏幕的绘制在软件开发中几乎是每个应用都会打交道的,这篇文章记录了渲染机制以及如何做优化卡顿产生的原因在Activity中直接进行网络访问/大文件的IO操作还有就是自定义的View没有优化好,以上的情况都有可能造成卡顿,甚至是无响应当产生大量的垃圾时,GC回收大量垃圾的时候,也会造成卡顿Android每隔16ms就会重绘一次...原创 2019-04-06 20:52:47 · 2188 阅读 · 0 评论 -
性能优化-电量优化
电量的优化在app开发过程中,往往会被忽视,当在实际使用过程中,用户会很关心app的耗电量,耗电量高的应用会使用户对应用产生质疑,甚至卸载应用检测工具安装使用battery-historian来监测电量的情况,battery-historian时Google的一个开源项目具体安装过程参见:https://github.com/google/battery-historian当出现下列画面,...原创 2019-04-06 20:56:20 · 1450 阅读 · 0 评论 -
性能优化-屏幕常亮与CPU唤醒
Android在不使用的时候,屏幕在一段时间以后会变暗,再过一段时间就会熄屏,此时CPU就会休眠,那么在这个时候,Timer、Handler、Thread、Service等都会暂停,有时候我们需要屏幕常亮,有时候需要熄屏后CPU仍然运作,那么这就是本文记录的主题保持屏幕常亮最好的方式是在Activity中使用FLAG_KEEP_SCREEN_ON的Flagpublic class MainA...原创 2019-04-06 20:57:05 · 1992 阅读 · 0 评论 -
性能优化-Bitmap内存管理及优化
Bitmap作为重要Android应用之一,在很多时候如果应用不当,很容易造成内存溢出,那么这篇文章的目的就在于探讨Bitmap的有效运用及其优化缓存介绍当多次发送请求的时候,请求同一内容,为了使资源得到合理利用,那么就需要设置缓存,避免同一内容被多次请求在这里使用一个Http的缓存策略,对http自带的缓存策略做一个简单的使用介绍,从而引出今天的主角http自带缓存的使用前提:服务器设置...原创 2019-04-06 20:58:16 · 2339 阅读 · 0 评论 -
性能优化-图片压缩性能优化
前文介绍了系统的Bitmap处理方式,那么在这一节中来说一说一个第三方的开源库,又来解决图片压缩的问题话外题Android使用Bitmap处理图片,处理出来的JPEG图片质量略差,那么为什么会这样呢?这里有一个历史问题,当时skia开源引擎用来处理JPEG,Android也采用了这种引擎,然而对其做了阉割处理,也就是去掉了其中的哈夫曼算法,采用了定长编码算法,然而在解码的时候依旧使用了哈夫曼...原创 2019-04-06 20:59:33 · 2049 阅读 · 0 评论 -
性能优化-数据传输效率优化
客户端与服务端经常进行着频繁的数据传输,而数据传输又影响着用户体验,本文就传输速率的优化,提出合理的优化建议传统的传输方案在开始的时候,采用的是xml传输,这就要使用到Serializable/Parcelable序列化以及反序列化,其传输速度之慢,基本已经被遗弃,后来又出现了JSON序列化传输,其常用工具就是GSON和fastjson,但随着时代的进步,json也体现出了局限性json的局...原创 2019-04-06 21:02:30 · 4213 阅读 · 0 评论 -
性能优化-多线程优化
之前分析了AsyncTask源代码,那么在使用AsyncTask的过程中,又存在什么问题呢?AsyncTask使用存在的问题AsyncTask在使用过程中,容易出像两个问题其一:线程池容量不够,抛出异常java.util.concurrent.RejectedExecutionException其二:内存泄漏九以上两个问题,这里提出合理解决方案线程池容量不够抛出这里模拟出一个Asyn...原创 2019-04-06 21:03:12 · 2033 阅读 · 0 评论 -
性能优化-热修复
Android的新技术在不断更迭,各种bug修复也如火如荼,增量更新,插件化开发,热修复等等,数不胜数,这一节,就来盘点盘点热修复的来龙去脉热修复说明目前在热修复发面,国内众多公司都提出了解决方案,比较出名的例如阿里的Andfix,现在更新到到第三代,新名字叫做Sophix,腾讯的Tinker,饿了么的Amigo,美团的Robust等等,这里先做阿里和腾讯的例子,因为这两个热修复方案比较典型,...原创 2019-04-06 21:04:19 · 1651 阅读 · 0 评论 -
性能优化-service进程防杀
service作为后台服务,其重要性不言而喻,但很多时候service会被杀死,从而失去了我们原本想要其发挥的作用,在这种情况下我们该如何确保我们的service不被杀死就是本节需要讨论的内容了service的等级说明在了解service的等级说明以后,明白其生命周期,有助于我们更好的去做好服务常见的分类是将进程分成五个等级,等级越高越不容易被系统干掉,那么先来看一看进程都有些什么等级吧...原创 2019-04-06 21:05:04 · 1782 阅读 · 0 评论