IT技术博客大学习 共学习 共进步

Android开发

共 55 篇文章

IT 2016-03-23 13:54:21 / 累计浏览 2,051

提升进入界面的速度

这篇讲的是如何让Android应用的界面跳转变得更流畅。作者从一次实际的APP优化项目出发,指出一个常见的性能痛点:点开一个新页面却要等上几百毫秒,这种迟滞感虽然不会触发异常,却严重影响用户体验。 文章的核心方案非常清晰,即针对Activity生命周期中耗时的onPause和onCreate阶段进行优化。作者总结了四个具体的优化方向:对IO等耗时任务使用AsyncTask或Handler进行异步处理;精简布局文件层级,并对非首屏视图大胆使用ViewStub进行延迟加载;将动画、特定字体等资源初始化推迟到真正需要时;以及谨慎使用应用内多进程,因为进程创建本身就很耗时。 文章特别强调了两个容易踩坑的地方:一是像AnimationDrawable这样的资源既耗时又耗内存,初始化时机至关重要;二是不要迷信通用技巧,一切优化都要以实际测量数据为准。最终,持续的性能度量与分析,是保证界面流畅体验的关键。

IT 2016-03-23 13:52:50 / 累计浏览 1,549

Android各个Support Library介绍

这篇系统梳理了Android开发中不可或缺的Support Library。它开篇厘清了主工程、依赖包与android.jar的关系,解释了为何需要将新API封装成独立支持库——以便在不更新系统的情况下,让低版本设备也能用上高版本功能。 文章的核心是逐一介绍了从V4到V17的各个支持库。V4库最为基础和关键,它为Android 1.6及以上系统带来了Fragment、ViewPager、NotificationCompat等组件。V7库则针对Android 2.1及以上系统细分出多个模块,其中appcompat库让低版本实现Holo风格界面,而RecyclerView、CardView、Palette等库则提供了更现代的UI组件和功能。此外,还介绍了用于解决方法数超限的Multidex库、针对电视设备的v17 Leanback库,以及支持百分比布局的Percent库等。 对于开发者而言,这篇文章像一份清晰的地图,明确了在不同API Level需求下应该选择哪个支持库,以及每个库的核心能力,帮助解决碎片化兼容难题。

IT 2016-03-22 22:36:06 / 累计浏览 2,091

Android夜间模式实现

这篇讲的是如何利用Android的Theme机制,相对简单地实现夜间模式切换。作者从一个实际需求出发,通过一个小Demo演示了核心步骤。 核心思路是先在`res/values`中定义自己的属性名(比如背景色),然后为日间和夜间模式分别创建主题样式文件,为这些属性赋予不同的值。在布局文件中,控件通过`?attr/属性名`来引用这些值,而不是直接写死颜色。 实现动态切换的关键在于代码逻辑:在Activity中通过`setTheme()`方法切换主题,并且一定要在调用`setContentView()`之前执行。对于已经显示的界面,作者提供了一个简洁的刷新方法:直接调用`recreate()`重建Activity即可应用新主题,省去了手动重设所有视图的麻烦。 文章没有堆砌理论,而是聚焦于“定义属性 -> 创建主题 -> 引用属性 -> 动态切换”这条实用路径。最后也提醒了几个实现细节,比如自定义主题必须继承系统Theme以避免报错,确保切换过程流畅。

IT 2016-03-22 22:20:57 / 累计浏览 1,407

Android APP内存优化之图片优化

这篇讲的是作者在开发一款小学教育APP时,面对高分辨率设备上图片内存占用过大的实际挑战。在2K屏(2048×1536)上,单张背景图就能消耗12MB内存,频繁切换页面导致内存飙升至百兆级别。文章聚焦于这一痛点,分享了几项针对性的图片内存优化实践。 作者首先发现一个容易被忽视的细节:为Button设置selector背景会同时加载正常与按下两张图片,导致内存占用翻倍。解决方案是通过监听触摸事件动态切换背景,或使用setColorFilter实现反选效果,既节省内存也减小APK体积。其次,针对绘制大背景图时的界面卡顿问题,作者提出将背景绘制任务移至非UI线程,通过自定义的RootSurfaceView在SurfaceFlinger中完成渲染,从而避免阻塞主线程,提升了APP的流畅度。 这些方法均源于实际项目中的摸索,虽未深入底层原理,但提供了清晰、可落地的优化思路,特别适合处理图片密集型应用的内存与性能平衡问题。

IT 2016-03-22 22:16:22 / 累计浏览 1,570

Android性能测试工具列表

这篇文章系统梳理了Android开发中从启动、内存到帧率检测的各类性能工具。它不只罗列名称,而是解释了每个工具的核心用途和适用场景。 比如,通过adb命令行可以精确测量应用冷启动时间,其中“thisTime”仅反映当前Activity启动耗时,而“totalTime”则包含从搜索到启动的整个过程。对于内存问题,工具各有侧重:讯飞的iTest和Android Studio内置的内存监控能实时观察内存状态,识别泄漏与抖动;而LeakCanary则需集成到代码中,通过触发GC来主动捕获内存泄漏的详细堆栈。 文章还提及了腾讯的GT、网易的Emmagee等移动端一体化测试平台,以及如何利用Android 5.0以上系统原生的开发者选项进行性能剖析。最后,推荐了多个专注于Android性能优化的专业博客和Google官方的最佳实践指南,为读者提供了深入学习的方向。 这篇清单为开发者提供了一个从粗粒度监控到深度诊断的工具选择地图,帮助大家根据测试阶段和具体问题,找到最合适的“武器”。

IT 2016-03-22 18:36:44 / 累计浏览 2,828

Android系统开机启动流程及init进程浅析

这篇技术文章深入剖析了Android系统从上电到桌面的完整启动链路。它没有停留在概念介绍,而是将启动过程清晰地拆解为Boot Loader引导、Linux内核启动和Android系统初始化三个阶段,并特别聚焦于Linux内核如何启动第一个用户空间进程——init进程。 作者从内核的`start_kernel`函数开始,追踪了`rest_init`中如何通过`kernel_thread`创建1号内核线程`init`,随后详细分析了`kernel_init`函数的执行流程:等待`kthreadd`线程就绪、完成基础设备驱动初始化(`do_basic_setup`),最终执行用户空间的`/init`程序,从而转变成真正的init进程。init进程作为所有用户进程的“老祖宗”(进程号恒为1),负责挂载文件系统、解析`init.rc`配置,并拉起Zygote、ServiceManager等关键守护进程,是通向整个Android文件系统和应用世界的起点。 文章结合代码,条理清晰地展现了从底层硬件复位到高层系统服务就绪的齿轮咬合过程,对于理解Android启动的本质——即内核空间如何交接并催生用户空间——提供了非常扎实的线索。

IT 2016-03-22 16:24:00 / 累计浏览 1,207

Android中AIDL详细分析

这篇讲的是Android中AIDL机制的详细剖析。作者从AIDL(Android接口定义语言)的基础概念出发,清晰地区分了它在不同场景下的适用性:本地服务绑定、跨进程但单线程的Messenger方式,以及需要跨进程多线程处理时的核心选择——AIDL。 文章的核心价值在于梳理了开发者容易混淆的AIDL与bindService的关系,明确指出AIDL主要服务于远程服务绑定,并且出于代码复杂性考虑,官方并不推荐滥用。为了让理论落地,作者提供了一个完整的实例,手把手展示了从定义.aidl接口文件、实现服务端Stub类到客户端获取调用的全过程。其中对参数修饰符(in/out/inout)的解释尤为实用,点明了在自定义对象序列化传输时的关键细节。 文末附上了案例的完整源码结构图和下载地址,为读者提供了直接可运行的参考。对于需要在Android中进行跨进程通信,尤其是处理复杂数据交互的开发者而言,这篇文章提供了从原理到实践的完整指南。

IT 2016-03-21 23:22:03 / 累计浏览 1,107

一种动态为apk写入信息的方案

这篇讲的是如何动态、高效地给Android APK写入信息,以解决用户从H5页面或二维码下载APP后无法直接返回原页面的体验割裂问题。 作者发现APK文件本质是ZIP格式,而ZIP结构的中央目录文件头中有一个未被Android系统使用的“Comment”区域。利用这一特性,可以在不破坏APK完整性、不重新打包的前提下,直接向该区域追加自定义数据,从而实现信息的动态写入。 具体实现上,文章展示了如何通过Java API在APK末尾写入结构化的Comment数据,并在APP启动后读取这些数据。关键点在于自定义了数据长度的存储方式,以兼容早期Android版本。经过测试,被修改的APK可以正常安装,数据读取也准确无误。 这个方案的优势在于服务端操作仅为文件写入,效率极高,特别适合动态生成APK的场景。它能够无缝地将H5流量引回客户端,保持了用户体验的连贯性。

IT 2016-03-07 23:54:19 / 累计浏览 1,548

Android安全–ELF文件格式解析

这篇文章深入解析了Android安全中的核心——ELF文件格式。作者从ELF(可执行与可链接格式)的起源和三种目标文件类型(可重定位、可执行、共享目标)讲起,清晰地勾勒出这种二进制格式为程序链接和执行分别提供的“节区”与“段”两种并行视图。 文章的核心是对ELF文件结构的逐层拆解。它以Android NDK中的hello-jni.so文件为实例,详细剖析了ELF头部(包含魔数、文件类型、机器架构等关键标识)的数据结构与各字段含义,并进一步阐述了程序头部表(定义进程映像如何创建,如可加载段PT_LOAD)和节区头部表(描述代码、数据、符号表等链接信息)的作用。文中还贴心地指出了数据对齐规则等实现细节。 整篇文章逻辑清晰,结合了结构定义、字段注释和具体示例,将看似复杂的二进制文件组织方式讲得透彻明了。对于从事Android底层开发、安全分析或逆向工程的技术人员来说,这是一份扎实的ELF格式入门与参考指南,有助于理解从编译到链接再到加载运行的完整过程。

IT 2016-03-03 14:14:06 / 累计浏览 2,672

Android APK 签名文件MANIFEST.MF、CERT.SF、CERT.RSA分析

这篇讲的是Android APK签名中三个关键文件:MANIFEST.MF、CERT.SF和CERT.RSA的内部结构和作用。作者从一个已签名的APK入手,逐步解剖了这三个文件如何构成一个层层校验的“信任链”。 核心机制是“三明治”式的校验:MANIFEST.MF首先记录了APK内所有文件的SHA-1哈希值,确保每个资源文件的完整性;接着,CERT.SF文件不仅保存了MANIFEST.MF本身的哈希值,还对MANIFEST.MF中的每一项描述再次进行SHA-1计算并存储,这相当于对“清单的清单”进行了二次确认。最后,CERT.RSA文件则包含了用于验证上述所有哈希值的公钥和签名者证书信息,完成了整个数字签名的闭环。 文章不仅展示了每个文件的具体内容,还通过手动计算和使用OpenSSL工具生成密钥、提取证书等方式进行了实战验证,并引用了Android源码佐证。整个分析过程清晰地揭示了Android签名机制如何通过这种“文件哈希 -> 清单哈希 -> 对清单的签名”的三重保障,来确保应用的完整性与来源可信度。

IT 2016-02-16 20:53:22 / 累计浏览 1,789

安卓第三方应用调起常见问题

当Android开发者需要调起其他应用分享或登录时,常常会卡在“如何精确唤起目标页面”这一步。这篇讲的就是解决这个具体痛点。文章没有空谈理论,而是直接给出了核心代码——通过Intent明确指定ComponentName(即包名和Activity名),并辅以常用Activity的ACTION_MAIN和CATEGORY_LAUNCHER标志,确保能从桌面正常启动。 为了让开发者“拿来即用”,作者还贴心地列出了微博、微信、QQ等几个常用应用的具体包名和编辑界面Activity路径。这就像一份速查手册,省去了反复查阅官方文档的时间。 更进一步,文章考虑到了目标应用可能未安装的场景。它演示了两种方案:一是通过PackageManager遍历已安装列表来判断,二是利用Intent的URI Scheme(如`sinaweibo://`)进行直接调用,并最终通过Intent.createChooser提供一个“兜底”选择。如果App未安装,则自动跳转到对应的网页版,实现了体验上的优雅降级。 从直接调起到异常处理,这篇文章为开发者提供了一套清晰、可落地的实施步骤。

IT 2016-02-11 14:59:45 / 累计浏览 2,291

垃圾收集器选择

这篇讲的是JVM垃圾收集器的核心选择问题。作者从JDK版本演进切入,指出在串行收集器只适用于小数据量的前提下,真正的选择主要发生在并行收集器与并发收集器之间。 文章清晰地梳理了两者的定位与典型配置。吞吐量优先的并行收集器(如UseParallelGC),通过最大化处理器利用率来服务后台批处理任务,并提供了调整GC线程数、暂停时间及自适应策略等关键参数。而响应时间优先的并发收集器(如UseConcMarkSweepGC),则致力于最小化应用停顿,更适合在线服务场景。文章也具体指出了像-XX:+UseConcMarkSweepGC可能会导致-XX:NewRatio失效,以及如何通过参数处理并发收集器产生的内存碎片问题。 它不仅给出了“是什么”和“为什么”,更提供了“怎么配”的实战代码示例。无论你是在做科学计算需要高吞吐,还是运营在线系统要求低延迟,都能从中找到明确的调优方向和参数依据。

IT 2016-02-06 23:58:32 / 累计浏览 2,473

Spark的性能调优

这篇文章从实战经验出发,汇总了Spark性能调优的多个关键方向。内容不仅涵盖基础配置,更深入到应用代码设计与任务执行策略。 开篇即点明,调优的第一步往往从数据序列化开始,对比了默认的Java序列化与更快更紧凑的Kryo方案。紧接着是内存管理,文章给出了具体的检测方法(如使用UI或SizeEstimator)和优化建议(如启用压缩指针)。GC调优部分尤为实用,解释了默认内存分配比例、Eden区设置,并分享了如何避免因大量对象创建导致的“GC overhead limit exceeded”错误。 对于影响性能的关键因素,文章详细阐述了并行度、Reduce Task内存使用以及Shuffle的优化。例如,通过广播变量减少大表shuffle是一个经典模式。数据本地性的五个层级及其调度策略也被清晰说明。文件存储与读取优化(如使用Parquet列存格式)和Speculation(推测执行)机制也被纳入考量。 最后,文章强调了合理设置分区数和减少不必要Shuffle的重要性,并给出了具体的代码示例指引。整篇文章既包含JVM级别的参数调整,也涉及Spark应用层的数据结构设计与API选择(如prefetchByKey vs groupByKey),是一份从理论公式到实战经验的综合性调优指南。

IT 2016-02-06 23:51:04 / 累计浏览 2,835

Java数据库连接池小结

这篇讲的是Java数据库中一个非常实际的问题:如何高效管理数据库连接。文章从连接池解决的根本问题——减少重复创建连接的开销——说起,把连接池比作一个预先建好的“缓冲池”。 作者详细介绍了三种主流开源连接池:Apache出品的dbcp,它是Tomcat的默认选择;异步操作的c3p0,支持自动回收空闲连接,与Spring、Hibernate集成良好;以及带有监控功能的proxool,便于排查连接泄漏。 文章的核心在于对这三者进行性能与稳定性的实测对比。测试发现,在相同高并发条件下,性能排序大致为 proxool ≈ c3p0 ≥ dbcp。但在稳定性方面,结果恰好相反:dbcp表现最稳定,c3p0和proxool则略逊一筹。 结论很明确:如果你的应用面临高并发挑战,c3p0和proxool是更好的选择;而如果你更看重长期运行的稳定性和可靠性,dbcp依然是稳妥之选。这为不同场景下的技术选型提供了清晰参考。

IT 2015-12-13 21:56:38 / 累计浏览 3,694

网页与原生App如何交互

这篇讲的是网页与原生App之间那道“隐形的墙”是如何被打通的。作者从日常场景切入——比如用App时点击登录,瞬间唤起微信授权,无需输入密码——引出了核心问题:这种流畅的交互背后是什么技术在支撑? 文章以Android的Js2Java机制为例,剖析了WebView如何充当“桥梁”,让运行在网页端的JavaScript与原生App的Java代码能够互相调用。作者特别点出,虽然Java和JavaScript名字相似,但本质迥异,而WebView正是连接这两个世界的组件。通过这个桥梁,网页可以调用原生系统的电话、支付等能力,极大地丰富了H5页面的功能。 文章也指出了这是一把“双刃剑”:原生App开放的能力越多,网页的体验就越接近原生,但恶意页面也可能利用这些能力。因此,能力的开放需要精细的权限控制,就像微信那样,前端必须申请接口权限才能使用支付等功能。 最终,这种交互技术让开发者能取长补短:用网页的灵活性实现快速更新和运营,用原生组件提供流畅的核心体验(如支付),从而构建出体验更优的混合型应用。

IT 2015-11-08 22:32:55 / 累计浏览 2,308

QQ浏览器X5内核问题汇总

这篇整理自X5团队内部资料的清单,系统梳理了微信、QQ浏览器中使用的X5内核(基于Android 4.2 WebKit)常见的41个开发者问题与解决方案。文章以问答形式展开,覆盖了从布局渲染、脚本性能到多媒体播放、网络定位等广泛场景。 例如,它明确了为何使用iScroll.js局部滚动会卡顿(建议改用CSS overflow属性),解释了-webkit-filter和WebGL在当时的兼容性限制,并给出了定位失败时如何检查JS中timeout参数设置的排查路径。对于Canvas内存限制、Cookie的4KB截断、点击事件300ms延迟等底层机制,也提供了清晰的原理说明和应对建议。 文章最后透露,X5内核团队已启动基于Chromium的新版本预研,以提升标准支持和性能。这份详尽的“避坑指南”,对于至今仍在处理Android WebView碎片化兼容问题的前端与移动端开发者,依然具有直接的参考价值。

IT 2014-12-02 23:39:25 / 累计浏览 6,475

实时监控Android设备网络封包

这篇讲的是如何让Android设备的网络抓包变得像直接在电脑上用Wireshark一样实时。作者从传统流程(先用tcpdump抓包存文件,再传回PC分析)的繁琐出发,提出了一种更高效的方案。 核心原理很巧妙:利用tcpdump生成标准libpcap格式数据,通过管道实时重定向到一个网络端口,然后在电脑端用netcat工具接收数据流,最终直接喂给Wireshark进行解析。整个过程只需在设备上执行一条包含tcpdump和netcat的指令,并在主机上设置端口转发和Wireshark读取命令即可完成。 文章具体给出了关键命令,包括需要root权限执行的部分,以及对端口设置的提醒。对于不同系统(如Mac)可能需要的额外权限(sudo)也有提及。这种方法实现了近乎实时的网络流量监控,省去了文件中转的步骤,为Android网络调试提供了更直接、高效的工具链思路。

IT 2014-12-02 23:38:18 / 累计浏览 1,447

高性能Android Canvas游戏开发

这篇讲的是如何在Android平台的移动浏览器上,为Canvas游戏开发榨取极致渲染性能。文章核心观点是:性能优化的关键,在于理解并利用Android Canvas独特的硬件加速机制——它与iOS的实现原理有根本区别。 作者首先点明,移动设备性能往往只有桌面端的十分之一,优化至关重要。但直接套用iOS的优化方案(如大量使用Off-Screen Canvas进行缓存)在Android上会适得其反。原因在于,iOS依赖IOSurface进行高效的GPU位拷贝,而Android的硬件加速Canvas底层是一个GL Texture,频繁创建多个小Canvas会造成显存碎片化,且GPU上下文切换开销巨大。 因此,文章提出了明确的优化规则:第一,必须针对Android而非iOS的机制进行优化;第二,保持网页DOM树尽可能简单,以将系统资源更多留给Canvas渲染。这些规则均建立在对底层渲染架构差异的深刻剖析之上,为开发者提供了具体、可操作的高性能Android Canvas游戏开发指南。

IT 2014-11-26 23:01:20 / 累计浏览 2,805

分析Android ROM的生态状况

这篇讲的是Android ROM生态的演变与当前格局。作者从CyanogenMod的兴衰切入,用“跨越鸿沟”理论点明其仍属于极客小众圈子,进而揭示了ROM生态如今已明确分化为两大阵营。 文章核心梳理了“手机厂商深度定制”和“第三方ROM战略跟进”这两种模式。前者以MIUI、Flyme OS、ColorOS为代表,厂商们借ROM进行软硬件整合与差异化竞争,构建自家生态护城河。后者则更像一场流量入口争夺战,BAT等巨头或亲自下场(如云OS、百度云ROM),或通过投资(如腾讯投资乐蛙OS)来布局。文中不仅列举了各大ROM的演进路线,也分析了如tita项目搁浅、阿里云OS早期失误等案例背后的战略考量。 整体来看,作者认为ROM已从早期的刷机爱好者玩具,演变为手机厂商定义体验、互联网公司争夺移动端入口的关键战场。生态的分化,恰恰反映了不同玩家基于自身优势对“如何占据用户手机桌面”这一命题给出的不同答案。

IT 2014-09-15 14:11:40 / 累计浏览 5,481

近距离端详Android ART运行时库

这篇技术分析聚焦于Android平台从Dalvik虚拟机向ART运行时过渡的核心变革。文章从Google I/O大会的发布背景切入,指出传统Dalvik虚拟机在应对多核处理器、大内存等新硬件趋势时已显吃力,从而引出ART的诞生。 文章的核心,是将ART与Dalvik进行多维度对比。最关键的差异在于编译策略:ART采用预编译技术,在应用安装时一次性将字节码编译为本地机器码并存储,而Dalvik依赖于每次运行时的即时编译。这一改变带来了直接好处,例如性能测试显示代码执行效率可提升2到3倍,同时因减少了运行时编译开销而有助于延长设备续航。 另一个对比重点是垃圾回收机制。文章通过详实的日志对比了二者的表现:Dalvik的垃圾回收常导致数十甚至上百毫秒的停顿,引发明显的画面卡顿;而ART经过重新设计的垃圾收集器,能将这类停顿时间压缩到微秒级,卡顿现象得到极大改善。 文章也客观指出了ART的权衡之处,即首次安装或设备启动时的编译时间会变长,但这是用一次性的存储和时间成本,换取了应用运行期的长期性能收益。总体而言,这是一次为匹配现代硬件能力而进行的底层架构升级。