Android:What is ART?

背景:Android4.2之前,安卓手机系统的应用程序均在Dalvik Java的虚拟机上运行,这种运行模式还要依靠一个编译器来实现与应用程序的沟通。应用程序每次运行时,都需要将程序内的代码转变为机器码才能运行,这无形中多附加了一道手续,这就造成了手机耗电相对较快,占用内存大,用久了会卡顿的现象。

前言:KitKat(奇巧巧克力):雀巢的巧克力棒产品,最近Google宣布最新4.4版Android将命名为"KitKat"

One of the greatest features of Android 4.4.x KitKat, also probably the most under-reported one, is the next generation Android RunTime (ART).

翻译:Android4.4.x KitKat 最显著的特征之一就是下一代的Android Run Time(ART),或许也是下一个即将被广为关注的特征

What is ART?

翻译:什么是ART? (艺术)

When you start any apps on your Android device, the system actually takes some time and effort to compile the app package to machine code so your device can understand and execute. It does this Just in Time of execution. So as you run apps on your device, it actually keeps doing these resource intensive tasks in the background and this is a major reason why people notice Android apps are a bit sluggish when compared to their iOS counterparts.

翻译:当你在你的Android设备上启动任意app程序,系统都会耗费一些时间和精力(资源)去把该app包文件编译成机器码,以便你的设备可以理解并运行。这个过程在程序运行时执行。所以当你在你的设备上运行你的app程序,事实上,在后台也同时运行着这些很耗费资源的任务。这也是和苹果IOS系统相比,在Android系统上运行app程序会让人感觉的有些缓慢的主要原因。
This is, until you switch to the new Android RunTime (ART).

翻译:这个问题会一直存在,除非你换到新的Android Run Time。

With ART enabled, machine code compilations are done Ahead of Time during app installation. So when you run apps on your device, it can skip all that and simply executes the code directly.
翻译:在ART启用的情况下,机器码的编译会在app程序安装过程中提前编译完成。这样当你在你的设备上运行你的app程序,它可以跳过编译的过程,直接运行编译好的机器码。

The result? Reports show that ART yields performance improvements of around 10% to 20% on average. On the other hand it also boosts battery life because your device now does a lot less resource intensive machine code compiling. Take into considerations ART is currently a preview technology in Android 4.4.x KitKat so it can only get better and better in upcoming Android releases.

翻译:这样做的结果是什么呢?报告显示ART使得操作性能平均提高10%到20%。而另一方面,这也延长了电池的使用时间。因为现在你的设备大大减少了执行编译机器码这一耗费资源的行为。考虑到ART目前只是运用在Android4.4.X KitKat版本上,因此在未来发布的Android版本中ART只会越来越好。


英文原文截取自: http://www.mobilehiddencamera.com/

翻译时间:2014年6月23日


import android.media.MediaPlayer import android.os.Bundle import android.os.Handler import android.os.Looper import android.widget.ImageButton import android.widget.SeekBar import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView class MainActivity : AppCompatActivity() { private lateinit var mediaPlayer: MediaPlayer private lateinit var songList: RecyclerView private lateinit var btnPlayPause: ImageButton private lateinit var btnPrev: ImageButton private lateinit var btnNext: ImageButton private lateinit var seekBar: SeekBar private lateinit var currentSongTitle: TextView private lateinit var currentArtist: TextView private lateinit var currentTime: TextView private lateinit var totalTime: TextView private val handler = Handler(Looper.getMainLooper()) private var isPlaying = false private var currentSongIndex = 0 private var songs: MutableList<Song> = mutableListOf() private val updateSeekBar = object : Runnable { override fun run() { if (::mediaPlayer.isInitialized) { seekBar.progress = mediaPlayer.currentPosition currentTime.text = formatTime(mediaPlayer.currentPosition) handler.postDelayed(this, 1000) } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化视图 initializeViews() // 初始化播放器 mediaPlayer = MediaPlayer() // 加载歌曲 loadSongs() // 设置适配器 setupRecyclerView() // 设置按钮监听器 setButtonListeners() // 设置SeekBar监听器 seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { if (fromUser && ::mediaPlayer.isInitialized) { mediaPlayer.seekTo(progress) } } override fun onStartTrackingTouch(seekBar: SeekBar?) {} override fun onStopTrackingTouch(seekBar: SeekBar?) {} }) // 播放第一首歌 if (songs.isNotEmpty()) { playSong(songs[0]) } } private fun initializeViews() { songList = findViewById(R.id.songList) btnPlayPause = findViewById(R.id.btnPlayPause) btnPrev = findViewById(R.id.btnPrev) btnNext = findViewById(R.id.btnNext) seekBar = findViewById(R.id.songProgress) currentSongTitle = findViewById(R.id.currentSongTitle) currentArtist = findViewById(R.id.currentArtist) currentTime = findViewById(R.id.currentTime) totalTime = findViewById(R.id.totalTime) } private fun loadSongs() { val titles = resources.getStringArray(R.array.song_titles) val artists = resources.getStringArray(R.array.song_artists) val resources = resources.obtainTypedArray(R.array.song_resources) for (i in titles.indices) { songs.add( Song( id = i, title = titles[i], artist = artists[i], resourceId = resources.getResourceId(i, 0) ) ) } resources.recycle() } private fun setupRecyclerView() { songList.adapter = SongAdapter(songs) { song -> currentSongIndex = song.id playSong(song) } } private fun setButtonListeners() { btnPlayPause.setOnClickListener { if (isPlaying) { pausePlayback() } else { startPlayback() } } btnPrev.setOnClickListener { playPrevious() } btnNext.setOnClickListener { playNext() } } private fun playSong(song: Song) { mediaPlayer.reset() mediaPlayer = MediaPlayer.create(this, song.resourceId) mediaPlayer.setOnPreparedListener { seekBar.max = mediaPlayer.duration totalTime.text = formatTime(mediaPlayer.duration) startPlayback() } currentSongTitle.text = song.title currentArtist.text = song.artist } private fun startPlayback() { if (::mediaPlayer.isInitialized && !mediaPlayer.isPlaying) { mediaPlayer.start() isPlaying = true btnPlayPause.setImageResource(R.drawable.ic_pause) handler.post(updateSeekBar) } } private fun pausePlayback() { if (::mediaPlayer.isInitialized && mediaPlayer.isPlaying) { mediaPlayer.pause() isPlaying = false btnPlayPause.setImageResource(R.drawable.ic_play) handler.removeCallbacks(updateSeekBar) } } private fun playNext() { currentSongIndex = (currentSongIndex + 1) % songs.size playSong(songs[currentSongIndex]) } private fun playPrevious() { currentSongIndex = if (currentSongIndex == 0) songs.size - 1 else currentSongIndex - 1 playSong(songs[currentSongIndex]) } private fun formatTime(milliseconds: Int): String { val totalSeconds = milliseconds / 1000 val minutes = totalSeconds / 60 val seconds = totalSeconds % 60 return String.format("%d:%02d", minutes, seconds) } override fun onDestroy() { super.onDestroy() handler.removeCallbacks(updateSeekBar) if (::mediaPlayer.isInitialized) { mediaPlayer.release() } } }
11-12
内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值