dalvik

Android源码分析一 Android系统架构

夙愿已清 提交于 2020-05-09 12:20:38
一 Android系统架构 Linux内核层(Linux Kernel) :Android系统基于Linux2.6内核,这一层为Android设备各种硬件提供了 底层驱动 ,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等; 硬件抽象层(android hardware abstraction layer) :安卓驱动硬件的方式与Linux不尽相同。传统Linux的驱动完全存活于内核空间。Android则在内核外部增加了硬件抽象层(HAL, Hardware Abstraction Layer),把一部分驱动功能放到HAL层中。安卓为什么费尽麻烦增加一个HAL呢?为了保护源代码。Linux内核采用了GPL协议,所以硬件生产商想要支持Linux系统,必须遵照GPL协议公开硬件驱动的源代码。但这些源代码中包含有许多硬件的设计信息,牵涉到硬件生产商的核心利益。而增加了HAL层之后,硬件厂商就不需要开放所有的驱动代码了。 系统运行库层(libraries) :这一层通过一些C/C++库( so库 )来为Android系统提供了主要的特性支持。如SQLite库提供了数据库支持,OpenGL ES库提供了3D绘图支持,Webkit库提供了浏览器内核支持等; 应用框架层(application framework) :这一层主要提供构建应用程序时可能用到的各种 API

Android 性能优化资源汇总 2020 版

徘徊边缘 提交于 2020-05-08 15:38:56
近期做 Android 性能优化,整理了部分性能优化的开发资源,先发布出来,后续会在这个 git仓库 更新,感兴趣的网友可以关注下。 以下是初稿: 网站博客 以组织或人为单位的教程资源: Android 官方教程,关于 性能优化的主题 , 中文翻译 Android Developers Android 官方开发者频道 微信终端开发团队博客,公众号 WeMobileDev ,也可访问 腾讯云专栏 Facebook Android 专栏 《性能之巅》作者 Brendan D.Gregg 的网站 ClassShark 作者 Boris Farber 的 个人网站 androidperformance 博客文章目录 markzhai’s home BlockCanary 作者的博客 Trinea 的性能优化系列文章 Deep into Android 里面源码剖析和性能总结文章不错 书籍培训 相关书籍 《性能之巅:洞悉系统、企业与云计算》 Linux 系统优化必看的书,Andoid 开发者可从中借鉴性能优化工具和思路 《Android移动性能实战》 腾讯SNG专项测试团队 2017 年出的性能优化案例集锦,基本都是手Q、手空和 QQ音乐的实际例子 《移动App性能评测与优化》 腾讯TMQ专项测试团队 2016 年出的实战案例精选,还讲了 GT 的使用 《高性能Android应用开发》 AT

2018年Android面试题含答案--适合中高级(下)

半世苍凉 提交于 2020-05-05 12:04:21
1、Activity生命周期? onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy() 2、Service生命周期? service 启动方式有两种,一种是通过startService()方式进行启动,另一种是通过bindService()方式进行启动。不同的启动方式他们的生命周期是不一样. 通过startService()这种方式启动的service,生命周期是这样:调用startService() --> onCreate()--> onStartConmon()--> onDestroy()。这种方式启动的话,需要注意一下几个问题,第一:当我们通过startService被调用以后,多次在调用startService(),onCreate()方法也只会被调用一次,而onStartConmon()会被多次调用当我们调用stopService()的时候,onDestroy()就会被调用,从而销毁服务。第二:当我们通过startService启动时候,通过intent传值,在onStartConmon()方法中获取值的时候,一定要先判断intent是否为null。 通过bindService()方式进行绑定,这种方式绑定service,生命周期走法:bindService--

Android-App性能优化

北城以北 提交于 2020-05-03 18:44:35
上一篇我们讲了java的引用机制,今天我们来一下和它有关的app性能优化(其实也不是很大)。 性能优化的目标 在网上也看到过很多相关的文章,他们基本总结为:快,稳,省,小,描述的很准确.如下图 (注:此图不知道啥时候收集的,如有侵权,立删): 快 如何让app在运行过程过不卡顿,运行流畅,速度快,也就是说如何解决卡顿呢?我们先看看那些因素影响卡顿? 1. UI,包括ui的绘制,刷新等 2. 启动,包括冷启动,热启动,温启动等 3. 跳转,页面跳转,前后天切换 4. 及时反馈,点击事件,滑动,系统事件 UI 这个涉及到android的系统显示原理,我们简单了解一下: Android 显示过程可以简单概括为:Android 应用程序把经过测量,布局、绘制后的 surface 缓存数据,通过 SurfaceFlinger 把数据渲染到显示屏幕上, 通过 Android 的刷新机制来刷新数据。也就是说应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层服务,系统层服务通过刷新机制把数据更新到屏幕上。 换一种方式说:Android 系统每隔 16ms 发出 VSYNC 信号,触发对 UI 进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需的 60FPS。(注:FPS 表示每秒传递的帧数。)在理想情况下,60 FPS 就感觉不到卡

移动端测试===Android内存泄露和GC机制(转)

懵懂的女人 提交于 2020-05-02 03:54:18
本文转自:https://www.testwo.com/article/1153 1、前言 Hello,小伙伴们,相信大家在项目测试中都遇到过内存泄露问题,小编也着实爬过很多坑。比如小编所测项目,更换了多实例版本的sdk,横竖屏切换后有MapView没有销毁,导致内存泄露。小编测试手表项目,因为手表内存有限,测试中常遇到应用无响应或者闪退,故而小编对GC机制进行了进一步学习了解。 本文先对Android内存垃圾回收机制进行介绍,之后对分析、定位内存泄露常用的测试方法进行总结,分享给大家。 2、Android内存垃圾回收(GC机制) 2.1综述 Android 应用中默认有三个线程:“main”主线程、GC线程、和Heap线程 ,而且在GC线程运行的过程中,主线程会中断执行。Java程序与C/C++等原生程序的一个不同点就是,Java虚拟机在运行Java程序的过程中,可以自动回收不再使用的对象实例,从而避免了程序员人工管理内存的繁琐工作。如果设备是单核CPU设备,一次只能运行一个线程,因此在GC线程运行的时候,必须中断主线程。但是如果设备上有多核CPU,即主线程可以和GC线程同时运行,在这种情况下执行GC,会不会中断主线程呢?答案是会的。 虽然有不同的内存垃圾回收实现算法,但有些算法需要中断其他Java线程的执行,如果中断的时间过长,给用户的感觉就是应用的响应速度变的越来越慢

浅谈 maxMemory , totalMemory , freeMemory 和 OOM 与 native Heap

ε祈祈猫儿з 提交于 2020-04-28 09:09:18
作者:林冠宏 / 指尖下的幽灵 掘金: https://juejin.im/user/587f0dfe128fe100570ce2d8 博客: http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities 回答内存管理类面试问题可以说出下面这些内容,加分。 前言: 站在巨人的肩膀上,总结此文。 目录: Java runtime 三个计算内存函数 OOM 的说法,为什么大型游戏能申请那么多内存? 如何绕过dalvikvm heap size的限制 ? Bitmap分配在native heap还是dalvik heap上? 1,Java runtime 三个计算内存函数: maxMemory 获取当前 APP 最大能够申请的内存,在 Java Heap 部分。 totalMemory 获取当前 APP 已经从系统拿到的内存,包含使用上了的和没有用上的,因为一般申请会申请多一部分,它总是慢慢按需要从系统拿取。 freeMemory 获取当前 APP 拿到的内存中,还没用上的,即是可以被 gc 回收的。 计算此刻 APP 在 Java Heap 层次已经使用了的内存

使用JavaFX构建部署安卓应用

懵懂的女人 提交于 2020-04-24 17:01:36
Java平台最初的目标是为嵌入式设备提供一个软件环境。然而,历史的怪圈却让Java成为了企业软件开发的首选语言。过去,Java的客户端应用所受到的关注比利润丰厚的服务器端市场要少得多。不过,现在Java平台已经拥有了强大的客户端组件——JavaFX,可用于开发桌面、平板电脑、移动和嵌入式系统上的应用程序。本文将为读者展示如何在Android设备上部署JavaFX应用程序。任何致力于客户端开发的软件平台都需要有一套创建用户界面的方法。AWT(抽象窗口工具包)曾经被看作是Java平台用户界面的根基。一些更高级的工具包(例如Swing)在一定程度上都是以AWT为基础的。自从1995年Java首次发布,AWT就是Java平台的一部分,现在看来,其设计原则已经相当陈旧,无法与当今的硬件和软件能力相匹配。新的Java客户端组件,JavaFX,是在充分汲取了Java领域以及其他UI框架的经验后,重新设计而成。JavaFX的关键原则之一就是要尽可能地充分利用硬件(如GPU)资源。实际上,如今的用户界面所需的工具包必须是高响应并且高性能的。能够让JavaFX应用运行在iOS和Android平台上是至关重要的。如今,越来越多的应用程序不仅需要能够在桌面电脑上运行,也需要能够在移动设备和平板电脑上运行。用三种语言编写同一应用的三种版本的代价相当昂贵:一个桌面版本,一个iOS版本和一个Android版本

面试常问点:深入剖析JVM的那些事

 ̄綄美尐妖づ 提交于 2020-04-22 01:53:53
文章较长,主要讲解了JVM的整个流程,其次介绍Dalvik与JVM的区别及ART Class文件结构 -> JVM内存模型 -> 类加载器 -> 类加载过程 -> 类的引用方式 -> 内存分配策略 -> GC -> 对象的引用类型 -> 类卸载 先前知识 众所周知java是一种跨平台的语言,但实际上跨平台的并不是java而是JVM。 JVM(Java Virtual Machine)是一种虚拟机,用来将由java文件编译成的class字节码文件再编译成机器语言,供机器识别。有了JVM中间人的存在就不需要直接与操作系统打交道,且不同的操作系统有不同的JVM,于是就屏蔽了操作系统间的差异,从而使java成为跨平台语言。 DVM又是什么? Dalvik Virtual Machine简称DVM也是一种虚拟机,是专门为Android平台开发的,它与JVM是有差别的。 Dalvik基于寄存器,而JVM 基于栈。性能有很大的提升。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。 寄存器的概念 寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC),在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC) 栈的概念 栈是线程独有的

android引入jar的一个错误

試著忘記壹切 提交于 2020-04-17 03:41:36
【推荐阅读】微服务还能火多久?>>> 使用eclipse+sdk开发android的app,如果要引入一个jar包,可以放到./libs/xxx.jar路径下就可以了。今天引入一个aaa.jar的包,也放到./libs/aaa.jar路径下。app编译没有问题,但一运行就如下的错误: [2018-09-21 15:48:39 - HelloAndroid] Dx UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000) ... ...while parsing xxxx.class [2018-09-21 15:48:39 - HelloAndroid] Dx 1 error; aborting [2018-09-21 15:48:39 - HelloAndroid] Conversion to Dalvik format failed with error 1 google之后,分析原因千奇百怪。有说是jdk版本问题,连续装了3个版本都不行。有说是proguard问题。总之,都不能解决。 后来的解决方式是: 删除libs目录下的aaa.jar包 project->properties-

java.lang.NoClassDefFoundError: org.apache.batik.dom.svg.SVGDOMImplementation

倖福魔咒の 提交于 2020-04-14 08:14:32
问题 I'm having weird trouble with Apache Batik library linked to my Android&LibGDX project. But let's start from beginning, in IntelliJ Idea I have a project which contains three modules: Main, Android and Desktop. "batik" library which I highlighted contains: And there is some code in "Main" module which is used in Android&Desktop modules: String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser); Following code is used to