六木Sir
六木Sir
# Android媒体开发:Bitmap实践指南 **文章目录** - 一 Bitmap内存管理 - 二 Bitmap质量压缩 - 2.1 实现方法 - 2.2 实现原理 - 三 Bitmap尺寸压缩 - 3.1 邻近采样 - 3.2 双线性采样 本篇文章用来介绍Android平台的图像压缩方案以及图像编解码的通识性理解,事实上Android平台对图像的处理最终都交由底层实现,篇幅有限,我们这里不会去过多的分析底层的细节实现细节,但是 我们会提一下底层的实现方案概览,给向进一步扩展的同学提供一些思路。 在介绍Bitmap之前,我们先要了解一下和压缩相关的图像的基本知识,这也可以帮助我们理解Bitmap.java里定义的一些变量的含义。 像素密度 >像素密度指的是每英寸像素数目,在Bitmap里用mDensity/mTargetDensity,mDensity默认是设备屏幕的像素密度,mTargetDensity是图片的目标像素密度,在加载图片时就是 drawable...
# Android虚拟机框架:Java类加载机制 **文章目录** - 一 类文件结构 - 二 类加载机制 - 三 类加载器 这篇文章我们来聊一聊关于Android虚拟机的那些事,当然这里我们并不需要去讲解关于虚拟机的底层细节,所讲的东西都是大家平常在开发中经常用的。例如类的加载机制、资源加载机制、APK打包流程、APK安装流程 以及Apk启动流程等。讲解这些知识是为了后续的文章《大型Android项目的工程化实践:插件化》、《大型Android项目的工程化实践:热更新》、《大型Android项目的工程化实践:模块化》等系列的文章做一个 原理铺垫。 好了,让我们开始吧~😁 ## 一 类文件基本结构 >Class文件是一组以8位字节为基础的单位的二进制流,各个数据项按严格的顺序紧密的排列在Class文件中,中间没有任何间隔。 这么说有点抽象,我们先来举一个简单的小例子。🤞 ```java public class TestClass { public int sum(int a,...
# Android内存框架:内存管理 ## 一 Android内存管理流程 Android内存的管理流程如下所示: 1. ActivityManagerService负责根据各种策略算法计算进程的adj值,也就是进程的优先级评分,它告诉内核这些进程的优先级是怎样的,内核根据这些优先级就行进程的kill和内存的回收。 2. Linux内核内存管理系统根据进程的adj值进行进程的管理。 >Java与C++之间有一堵由内存动态分配和垃圾收集技术围成的高墙,墙外的人想进去,墙里的人想出来。 ## 内存结构 Java虚拟机在执行程序的时候会将内存划分为若干个不同的区域,这些区域有各自的用途以及创建、销毁时间,有些区域随着虚拟机进程启动而启动,有些则依赖用户线程的启动和结束 而建立和销毁。 Java虚拟机运行时的内存结构如下图所示: - 方法区:线程共享,用于存储已被虚拟机加载的类信息,常量,静态变量以及及时编译器编译后的戴拿等数据。方法区还有个别名叫"非堆"。 - 堆:线程共享,Java虚拟机管理的内存区域中最大的一块,在虚拟机启动时创建,该区域的作用是存放对象实例。 - 虚拟机栈:线程私有,生命周期与线程相同,虚拟机栈描述Java方法执行的内存模型,每个方法在执行时都会创建一个栈帧,栈帧用于存储局部变量表,操作数 栈,动态链接,方法出口等信息,每个方法从调用到结束就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 - 本地方法栈:线程私有,它与虚拟机栈十分相似,相对于虚拟机栈为Java方法服务,本地方法栈为Native方法服务。 - 程序计数器:空间较小,每个线程私有,当前线程所执行字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器来选择下一条需要执行的字节码指令。 如果执行的是Java方法,则该计数器记录的是正在执行的虚拟机字节码指令的地址;如果是Native方法,则计数器的值为空。 ### 内存分配...
# Android进程框架:进程的创建、启动与调度流程 **文章目录** - 一 进程的创建与启动流程 - 二 进程的优先级 - 三 进程的调度流程 Android系统的启动流程如下图(点击查看大图)所示: Loader层 1. 当手机处于关机状态时,长按电源键开机,引导芯片开始从固化在Boot ROM里的预设代码开始执行,然后加载引导程序Boot Loader到RAM。 2. Boot Loader被加载到RAM之后开始执行,该程序主要完成检查RAM,初始化硬件参数等功能。 Kernel层 3. 引导程序之后进入Android内核层,先启动swapper进程(idle进程),该进程用来初始化进程管理、内存管理、加载Display、Camera Driver、Binder Driver等相关工作。 4. swapper进程进程之后再启动kthreadd进程,该进程会创建内核工作线程kworkder、软中断线程ksoftirqd、thernal等内核守护进程,kthreadd进程是所有内核进程的鼻祖。 Native层 5....
# Android包管理框架:APK的打包流程 **文章目录** - 一 资源的编译和打包 - 二 代码的编译和打包 Android的包文件APK分为两个部分:代码和资源,所以打包方面也分为资源打包和代码打包两个方面,这篇文章就来分析资源和代码的编译打包原理。 APK整体的的打包流程如下图所示: 具体说来: 1. 通过AAPT工具进行资源文件(包括AndroidManifest.xml、布局文件、各种xml资源等)的打包,生成R.java文件。 2. 通过AIDL工具处理AIDL文件,生成相应的Java文件。 3. 通过Javac工具编译项目源码,生成Class文件。 4. 通过DX工具将所有的Class文件转换成DEX文件,该过程主要完成Java字节码转换成Dalvik字节码,压缩常量池以及清除冗余信息等工作。 5. 通过ApkBuilder工具将资源文件、DEX文件打包生成APK文件。 6. 利用KeyStore对生成的APK文件进行签名。 7. 如果是正式版的APK,还会利用ZipAlign工具进行对齐处理,对齐的过程就是将APK文件中所有的资源文件举例文件的起始距离都偏移4字节的整数倍,这样通过内存映射访问APK文件 的速度会更快。 上述流程都是Android Studio在编译时调用各种编译命令自动完成的,具体说来,如下所示: 1....
# Android系统应用框架篇:Service组件在进程内的绑定流程 本篇文章我们来分析Service组件在进程内的绑定流程。 在分析具体的绑定流程之前,我们先简单回忆Service组件绑定的用法。 1 定义一个Activity,它将要绑定一个Service组件运行后台任务。 ```java public class ClientActivity extends AppCompatActivity { private IServerService serverService; private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service)...
# Android系统应用框架篇:Service启动流程 本篇文章分析Service组件在新进程内的启动流程。 启动Service组件的流程如下所示: ``` 1 向ActivityManagerService发送一个启动Service组件的请求。 2 ActivityManagerService发现用来运行Service组件的进程不存在,它会先保存Service组件的信息,接着再创建一个新的应用进程。 3 新的应用进程创建完成后,就会向ActivityManagerService发送一个启动完成的进程间通信请求,以便ActivityManagerService可 以继续执行启动Service组件的的操作。 4 ActivityManagerService将第2步保存的Service组件信息发送给新床架的应用进程,以便它可以将Service组件启动起来。 ``` 新进程中启动Service组件序列图 #### 1 Activity.startService(Intent service) 当我们在Activity里调用startService(Intent service)方法时,它实际上在调用ContextWrapper.startService(Intent service)。 #### 2 ContextWrapper.startService(Intent service) ```java public class...
AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,它主要包含以下内容: ``` 1 声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,他们各自的实现类,各种能被处理的数据和启动位置。 2 指定权限permissions 3 指定安全控制和测试instrumentation ``` 三、各个节点的详细介绍 上面就是整个am(androidManifest).xml的结构,下面以外向内开始阐述~~ 1、第一层():(属性) A、xmlns:android 定义android命名空间,一般为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。 B、package 指定本应用内java主程序包的包名,它也是一个应用进程的默认名称 C、sharedUserId 表明数据权限,因为默认情况下,Android给每个APK分配一个唯一的UserID,所以是默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preference方法,第二种就可以采用sharedUserId了,将不同APK的sharedUserId都设为一样,则这些APK之间就可以互相共享数据了。详见:http://wallage.blog.163.com/blog/static/17389624201011010539408/ D、sharedUserLabel 一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义 E、versionCode 是给设备程序识别版本(升级)用的必须是一个interger值代表app更新过多少次,比如第一版一般为1,之后若要更新版本就设置为2,3等等。。。 F、versionName 这个名称是给用户看的,你可以将你的APP版本号设置为1.1版,后续更新版本设置为1.2、2.0版本等等。。。...
# 附录:Activity启动流程 Activity启动流程序列图 Activity启动流程结构图 ### 1 Launcher.startActivitySafely(Intent intent, Object tag) ```java /** * Default launcher application. */ public final class Launcher extends Activity implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher { void...