Android系统优化从入门到精通

如何在Linux系统中获取Android源码

在Linux系统中,通常使用Ubuntu来下载和编译Android源码。由于Android的源码内容很多,Google采用了git的版本控制工具,并对不同的模块设置不同的git服务器,可以用repo自动化脚本来下载Android源码,下面介绍如何一步一步地获取Android源码的过程。图2-1 下载并同步Android源码
理论教育 2023-06-19

实现Android类动态加密优化技术

在加载APK文件和DEX文件时,使用了类动态加载技术。在Android应用开发过程中,通常常规的开发方式和代码架构就能满足我们的普通需求。如何让Android应用执行服务器上的不可预知的代码。如何对Android应用加密,而只在执行时自解密,从而防止被破解。例如,在使用标准Java虚拟机时,经常自定义继承自ClassLoader的类加载器。DexClassLoader和PathClassLoader其实都是通过类DexFile实现类加载功能的。不过坚信的是,Dalvik或Android开源项目都正在向能够支持raw数据定义类的方向努力。
理论教育 2023-06-19

编译Android程序的两种实践演练演示

为了使读者更加深入地理解在Linux环境下编译Android程序的方法,在接下来的内容中,将分别演示两种编译Android程序的方法。这是Android Makefile的标准命名,不能更改。文件Android.mk的格式和内容可以参考其他已有的Android.mk文件的写法,针对helloworld程序的Android.mk文件内容如下。回到Android源代码顶层目录进行编译。
理论教育 2023-06-19

构造Adapter时不习惯使用缓存的convertView

初始时,ListView会从BaseAdapter中根据当前的显示布局实例化一定数量的view对象,同时ListView会将这些view对象缓存起来。由此可以看出,如果不使用convertView,而是每次都在getView()中重新实例化一个View对象的话,不但浪费资源,而且也浪费时间,也会使得内存占用越来越大。
理论教育 2023-06-19

COSIX虚拟机异常处理的设计和实现分析

动态建立异常处理语句的数据结构链表。当产生异常时,异常处理程序根据产生该异常的指令位置及其产生的异常类型,在方法异常表中查找符合这两个条件的异常处理句柄。异常处理程序在进行异常处理时,将异常分为两大类,即内部异常与外部异常。当虚拟机检测到异常时,其触发异常程序的执行。
理论教育 2023-06-19

加载APK文件和DEX文件

具体来说有如下两点优化工作:对于预置应用:Android会在系统编译后,生成优化文件,以ODEX后缀结尾,这样在发布时除APK文件外,还有一个相应的ODEX文件。如果在使用APK文件的过程中不发生变化,则就不会重新生成DEX文件,这样便加快了以后的启动速度。图6-13显示了这几部分内容在DEX文件中的布局。原来每个CLASS文件中的常量池,在DEX文件中由一个常量池来统一管理。图6-14 dx工具整合CLASS文件的过程具体到DEX文件,经过dx工具优化后的内部逻辑如图6-15所示。
理论教育 2023-06-19

工具推荐:Android内存泄露检测

在开发应用过程中,可以使用现成的工具来查看内存泄露情况。有关DDMS的知识在本章前面的内容中已经介绍过了,在接下来将讲解MAT工具的基本知识。MAT是Memory Analyzer Tool的缩写,是一个Eclipse插件,同时也有单独的RPC客户端。例如,打开一个.hprof文件后的界面如图4-14所示。图4-13 分析界面从图4-13中可以看到MAT的大部分功能,具体说明如下。换句话说,retained size是该对象被GC之后所能回收到内存的总和。
理论教育 2023-06-19

Android系统中的强指针:RefBase类解析

在Android系统中,强指针使用的引用计数类是RefBase,类RefBase比类LightRefBase要复杂。但是其功能和类LightRefBase一样,也提供了incStrong和decStrong成员函数来操作它的引用计数器。类RefBase与类LightRefBase的最大区别是,它不像类LightRefBase一样直接提供一个整型值来维护对象的引用计数。所以在类RefBase的具体实现中,强引用计数和弱引用计数功能是通过其成员变量mRefs提供的。在类RefBase中,其成员变量mRefs的类型为weakref_impl指针。用如下标记标识的部分,表示类weakref_impl被编译成非调试版本。
理论教育 2023-06-19

Java语言和虚拟机的异常处理机制

Java语言在设计上与C++有许多相同之处,它的异常处理机制基本上沿袭了C++的规则。Java的异常处理语句及抛出异常语句与相应的C++的语句完全一样,它的异常处理是静态绑定的,没被处理的异常是沿着方法调用栈向上传播,异常处理完毕后程序的执行点转移到异常处理句柄的下一条语句。Java与C++不同的是Java具有完善的异常类定义,Java的异常类可分为三大类:Error、一般异常及RuntimeException。
理论教育 2023-06-19

Binder机制的上下文管理者——ServiceManager

在Android系统中,Service Manager负责告知Binder驱动程序它是Binder机制的上下文管理者。Service Manager是整个Binder机制的保护进程,用来管理开发者创建的各种Server,并且向Client提供查询Server远程接口的功能。Service Manager在用户空间的源码位于“frameworks/base/cmds/servicemanager”目录下,主要是由文件binder.h、binder.c和service_manager.c组成。图3-2 Service Manager在Binder机制中的基本执行流程在Service Manager的入口在文件service_manager.c中,主函数main的代码如下。结构体binder_state定义在文件frameworks/base/cmds/servicema-nager/binder.c中,代码如下。这表示Service Manager的句柄为0,Binder通信机制使用句柄来代表远程接口。
理论教育 2023-06-19

如何最大限度地避免创建对象?

对象在声明时的技巧例如在使用Vector的过程中,经常声明一个Vector对象,但是不定义其初始大小。当我们创建一个Vector对象时,当它的容量多于我们所声明的大小时,Vector会默认先生成一个两倍大小的新的Vector,然后再将原Vector中的内容复制一份到新Vector。由此可以总结道,应该尽可能的避免创建短期的临时对象。
理论教育 2023-06-19

D绘图的基本优化方法

基本优化原则如下:不要在项目的交互过程中分配内存,尽量预先分配好,像写C一样写Java。并且尽量减少函数调用,“gl.gl**”这类的函数调用Java本地接口,会比较耗时。单线程和双线程的选择。内置的GLSurfaceView会创建一个新的线程来更新场景及编制场景。对于只有一个CPU的Android手机来说,会使用分时多线程的方式提升处理效率,在处理时需要操作线程本身还有线程之间的Context Switch上的消耗。
理论教育 2023-06-19

如何防止内存泄漏?

内存泄漏是指由于疏忽或错误,造成程序未能释放已经不再使用的内存的情况。内存泄漏会因为减少可用内存的数量从而降低计算机的性能。内存泄漏可能不严重,甚至能够被常规的手段检测出来。在以下情况,内存泄漏导致较严重的后果。内存泄漏在操作系统内部发生。内存泄漏在系统关键驱动中发生。
理论教育 2023-06-19

如何优化main.xml布局文件?

图5-11 文件main.xml的UI结构视图此时可以很明显的看到由红色线框所包含的结构出现了两个framelayout节点,这说明这两个意义完全相同的节点造成了资源浪费,那么如何才能解决呢?将上边XML代码中的FramLayout换成merge,布局文件main2.xml的具体实现代码如下:此时程序运行后,与在模拟器中显示的效果是一样的,通过Hierarchy Viewer查看会发现UI结构是有变化的,如图5-12所示。图5-12 UI结构视图此时原来多余的FrameLayout节点被合并在一起了,即将标签中的子集直接加到Activity的FrameLayout根节点下。
理论教育 2023-06-19

Windows平台获取Android源码的方法

在Windows平台上获取源码和Linux平台原理相同,但是需要预先在Windows平台上面搭建一个Linux环境,此处需要用到Cygwin工具。图2-2 启动Cygwin图2-3 选择从网络下载安装单击“下一步”按钮,选择安装根目录,如图2-4所示。图2-8 更新工具列表图2-9 依次下载工具为了确保能够安装上述工具,一定要用鼠标双击,变为Install形式。建议读者在下载Android源码时,严格按照官方提供的步骤进行,地址是:http://source.android.com/source/downloading.html。图2-12 在Windows中用Cygwin工具下载Android源码的截图
理论教育 2023-06-19
-已经加载完成-