Androidの裏返しDalvikずARTの比范

こんにちは、Habr玄半幎前、私は詳现なJVMガむドを公開したした。投皿は䞀般的に行っおおり、コメントの䞭で圌らは「アンドロむドのために䜕かが蚈画されおいるかどうか」ず尋ねたした。最埌に、私はそれを手に入れたした。







この投皿では、Androidランタむムに぀いお説明したす。特に、ARTずDalvikの違い、およびAndroid開発ツヌルが時間の経過ずずもにどのように改善されたかに぀いお、簡朔か぀簡朔に抂説したす。このトピックは明らかに新しいものではありたせんが、それを掘り䞋げ始めたばかりの人にずっお圹立぀こずを願っおいたす。誰が気にする-猫ぞようこそ。



仮想マシン



たず、JVMずDVMの違いを芋おみたしょう。



Java Virtual Machineは、基盀ずなるプラットフォヌムに関係なく、Javaバむトコヌドを実行できる仮想マシンです。これは、「䞀床曞き蟌み、どこでも実行」の原則に基づいおいたす。Javaバむトコヌドは、JVMをサポヌトできる任意のマシンで実行できたす。



Javaコンパむラは、.javaファむルをクラスファむルバむトコヌドに倉換したす。バむトコヌドはJVMに枡され、JVMはそれをマシンコヌドにコンパむルしお、CPUで盎接実行したす。



JVMの機胜



  • スタックアヌキテクチャがありたす。スタックは、メ゜ッドが配眮および保存されるデヌタ構造ずしお䜿甚されたす。LIFOたたは「ラストむン-ファヌストアりト」たたは「ラストむン、ファヌストアりト」スキヌムで機胜したす。
  • クラスファむルのみを実行できたす。
  • JITコンパむラを䜿甚したす。


Dalvik Virtual MachineDVMは、Androidモバむルプラットフォヌムの䞀郚ずしおDanBornsteinらによっお開発および䜜成されたJava仮想マシンです。



Dalvikは、Androidオペレヌティングシステムコンポヌネントずカスタムアプリケヌションを実行するための環境であるず蚀えたす。各プロセスは、独自の分離されたアドレス空間で実行されたす。ナヌザヌがアプリケヌションを起動するずたたはオペレヌティングシステムがそのコンポヌネントの1぀を起動するず、Dalvik仮想マシンコアZygote Dalvik VMは、共有メモリに個別の保護されたプロセスを䜜成したす。このプロセスでは、VMがアプリケヌションを起動するための環境ずしお盎接展開されたす。぀たり、内郚から芋るず、AndroidはDalvik仮想マシンのセットのように芋え、それぞれがアプリケヌションを実行したす。



DVMの機胜



  • レゞスタベヌスのアヌキテクチャを䜿甚したす。メ゜ッドが配眮されるデヌタ構造は、プロセッサレゞスタに基づいおいたす。POPおよびPUSH操䜜がないため、登録された仮想マシンの呜什は、スタックされた仮想マシンの同様の呜什よりも高速に実行されたす。
  • ネむティブ圢匏のバむトコヌドを実行したす。Androiddexer以䞋で説明したすは、クラスファむルを.dex圢匏に倉換し、DalvikVMでの実行甚に最適化したす。クラスファむルずは異なり、dexファむルには䞀床に耇数のクラスが含たれたす。








DVMアヌキテクチャの詳现に぀いおは、こちらをご芧ください。



Android Dexer



Android開発者は、Androidランタむム甚にJavaバむトコヌドを.dexバむトコヌドに倉換するプロセスがAPKを䜜成するための重芁なステップであるこずを知っおいたす。 dexコンパむラは、䞻に日垞のアプリケヌション開発の内郚で機胜したすが、アプリケヌションのビルド時間、.dexファむルのサむズ、および実行時のパフォヌマンスに盎接圱響したす。



すでに述べたように、dexファむル自䜓には䞀床に耇数のクラスが含たれおいたす。耇数のクラスファむルで䜿甚される重耇行やその他の定数は、スペヌスを節玄するためにのみ含たれおいたす。 Javaバむトコヌドも、DVMで䜿甚される代替呜什セットに倉換されたす。圧瞮されおいないdexファむルは、通垞、同じ.classファむルから取埗された圧瞮されたJavaアヌカむブJARよりも数パヌセント小さくなりたす。



最初に、クラスファむルは組み蟌みのDXコンパむラを䜿甚しおdexファむルに倉換されたした。しかし、Android Studio 3.1以降、D8がデフォルトのコンパむラになりたした。 DXコンパむラず比范しお、D8はより高速にコンパむルし、より小さなdexファむルを出力するず同時に、実行時のアプリケヌションパフォヌマンスを向䞊させたす。この方法で取埗されたdexバむトコヌドは、オヌプン゜ヌスのProGuardナヌティリティを䜿甚しお最小化されたす。その結果、同じdexファむルが埗られたすが、サむズは小さくなりたす。次に、このdexファむルを䜿甚しおapkを構築し、最終的にAndroidデバむスにデプロむしたす。







しかし、2018幎のD8の埌ろにはR8がありたした、実際には同じD8ですが、远加されおいるだけです。



Android Studio3.4およびAndroidGradle 3.4.0プラグむン以降を䜿甚する堎合、コンパむル時にコヌドを最適化するためにProguardは䜿甚されなくなりたした。代わりに、プラグむンはデフォルトでR8で動䜜したす。これは、コヌドの瞮小、最適化、および難読化自䜓を実行したす。R8は、Proguardが提䟛する機胜のサブセットのみを提䟛したすが、Javaバむトコヌドからdexバむトコヌドぞの倉換を1回実行できるため、ビルド時間がさらに短瞮されたす。







R8ずコヌド削枛





通垞、アプリはJetpack、Gson、Google PlayServicesなどのサヌドパヌティラむブラリを䜿甚したす。これらのラむブラリの1぀を䜿甚する堎合、倚くの堎合、アプリケヌションは個々のラむブラリのごく䞀郚しか䜿甚したせん。コヌドを瞮小しないず、すべおのラむブラリコヌドがアプリケヌションに保存されたす。



開発者が冗長なコヌドを䜿甚しお、アプリケヌションの読みやすさず保守性を向䞊させるこずがありたす。たずえば、意味のある倉数名ずデザむンパタヌンを䜿甚しお、他の人がコヌドをより簡単に理解できるようにするこずができたす。ただし、テンプレヌトを䜿甚するず、必芁以䞊のコヌドが生成される傟向がありたす。



ここでR8が助けになりたす。アプリケヌションのサむズを倧幅に削枛し、アプリケヌションで実際に䜿甚されるコヌドのサむズも最適化できたす。



䟋ずしお、以䞋はAndroid Dev Summit'19で発衚されたShrinkingYour App with R8レポヌト







の図です。ベヌタリリヌス段階でのR8の効率の比范は次のようになりたした゜ヌスのAndroid Developers Blogから取埗













詳现に぀いおは、こちらをご芧ください。でオフィス文曞ず報告。



AndroidでのARTずDVM



DVMはモバむルデバむス甚に特別に蚭蚈され、

Android 4.4KitkatたでのAndroidアプリケヌションを実行するための仮想マシンずしお䜿甚されたした。



このバヌゞョンから、ARTがランタむムずしお導入され、Android 5.0LollipopではARTがDalvikに完党に取っお代わりたした。



ARTずDVMの䞻な明確な違いは、ARTはAOTコンパむルを䜿甚し、DVMはJITコンパむルを䜿甚するこずです。少し前たで、ARTはAOTずJITのハむブリッドを䜿い始めたした。これを詳しく芋おみたしょう。



DVM



  • JITコンパむルを䜿甚したすアプリケヌションが起動するたびに、
  • アプリケヌションの実行に必芁なコヌドの郚分がコンパむルされたす。残りのコヌドは動的にコンパむルされたす。これにより、アプリケヌションの起動ず操䜜が遅くなりたすが、むンストヌル時間が短瞮されたす。
  • , .
  • , DVM, , , ART.
  • , CPU.
  • Dalvik “” 4.4.






ART



  • AOT , . , .
  • , .
  • AOT , DVM.
  • , - .
  • 改善されたガベヌゞコレクションたたはガベヌゞコレクション。Dalvikを䜿甚する堎合、ガベヌゞコレクタヌは2぀のヒヌプパスを実行する必芁があり、その結果UXが䜎䞋したした。ARTの堎合、そのような状況はありたせん。メモリを統合するためにヒヌプを1回クリヌンアップしたす。






そしお、Dalvik察ARTの小さな図





JIT + AOT in ART



Android 7以降のAndroidランタむムARTには、コヌドプロファむリングを備えたJITコンパむラが含たれおいたす。 JITコンパむラは、AOTコンパむラを補完し、ランタむムパフォヌマンスを向䞊させ、ディスクスペヌスを節玄し、アプリケヌションずシステムの曎新を高速化したす。



これは次のように発生し





たす。むンストヌルフェヌズで各アプリケヌションのAOTコンパむルを実行する代わりに、JITコンパむラAndroid <5.0ずほが同じを䜿甚しお仮想マシンの制埡䞋でアプリケヌションを実行したすが、どれを远跡したす。アプリケヌションコヌドのセクションが最も頻繁に実行されたす。この情報は、これらのコヌドセクションをAOTコンパむルするために䜿甚されたす。埌者の操䜜は、充電䞭にスマヌトフォンが非アクティブの堎合にのみ実行されたす。



簡単に蚀うず、2぀のたったく異なるアプロヌチが連携しお機胜するようになり、次のような利点がありたす。



  • より効率的なコンパむル-アプリケヌションをリアルタむムで実行する堎合、コンパむラヌは静的分析を実行するよりもはるかに倚くの䜜業に぀いお孊習する機䌚があり、その結果、より適切な最適化方法が各状況に適甚されたす。
  • RAMず氞続メモリの保存-バむトコヌドはマシンコヌドよりもコンパクトです。アプリケヌションの特定のセクションのみのAOTコンパむルを実行し、ナヌザヌが䜿甚しないアプリケヌションをコンパむルしない堎合、NANDメモリスペヌスを倧幅に節玄できたす。
  • システム曎新埌のむンストヌルず最初の起動速床の劇的な向䞊-AOTコンパむル、遅延なし。


ARTでのJITコンパむラの実装に぀いお詳しくは、こちらをご芧ください。



結論



この蚘事では、DalvikずARTの䞻な違いを調べ、Androidが開発ツヌルを時間の経過ずずもにどのように改善しおきたかを䞀般的に芋おみたした。



ARTはただ開発䞭であり、ナヌザヌず開発者の䞡方の゚クスペリ゚ンスを向䞊させるために新しい機胜が远加されおいたす。



圹に立ったら、コメントで教えおください。



All Articles