{"id":20961,"date":"2014-08-18T10:45:14","date_gmt":"2014-08-18T09:45:14","guid":{"rendered":"https:\/\/www.inovex.de\/\/?p=49"},"modified":"2014-08-18T10:45:14","modified_gmt":"2014-08-18T09:45:14","slug":"the-oat-of-the-art","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/","title":{"rendered":"The OAT of ART"},"content":{"rendered":"<p>This is the second part of a small series of articles about the newest Android Version: <strong>Kitkat,<\/strong> that I wrote at inovex GmbH. In this part we will take a closer look at the new fileformat: OAT of the ART runtime and have a brief look at the garbage collection Diggin deeper: OAT file analysis. So far we found out that the system runs a kind of compilation on the device itself. It converts not only the apps but also huge parts of the android framework to oat files. In this post we\u2019ll try to figure out what this oat-thingies are and how they are executed.<!--more--><\/p>\n<p>As mentioned before, all installed apps run through the dex2oat compilation. Now let&#8217;s have a closer look at the resulting files.<\/p>\n<p>So let&#8217;s adb pull one of the dex2oat results, for example the converted result of the SystemUI.apk:<\/p>\n<pre class=\"lang:sh decode:true \">\/data\/dalvik-cache\/system@priv-app@SystemUI.apk@classes.dex<\/pre>\n<p>The handy <span class=\"lang:sh decode:true crayon-inline \">file<\/span> comand returns:<\/p>\n<pre class=\"lang:sh decode:true \">system@priv-app@SystemUI.apk@classes.dex: ELF 32-bit LSB shared object, ARM, version 1 (GNU\/Linux), dynamically linked, stripped<\/pre>\n<p>Wow.. that escalated quickly! With ART we go from java to class to dex to oat, which is a shared object!<\/p>\n<p>Further analysis with objdump shows the following:<\/p>\n<pre class=\"lang:sh decode:true \">system@priv-app@SystemUI.apk@classes.dex: file format elf32-little\n\nDYNAMIC SYMBOL TABLE: 00001000 g DO .rodata 0007d000 oatdata 0007e000 g DO .text 000a9f8f oatexec 00127f8b g DO .text 00000004 oatlastword<\/pre>\n<p>Only three symbols are defined: Metadata, execution start and end.<\/p>\n<p>Obviously the new runtime handels apps as shared objects (!) which were dynamically loaded into the VM-context (which is very likely to be the previously explained boot-image). A look into the sources reveals that they actually use <span class=\"lang:default decode:true crayon-inline \">dlopen()<\/span> to load the libraries during runtime.<\/p>\n<p>Now lets use the new oatdump to gain some more knowledge over the oat file format. My first attemp was to use oatdump at the boot-image file <span class=\"lang:sh decode:true crayon-inline \">\/data\/dalvik-cache\/system@framework@boot.art@classes.dex<\/span>. But it turned out that a whole dump of this file is about 1.6 GB in size, which is quite unhandy for the kind of analysis which I\u2019m trying to do.<\/p>\n<p>Therefore, I wrote a small App with almost no functionallity, but which is simple enough to understand how this OAT thing works. Here is the source code:<\/p>\n<pre class=\"lang:java decode:true \">package de.inovex.arttest;\n\nimport android.os.Bundle;\n\nimport android.app.Activity;\n\nimport android.view.Menu;\n\npublic class MainActivity extends Activity {\n\n@Override protected void onCreate(Bundle savedInstanceState) {\n\nsuper.onCreate(savedInstanceState);\n\nsetContentView(R.layout.activity_main);\n\nint a = 100;\n\na = foo(a);\n\n}\n\nprivate int foo(int a) {\n\nreturn a+4711;\n\n}\n\n@Override public boolean onCreateOptionsMenu(Menu menu) {\n\ngetMenuInflater().inflate(R.menu.main, menu);\n\nreturn true;\n\n}\n\n}<\/pre>\n<p>After installation, we can pull it\u2019s compiled version on our host and execute objdump on it:<\/p>\n<pre class=\"lang:sh decode:true \">data@app@de.inovex.arttest.apk@classes.dex: file format elf32-little\n\nDYNAMIC SYMBOL TABLE:\n\n00001000 g DO .rodata 00001000 oatdata\n\n00002000 g DO .text 00000238 oatexec\n\n00002234 g DO .text 00000004 oatlastword<\/pre>\n<p>No surprise so far&#8230; it\u2019s obviously an App with very little functionality that fits into 0x238 bytes. So let&#8217;s use oatdump on that file:<\/p>\n<pre class=\"lang:sh decode:true \">oatdump --oat-file= data@app@de.inovex.arttest.apk@classes.dex\n\noat\n\n007 CHECKSUM:\n\n0x7fcf3941 INSTRUCTION SET:\n\nThumb2 DEX FILE COUNT:\n\n1 EXECUTABLE OFFSET:\n\n0x00001000 IMAGE FILE LOCATION OAT CHECKSUM:\n\n0xd950003d IMAGE FILE LOCATION OAT BEGIN:\n\n0x60a95000 ...<\/pre>\n<p>The header shows us something about the content of that file, architecture and some integrity-check values, and some adresses, which are presumably used to relocate the library correctly. But the interesting part is in the body of the dump output: method names, dex code and the disassembled ARM code of this method.<\/p>\n<p>For example, the oat-dump output of our <span class=\"lang:default decode:true crayon-inline \">foo<\/span> method is the following:<\/p>\n<pre class=\"lang:sh decode:true \">1: int de.inovex.arttest.MainActivity.foo(int) (dex_method_idx=5)\n\nDEX CODE:\n\n0x0000: add-int\/lit16 v0, v2, #+4711\n\n0x0002: return v0\n\nOAT DATA:\n\nframe_size_in_bytes: 32\n\ncore_spill_mask: 0x00008060 (r5, r6, r15)\n\nfp_spill_mask: 0x00000000\n\nvmap_table: 0xf73b00da (offset=0x000010da)\n\nv0\/r5, v2\/r6, v65535\/r15\n\nmapping_table: 0xf73b00d8 (offset=0x000010d8)\n\ngc_map: 0xf73b00e0 (offset=0x000010e0)\n\nCODE: 0xf73b00bd (offset=0x000010bd size=28)...\n\n0xf73b00bc: e92d4060 push {r5, r6, lr}\n\n0xf73b00c0: b085 sub sp, sp, #20\n\n0xf73b00c2: 9000 str r0, [sp, #0]\n\n0xf73b00c4: 9109 str r1, [sp, #36]\n\n0xf73b00c6: 1c16 mov r6, r2\n\n0xf73b00c8: f2412267 movw r2, #4711\n\n0xf73b00cc: eb160502 adds.w r5, r6, r2\n\n0xf73b00d0: 1c28 mov r0, r5\n\n0xf73b00d2: b005 add sp, sp, #20\n\n0xf73b00d4: e8bd8060 pop {r5, r6, pc}<\/pre>\n<p>The <span class=\"lang:default decode:true crayon-inline \">DEX CODE<\/span> part is quite obvious: <span class=\"lang:java decode:true crayon-inline \">int a<\/span> in our java source code maps to our virtual register v2, we add the constant 4711, store the result in v0 and return it. The <span class=\"lang:default decode:true crayon-inline \">OAT DATA<\/span> is not yet fully understood, but obviously the <span class=\"lang:default decode:true crayon-inline \">core_spill_mask<\/span> describes the registers that were used in that method on the ARM to pass the data, the <span class=\"lang:default decode:true crayon-inline \">vmap_table<\/span> shows which virtual registers map to which real ones.<\/p>\n<p>The <span class=\"lang:default decode:true crayon-inline \">CODE<\/span> sections shows whats the processor is actually going to execute: r2 obviously holds our <span class=\"lang:default decode:true crayon-inline \">int a<\/span> at the begining. After the creation of a new stack frame, the constant 4711 is added to our <span class=\"lang:default decode:true crayon-inline \">int a<\/span> , and the results are passed back. No surprise, but impressive to see!<\/p>\n<p>It also reveals that there is almost no optimisation. It is more like a <span class=\"lang:sh decode:true crayon-inline \">gcc -OO<\/span> . Obviously the whole computation can be done with one single instruction:<\/p>\n<p><span class=\"lang:c decode:true crayon-inline \">adds.w r0, r2, #4711<\/span>. Not even a new stack frame is needed to do this.<\/p>\n<p>So let\u2019s summarize what OAT files are: precompiled like APK files, that are loaded into the running process like a shared-object library. They contain each method of all classes in the APK, and of course the method names and descriptions and an offset table to locate the methods within the binary.<\/p>\n<h2>Keep care of your heap: GC on the ART<\/h2>\n<p>The ART garbage collection is quite similar to the dalviks one. Both use a mark-and-sweep approach to keep the heap clean. That surprises at first glance, but is actually quite comprehensible.<\/p>\n<p>We have never lost the tracabilty of our allocation on the way from java to class to dex to machinecode. Also the way of the code execution has changed, the data structures and referenced of the objects are still the same, and therefore the GC process can be performed in the same way as on the davik.<\/p>\n<p>A quick look into the sources under <span class=\"lang:default decode:true crayon-inline \">art\/runtime\/gc<\/span> reveals that they use 4 different types of GC runs, all of them may run in parallel, and are listet with an increasing chance of freeing heap space:<\/p>\n<pre class=\"lang:default decode:true \">\/\/ The type of collection to be performed. The ordering of the enum matters, it is used to\n\n\/\/ determine which GCs are run first.\n\nenum GcType {\n\n\/\/ Placeholder for when no GC has been performed.\n\nkGcTypeNone,\n\n\/\/ Sticky mark bits GC that attempts to only free objects allocated since the last GC.\n\nkGcTypeSticky,\n\n\/\/ Partial GC that marks the application heap but not the Zygote.\n\nkGcTypePartial,\n\n\/\/ Full GC that marks and frees in both the application and Zygote heap.\n\nkGcTypeFull,\n\n\/\/ Number of different GC types.\n\nkGcTypeMax,\n\n};\n\n<\/pre>\n<p>The GC loops through it, until enough space is available to allocate the desired memory:<\/p>\n<pre class=\"lang:java decode:true \">art\/runtime\/gc\/heap.cc\n\n\/\/ Loop through our different Gc types and try to Gc until we get enough free memory.\n\nfor (size_t i = static_cast&amp;lt;size_t&amp;gt;(last_gc) + 1;\n\ni &amp;lt; static_cast&amp;lt;size_t&amp;gt;(collector::kGcTypeMax); ++i) {...<\/pre>\n<p>If this procedure fails, the system starts to try it harder by enlarging the heapspace etc. But this is overall a standard procedure and nothing new or exceptionally different to the dalviks GC, or, at least I didn\u2019t find it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is the second part of a small series of articles about the newest Android Version: Kitkat, that I wrote at inovex GmbH. In this part we will take a closer look at the new fileformat: OAT of the ART runtime and have a brief look at the garbage collection Diggin deeper: OAT file analysis. [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":12059,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[510],"service":[],"coauthors":[{"id":14,"display_name":"Matthias Schaff","user_nicename":"mschaff"}],"class_list":["post-20961","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-apps-2"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>The OAT of ART - inovex GmbH<\/title>\n<meta name=\"description\" content=\"In this article we will take a closer look at the new Android 4.4 KitKat file format OAT of the ART runtime and have a brief look at the garbage collection.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The OAT of ART - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"In this article we will take a closer look at the new Android 4.4 KitKat file format OAT of the ART runtime and have a brief look at the garbage collection.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2014-08-18T09:45:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/04\/artikelbild-core-embedded.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2300\" \/>\n\t<meta property=\"og:image:height\" content=\"678\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Matthias Schaff\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/04\/artikelbild-core-embedded-1024x302.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthias Schaff\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"7\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Matthias Schaff\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/\"},\"author\":{\"name\":\"Matthias Schaff\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/293e47490d25b6c8a0739950e0f4fc0a\"},\"headline\":\"The OAT of ART\",\"datePublished\":\"2014-08-18T09:45:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/\"},\"wordCount\":847,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2015\\\/04\\\/artikelbild-core-embedded.jpg\",\"keywords\":[\"Apps\"],\"articleSection\":[\"Applications\",\"English Content\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/\",\"name\":\"The OAT of ART - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2015\\\/04\\\/artikelbild-core-embedded.jpg\",\"datePublished\":\"2014-08-18T09:45:14+00:00\",\"description\":\"In this article we will take a closer look at the new Android 4.4 KitKat file format OAT of the ART runtime and have a brief look at the garbage collection.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2015\\\/04\\\/artikelbild-core-embedded.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2015\\\/04\\\/artikelbild-core-embedded.jpg\",\"width\":2300,\"height\":678,\"caption\":\"Core Embedded\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/the-oat-of-the-art\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The OAT of ART\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/293e47490d25b6c8a0739950e0f4fc0a\",\"name\":\"Matthias Schaff\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a9fe671894ef3b7da1da326ef522ce664c3f8a61b70cb875f93cc8e2ed806069?s=96&d=retro&r=g2f6063a3750e31ea610a1ababa629940\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a9fe671894ef3b7da1da326ef522ce664c3f8a61b70cb875f93cc8e2ed806069?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a9fe671894ef3b7da1da326ef522ce664c3f8a61b70cb875f93cc8e2ed806069?s=96&d=retro&r=g\",\"caption\":\"Matthias Schaff\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/mschaff\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The OAT of ART - inovex GmbH","description":"In this article we will take a closer look at the new Android 4.4 KitKat file format OAT of the ART runtime and have a brief look at the garbage collection.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/","og_locale":"de_DE","og_type":"article","og_title":"The OAT of ART - inovex GmbH","og_description":"In this article we will take a closer look at the new Android 4.4 KitKat file format OAT of the ART runtime and have a brief look at the garbage collection.","og_url":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2014-08-18T09:45:14+00:00","og_image":[{"width":2300,"height":678,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/04\/artikelbild-core-embedded.jpg","type":"image\/jpeg"}],"author":"Matthias Schaff","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/04\/artikelbild-core-embedded-1024x302.jpg","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Matthias Schaff","Gesch\u00e4tzte Lesezeit":"7\u00a0Minuten","Written by":"Matthias Schaff"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/"},"author":{"name":"Matthias Schaff","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/293e47490d25b6c8a0739950e0f4fc0a"},"headline":"The OAT of ART","datePublished":"2014-08-18T09:45:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/"},"wordCount":847,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/04\/artikelbild-core-embedded.jpg","keywords":["Apps"],"articleSection":["Applications","English Content","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/","url":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/","name":"The OAT of ART - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/04\/artikelbild-core-embedded.jpg","datePublished":"2014-08-18T09:45:14+00:00","description":"In this article we will take a closer look at the new Android 4.4 KitKat file format OAT of the ART runtime and have a brief look at the garbage collection.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/04\/artikelbild-core-embedded.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/04\/artikelbild-core-embedded.jpg","width":2300,"height":678,"caption":"Core Embedded"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/the-oat-of-the-art\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"The OAT of ART"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/293e47490d25b6c8a0739950e0f4fc0a","name":"Matthias Schaff","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/a9fe671894ef3b7da1da326ef522ce664c3f8a61b70cb875f93cc8e2ed806069?s=96&d=retro&r=g2f6063a3750e31ea610a1ababa629940","url":"https:\/\/secure.gravatar.com\/avatar\/a9fe671894ef3b7da1da326ef522ce664c3f8a61b70cb875f93cc8e2ed806069?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a9fe671894ef3b7da1da326ef522ce664c3f8a61b70cb875f93cc8e2ed806069?s=96&d=retro&r=g","caption":"Matthias Schaff"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/mschaff\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/20961","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=20961"}],"version-history":[{"count":0,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/20961\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/12059"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=20961"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=20961"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=20961"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=20961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}