精通安卓性能优化-第三章(一)

Android开发初期之后怎么提升?怎么才能叫精通?方向在哪? 1. Android开发初期之后怎么提升? 首先第一个问题:Android开发初期之后怎么提升?说到这个问题,就不得不先搞清楚 “为什么很多人会一直停留在两三年的水平上,而后一直在重复以往的经验,原地踏步?” 我认为最主要的一个原因就是这部分开发者缺乏主观能动性,或者说缺乏能支撑你坚持学习的兴趣。如果你对Android开发没有太大的兴趣,那么还是尽早换方向吧。有了兴趣,然后就是要有一个比较正确的钻研路线,不要这也搞那也抓,最后什么都知道点,但也就只是知道点儿。 一个很好的例子就是我们平时在开发过程中都会用 阅读详情

第三章 NDK进阶

第二章告诉你如何使用Android NDK建立一个工程和怎样在Android应用中使用C/C++代码。在许多情况下,这就够了。然而,当需要更加优化的时候需要挖的更深一些。

在本章,你将亲自动手,学习如何使用一个低级语言去利用CPU提供的所有的优势,而不是仅仅使用普通的C/C++。本章的第一部分演示了使用汇编优化函数的几个例子和ARM指令的概述。第二部分GCC编译器支持的C扩展,可以用来提升应用的性能。最终,给出了使代码相对快一些的几个简单结论。

最新的Android NDK支持armeabi、armeabi-v7a和x86,本章将聚焦于前两个,因为Android大多数在基于ARM的设备上开发。如果你计划写汇编代码,ARM是你的首选。尽管第一台Google TV设备是基于Intel的,Google TV不支持NDK。

汇编

NDK允许在Android应用中使用C/C++。第二章展示了在C/C++代码编译后的native代码看起来是什么样的,你怎么使用objdump –d去反汇编一个文件(object文件或者库)。比如,computeIterativelyFaster的ARM汇编代码在Listing 3-1给出。

Listing 3-1 computeIterativelyFaster的C实现的ARM汇编代码



除了允许在应用中使用C/C++,NDK同样允许你直接写汇编代码。直接的讲,这个特性不是NDK独有的,因为汇编代码被GCC编译器支持。Android NDK使用了GCC编译器。结果,在本章学习的几乎所有的东西可以同样应用到其他的工程,比如iOS应用。

就像你看到的,汇编代码非常难以阅读,更不要说写了。然而,能够理解汇编代码可以让你容易的识别瓶颈,因此可以更容易的去优化你的应用。它也可以给你吹牛的权利。

为了熟悉汇编,我们看3个简单的示例:
(1) 计算最大公约数
(2) 转换颜色格式
(3) 8位数平均值的并行计算

这些例子对刚刚接触汇编的开发者来说是足够简单的,而且他们展现了汇编优化的重要原则。因为这些例子仅告诉你可用指令的一部分,在后面有完整的ARM指令集介绍以及uberpowerful ARM SIMD指令的主要介绍。最终,你将学习如何动态的检测CPU功能是否可用,这是一个强制的步骤,因为在你应用中这些功能不是在所有的设备上面都是可用的。

最大公约数

两个非零整数的最大公约数(Greatest common divisor)是可以被这两个数整除的最大的正整数。比如,10和55的最大公约数是5。在Listing 3-2中给出了两个整数的最大公约数计算的一个实现。

Listing 3-2 最大公约数的简单实现

unsigned int gcd (unsigned int a, unsigned int b)
{
    // a、b的绝对值必须不同(否则,无限循环)

    while (a != b)
    {
        if (a > b) 
        {
            a -= b;
        } else {
            b -= a;
        }
    }

    return a;
}

如果在Application.mk中定义了APP_ABI,比如你的应用支持x86、armeabi、armeabi-v7a,将会有三个不同的库。反编译3个库将得到不同的汇编代码。然而,因为armeabi和areambi-v7a你可以选择编译成ARM或者Thumb模式,实际上总共有5段代码要review。

TIP:从NDK r7开始可以定义APP_ABI为all(APP_ABI := all),而不是分别指定每个ABI。当一个新的ABI被NDK支持的时候,只需要执行ndk-build就可以了,不需要修改Application.mk。

Listing 3-3给出了x86的汇编代码,Listing 3-4给出了ARMv5的汇编代码,Listing 3-5给出了ARMv7的汇编代码。因为不同版本的编译器会产生不同的代码,你得到的代码可能会和这里稍有不同。产生的代码也会依赖于优化级别和定义的其他选项。

Listing 3-3 x86汇编代码



如果你熟悉x86助记符,可以看出这段代码大量使用了jump指令(jne, jmp, je, jb)。同样的,大多数指令是16位的(比如, “f3 c3”),有些是32位的。

NOTE: 保证使用正确版本的objdump去反编译object files和libraries。比如,使用arm的objdump去反编译x86的object文件将会得到如下的信息:
arm-linux-androideabi-objdump: Can’t disassemble for architecture UNKNOWN!

Listing 3-4 ARMv5汇编代码(ARM模式)


Listing 3-5 ARMv7a汇编代码(ARM模式)


事实证明,在ARM模式下GCC编译器为armeabi和armeabi-v7a产生了相同的代码,如Listing 3-2所示。这不总是正确的,因为编译器经常利用在更新的ABI定义的新指令。

因为你可以决定在Thumb模式下编译代码而不是arm模式,我们来看在Thumb模式下产生的代码。Listing 3-6给出了ARMv5的汇编代码(Application.mk的armeabi ABI),Listing 3-7给出了ARMv7汇编代码(Application.mk的armeabi-v7a ABI)。

Listing 3-6 ARMv5汇编代码(Thumb模式)


Listing 3-6中所有的指令是16位的(即”e7f4”, 列表中的最后一条指令),因此12条指令需要24字节的空间。

Listing 3-7 ARMv7汇编代码(Thumb模式)


这一次,两个listing是不同的。ARMV5使用Thumb指令集(所有指令都是16位),ARMV7架构支持Thumb2指令集,指令可以是16位的或者32位的。
事实上,Listing 3-7很像Listing 3-5。主要的不同是Listing 3-7的ite(if-then-else)指令,ARM代码占40字节,而Thumb2代码占28字节。

NOTE: 尽管ARM架构是有优势的,阅读x86汇编代码没有什么坏处。

通常情况下,GCC编译器做的很好,不需要担心产生的代码。然而,如果你写的一段C/C++代码被证实是应用的一个瓶颈,就需要认真的阅读编译器产生的汇编代码,决定是否你需要自己去写汇编代码。编译器通常产生高质量的代码,你不会做到更好。也就是说,在某些情况下,装备指令集知识既有熟悉和轻微的痛苦,你可以达到比编译器更好的效果。

NOTE:考虑修改C/C++代码去达到更好的性能通常是比写汇编代码更加简单。

gcd函数实际上可以不同的实现,代码不仅可以更快也更加紧凑。如Listing 3-8所示。

Listing 3-8 手写汇编代码


不包括用来从函数返回的最后一条指令,核心的算法仅用4条指令实现。测量结果表明这种实现方式比较快。注意Listing 3-8中的一条CMP指令的调用,和Listing 3-7中的两条进行比较。

这段代码可以复制到一个文件,命名为gcd_asm.S,并且添加到Android.mk的编译列表里面。因为这个文件使用ARM指令,显然它不可以x86 ABI为目标。结果,Android.mk需要保证这个文件是编译列表的一部分,当它和ABI兼容的情况下。Listing 3-9演示了如何去修改Android.mk。

Listing 3-9 Android.mk


因为gcd_asm.S已经使用汇编代码写了,结果object文件会和源文件非常相似。Listing 3-10给出了实际的反汇编代码,反汇编代码几乎和源代码相同。

Listing 3-10 gcd_asm的反汇编代码


NOTE: 汇编在有些情况下可能会替换一些指令,所以你可能仍然观察到你写的代码和反汇编的代码的一点差别。

通过简化汇编代码,我们得到了更好的结果而没有使维护更加复杂。

安卓ROM开发入门到精通 包含内容: 第一期主要为ROM开发,ROM定制技术资料,提供一些工具为主 ,让你学会简单做包,和基本的ROM DIY技巧,偶尔附加一些必要的教程。第二期针对ROM技术教程,细分知识点,重点剖析、解释,形成一系列的知识文档供查阅,目前大纲已列出,可以教你从零开始做包。 1.第一期---技术资料(维护更新): 更新日志: 1.书籍-Android系统级深入开发——移植与调试 2.开发工具-And... 阅读详情

相关推荐

Android/JAVA性能优化:从入门到精通(万字讲解!!!)

在当今快速发展的移动应用市场中,用户体验是决定应用成功与否的关键因素之一。无论是在Android还是其他平台上,应用的性能表现直接影响用户的满意度和应用的市场竞争力。作为开发者,掌握Java性能优化的技巧不仅能够提升应用的流畅度,还能延长应用的生命周期,从而在激烈的市场竞争中脱颖而出。本文将从内存管理、线程与并发、代码优化、网络优化、数据库优化等多个方面,深入探讨Java性能优化的策略和技巧,帮助开发者在实际开发中提升应用性能,优化用户体验。提示:以下是本篇文章正文内容,下面案例可供参考。

学无止境 1222

linux调试工具集

除了GDB以外,linux还提供了很多的内存调试工具: 注意:以下工具的使用之前,gcc需要使用-g编译出带符号的elf 1) addr2line 用于将可执行文件的虚拟内存地址或者动态库的偏移量转换成函数以及代码行。 动态库的偏移量计算方式:将虚拟内存地址减去/proc/pid/maps中该动态库的虚拟内存起始地址 示例: addr2line -C -f -e xxx.elf 0x123...

fish的专栏 8966

android游戏开发从入门到精通,androidstudio插件开发

如果基础知识有太多不会的就危险了,必须好好准备,这是躲不过的。这个阶段有不会的很正常,因为对方正在确定你的水平,但态度一定要积极主动,即使之前没有研究过,也要结合一些经验说出推测的结果,切忌直接说“我不会”。我只贴上我写过内容的链接,剩下的朋友们去网上一搜,或者去买本书看下就好了,建议看 《Java 编程思想》,不仅解答了 What 还有探讨 Why。我这次面试算法问的比较少,只手写过插入排序,建议把冒泡、插入、归并时间复杂度和实现熟悉熟悉,最好手写下,不然现场手写的时候容易出错。

2401_84408418的博客 1419

objdump命令解析

objdump objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。   参数选项:  --archive-headers  -a  显示档案库的成员信息,类似ls -l将lib*.a的信息列出。  -b bfdname  --target=bfdname  指定目标码格式。这不是必须的,objdump能自动...

u014770486的专栏 4254

从零到精通:Android开发学习路径全解析

Android开发作为移动互联网核心技术之一,其技术栈经历了从基础SDK到现代架构的演进。理解Android系统架构需要扎实的Java/Kotlin基础,掌握Activity生命周期、UI组件等核心概念。在进阶阶段,开发者需要关注性能优化、架构设计等关键技术,如内存管理、MVVM模式实现等。通过项目实践和源码阅读,开发者可以深入理解Binder机制、AMS等底层原理。本文以知名博主stormzhang的学习路径为例,系统梳理了从Java基础到Flutter跨平台的完整学习框架,为移动开发者提供了一条清晰的技

weixin_34326558的博客 268

Android面试指南与参考答案——基于领星安卓开发职位要求

本文基于领星安卓开发职位要求,整理Android开发岗位常见面试问题与参考答案。核心内容包括:1.基础知识:Android四层架构、SDK组件及API使用;2.编程语言:Kotlin优势、Jetpack组件应用及MVVM/MVP架构对比;3.开发工具:性能优化方法及版本适配策略;4.实战经验:第三方SDK集成和APP发布流程。针对1-3年经验者及应届生,提供代码示例和项目实例说明,覆盖框架搭建、性能优化等关键技术点,帮助候选人系统准备面试,突出技术能力和问题解决思维。

郑伟强dev的专栏 1192

arm-linux-gcc交叉工具链的安装和使用

1、安装arm-linux-gcc交叉工具链 [root@localhost Denny]# ls arm-linux-gcc-4.3.2.tgz  Desktop  gcc  kernel     modules      shell实验  smb.conf  tftp安装包  wireshark软件包 at_remind.c              file     gdb  make

马道人生 1万+

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

Linux内核栈调试

Linux内核栈调试dump_stack现象原因分析oops信息寄存器信息应用层信息调用栈关系objdump反汇编内核编译反汇编命令分析   Linux内核驱动调试经常遇到定位困难的问题,除了在代码之间添加log(printk/dev_info等)以外,还可以借助栈(stack)信息定位到代码。 dump_stack 现象 原因   内核打印栈信息的常见原因有: oops崩溃:常见问题有空指针、内存访问越界等 dump_stack函数:需要头文件linux/kprobes.h和asm/traps.h

u014414101的博客 2904

遥感数据处理之MCD19A2数据的处理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 这一段时间一直在做modis气溶胶产品——MCD19A2这个数据的处理工作,总结了一些东西,在这里分享一下。 modis数据一般可以用MCTK和MRT这两个工具进行处理,下面先介绍一下用这两种工具处理MCD19A2的流程: 先解众惑:为什么使用MCD19A2数据处理出来的结果会有3个或4个或5个波段。 这里使用HDF Exploer这个软件,下载链接 1.使用MCTK处......

weixin_42176976的博客 1万+

Python3.11安装fairseq避坑指南:解决dataclasses兼容性问题(附详细代码修改)

本文详细解析了在Python 3.11环境下安装Fairseq时因dataclasses模块规则变更导致的安装失败问题。通过定位核心配置文件,将`default=SomeConfig()`修改为`default_factory=SomeConfig`,并调整依赖版本,提供了从源码修改到环境验证的完整解决方案,确保Fairseq顺利运行。

weixin_29098367的博客 494

Android从入门到精通

全书共分15章,内容包括Android快速入门、Android模拟器与常用命令、用户界面设计、高级用户界面设计、基本程序单元Activity、Android应用核心Intent、Android事件处理、资源访问、图形图像处理技术、多媒体应用开发、Content Provider实现数据共享线程与消息处理、Service应用、网络编程及Internet应用和基于Android的家庭理财通。[Android.游戏开发入门](美)Mario.Zechner.插图版.pdf。

github_38514857的博客 878

一款值得关注的开源企业管理ERP系统

盒木ERP是一款开源的现代化企业管理系统,采用前后端分离架构,后端基于Python+Django,前端使用Vue+Ant Design。系统涵盖采购、销售、库存、财务等核心业务模块,支持移动端操作和PDA扫码。具有开源免费、技术先进、功能完善等特点,适合中小企业使用或二次开发。项目提供详细部署指南,支持Docker容器化部署,是学习ERP系统开发和企业数字化转型的优秀选择。

1104

想学Android开发,是否必须精通Java?

想学Android开发,必然需要先精通Java,其次c++,再后面是kotlin,基本代码上系统源码framework层面都是java和c++,基本上找不到任何kotlin,源码中只有几个简单app使用是kotlin。在这里,我为大家整理了一些列Android学习资料,有需要的朋友可以扫描下方二维码,获取更多相关资料。

Eqiqi的博客 1988

基于PSINS的INS/NHC/ODO组合导航仿真全解析

组合导航通过多传感器融合克服单一导航系统的局限,是车辆自主定位的关键技术。其中惯性导航(INS)依靠陀螺仪与加速度计积分推算运动状态,但误差随时间累积;GNSS提供绝对位置,却在城市峡谷中易受多径效应和遮挡影响导致定位漂移。卡尔曼滤波作为信息融合核心,将不同量测按统计特性加权,实现优势互补。基于PSINS开源工具箱搭建的SINS/GNSS/ODO/NHC组合导航仿真,能够在GNSS失锁条件下利用非完整约束和里程计抑制惯性误差发散,广泛应用于无人驾驶、物流车辆自主定位等场景。本文围绕PSINS仿真环境,详细拆

weixin_29044713的博客 253

C++实现设计ATM机系统

这个示例实现了一个基本的ATM机系统,支持注册、登录、存款、取款、查询余额和保存数据等功能。当然,这只是一个简单的ATM机模拟,实际的ATM机系统需要更复杂的逻辑和更严格的安全措施。C++编写一个简单的ATM机系统,我将提供一个基本的实现示例,但由于ATM机系统的复杂性和安全性要求,这只是一个简单的模拟,不适合在实际环境中使用。试设计一简单模拟ATM机系统,系统以菜单方式工作,采用自定义函数设计各功能模块被主菜单调用,使之能提供以下基本选项。=========欢迎使用ATM=========

走向CTO的路上... 1241

android性能优化从入门到精通

什么是性能优化 一款app除了要有强大的功能和交互外,在性能上也应该追求更高的要求,这样才能更好的提高用户体验 优化目的 性能指标 优化的方向 更快 流畅性 启动速度页面响应速度响应速度 更稳定 稳定性 避免出现应用崩溃(crash)避免出现应用无响应(ANR) 更省 资源节省性 内存大小安装包大小耗电量网络流量 优化详解 速度优化 内存优化 数据结构优化:数据结...

qq_23081779的博客 1765

《MPDIoU:边界框回归的高效革新与YOLOv8集成实战指南》

摘要: MPDIoU(多优先级距离IoU)通过引入中心距离、形状差异和尺度变化的三步优化策略,解决了传统IoU在目标检测中的尺度敏感、收敛低效和场景局限问题。相较于GIoU、DIoU等主流方法,MPDIoU在精度、速度和鲁棒性上实现全面提升,尤其在复杂场景和小目标检测中表现突出。通过代码集成和训练优化,MPDIoU在YOLOv8中显著提升COCO数据集AP指标,并在智能安防(密集行人检测)和工业质检(微小缺陷定位)等垂直领域验证了其应用价值。未来研究方向包括动态权重调整和多模态融合,进一步拓展边界框回归的精

m0_64661770的博客 158

精通安卓游戏开发(一)

这本书是学习高级 Android 应用开发的实用指南。本书帮助掌握 Android 的核心概念,并在实际项目中快速应用知识。在整本书中,创建了一个应用,并在每一章中不断进化,以便读者可以轻松地跟随并吸收概念。本书分为十二章。前三章专注于应用的设计,解释了设计的基本概念以及 Android 中使用的编程模式。接下来的几章旨在改进应用,访问服务器端以下载要在应用中显示的信息。一旦应用功能完成,它将使用 Material Design 组件和其他第三方库进行改进。

龙哥盟 475

【小白深度教程 1.3】使用 BP-Net 深度补全网络,进行 KITTI 稠密点云和图像融合(Depth Completion 实战)

在上一节中,我们展示了如何将从激光雷达获取的稀疏点云(深度)映射到图像。因此这篇论文我们尝试使用 Depth Completion(深度补全)技术,来将稀释的点云深度,补全为稠密深度。

2401_87064292的博客 1198

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android性能优化:从入门到精通

本文从基础知识、优化方法和实战案例分析三个方面,详细介绍了Android性能优化的方法和技巧。性能优化是Android开发中不可或缺的一部分,对提升用户体验具有重要意义。开发者应掌握性能优化的基础知识,合理运用优化方法,以实现应用的高性能表现。未来,随着移动设备的性能不断提升,性能优化将更加重要。开发者需要关注新的优化技术和工具,不断更新优化策略,以满足用户对高性能应用的需求。同时,性能优化也需要与用户需求相结合,避免过度优化,确保应用的平衡发展。持续关注新技术。

2501_92486623的博客 357

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

QtScrcpy安卓投屏完整攻略:从入门到精通

还在为手机屏幕太小而烦恼吗?想要在大屏幕上畅玩手游却不知从何下手?QtScrcpy这款开源安卓投屏工具正是你需要的解决方案!它能将手机屏幕实时投射到电脑,支持键盘鼠标操作,让你彻底告别触摸屏的局限。 ## 🎯 为什么选择QtScrcpy? **传统投屏痛点**: - 连接复杂,步骤繁琐 - 延迟高,画面卡顿 - 不支持键鼠操作 - 无法多设备管理 **QtScrcpy优势对比**: ✅ *

gitblog_00510的博客 3万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android面试官:你究竟有多大的勇气,在简历上写了“精通”?

自定义 View 可以让我们产生更好的效果,app UI 美观,交互界面友好,用户青睐,用户留存率高,这就是app成功的第一步了。高级UI与自定义View有着不可分割的联系。自定义View其实并不难,为什么呢?因为自定义View无非就是显示+交互:显示由 onMeasure ->onLayout->onDraw的整个流程就将显示整个流程处理完了,而交互则是touch事件的处理;另外其他的一切你比如Canvas,Animation,Paint都是围绕着draw来进行的,所以我们需要搞懂其中的根本原理。

the shy 127

精通安卓应用开发(一)

本书是学习高级 Android 应用开发的实用指南。本书帮助掌握 Android 的核心概念,并在实际项目中快速应用知识。在整本书中,创建了一个应用,并在每一章中进化,以便读者可以轻松地跟随并吸收概念。本书共分为十二章。前三章主要关注应用的设计,解释了设计的基本概念以及在 Android 中使用的编程模式。接下来的章节旨在改进应用,访问服务器端以下载应用中要显示的信息。应用功能完成后,将使用 Material Design 组件和其他第三方库进行改进。在结束之前,为应用添加了额外服务,如位置服务、分析、崩溃

龙哥盟 445

精通安卓性能优化-第三章(三)

ARM指令 ARM指令是丰富的。Table 3-1给出了可用的ARM指令列表,每个给出了一个主要的描述,但不包括每个指令的详细信息。 如果你熟悉这些指令,你将了解到他们中的一些会比其他的使用更多,尽管不常用的那些指令经常是可以显著提升性能的。比如,ADD和MOV指令几乎是无处不在的,而SETEND指令不常用(当你需要去访问不通字节序的数据的时候,它是一个必须的指令)。

路漫漫 其修远 1250
上一篇: 精通安卓性能优化-第二章(五)
下一篇: 精通安卓性能优化-第三章(二)
北冥_有鱼
博客等级 码龄19年 14粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值