{"id":3199,"date":"2017-08-30T07:30:44","date_gmt":"2017-08-30T06:30:44","guid":{"rendered":"https:\/\/www.inovex.de\/blog\/?p=3199"},"modified":"2026-03-17T08:32:48","modified_gmt":"2026-03-17T07:32:48","slug":"migrating-an-embedded-android-setup-android-framework","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/","title":{"rendered":"Migrating an embedded Android setup: The Android framework (Part 4)"},"content":{"rendered":"<p>With a <a href=\"https:\/\/www.inovex.de\/blog\/migrating-an-embedded-android-setup-hal\/\" target=\"_blank\" rel=\"noopener\">working HAL<\/a>, we are able to go further, directly into the Android framework, where the most important system internals are implemented. First we take a look at the Java Native Interface (JNI) Layer, which is located between the HAL and a custom system service, before continuing to the binder, permissions and the manager.<!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#JNI\" >JNI<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#The-Service-and-Binder\" >The Service and Binder<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#Permissions-We-need-our-own-permissions\" >Permissions? We need our own permissions?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#Manager\" >Manager<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#Testing\" >Testing!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#Read-on\" >Read on<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"JNI\"><\/span>JNI<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The JNI enables us to use native implementations in Java, in our case the HAL, which is written in C. So the JNI Layer is nothing more than a wrapper that loads our <span class=\"lang:java decode:true crayon-inline \">lcd1313M1hw.imx6.so<\/span> when <span class=\"lang:java decode:true crayon-inline \">init_native<\/span> is called and defines a wrapper function for each function defined in the HAL.<\/p>\n<p>Because I changed some of the available methods, I need to modify some parts of the JNI located at <span class=\"lang:sh decode:true crayon-inline \">frameworks\/base\/services\/core\/jni\/com_android_server_LCDService.cpp<\/span>. In the JNI Layer, we need to register the JNI for our service (described below) in the Makefile and the <span class=\"lang:java decode:true crayon-inline \">onload.cpp<\/span>. The changes are built into the <span class=\"lang:java decode:true crayon-inline \">libandroid_servers.so<\/span>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"The-Service-and-Binder\"><\/span>The Service and Binder<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>By going deeper into the Java world of Android\u2019s framework, we must deal with the mighty Binder. Actually, the Binder does nothing more than inter-process communication (IPC), but that is a really big part in Android. With Binder, it is possible for objects to communicate by only knowing about their interfaces. Explicit dependencies to each other are not necessary at build or compile time.<\/p>\n<p>That means to implement our Java service, we need an interface in order to enable the binder to connect apps or system-internal objects with our service. This interface is defined in AIDL, the <a href=\"https:\/\/developer.android.com\/guide\/components\/aidl.html\" target=\"_blank\" rel=\"noopener\">Android Interface Definition Language<\/a>. It is not too different from a traditional Java interface and very easy to understand. We just needed to change the method definitions to the new ones. You can find it under <span class=\"lang:sh decode:true crayon-inline \">frameworks\/base\/core\/java\/android\/os\/ILCDService.aidl<\/span>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Permissions-We-need-our-own-permissions\"><\/span>Permissions? We need our own permissions?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>After we applied the AIDL to its related Makefile, we can go on to the service implementation. For that we need to create an <span class=\"lang:java decode:true crayon-inline \">LCDService.java<\/span> file located at <span class=\"lang:sh decode:true crayon-inline \">frameworks\/base\/services\/java\/com\/android\/server<\/span>. Like most parts until now, we just needed to adjust the old implementation to the new, slightly changed interfaces. As you can see in the code, the service controls the hardware via the JNI. But one thing bothered me: The service tries to check if a custom LCD permission is granted.<\/p>\n<pre class=\"lang:java decode:true \">private void checkPermission(String permission) {\r\n\r\n    if(PackageManager.PERMISSION_GRANTED!= mContext.checkCallingOrSelfPermission(permission)){\r\n\r\n        throw new SecurityException(\"Access denied to process: \" +\r\n\r\n        Binder.getCallingPid()+ \", must have permission \" \t\t\t\t+permission);\r\n\r\n    }\r\n\r\n}<\/pre>\n<p>Where was this permission defined? I did not find any more documentation (there wasn&#8217;t too much useful documentation to begin with), but I found a patch file of about 5300 lines of code. Grepping for the permission we looked for in this patch file lead us to <span class=\"lang:sh decode:true crayon-inline\">frameworks\/base\/core\/res\/AndroidManifest.xml<\/span>. And after adding<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;permission android:name=\"android.permission.LCD_SERVICE\"\r\n\r\n         android:protectionLevel=\"normal\"\r\n\r\n         android:description=\"@string\/permdesc_lcdservice\"\r\n\r\n         android:label=\"@string\/permlab_lcdservice\" \/&gt;<\/pre>\n<p>above the <span class=\"lang:java decode:true crayon-inline \">android.permission.SET_WALLPAPER_HINTS<\/span>, it should be possible to use this permission.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Manager\"><\/span>Manager<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Because we do no want app developers to use the service directly, we need a service manager which should be accessible through the ordinary SDK. Such a manager exists for nearly all services, and as soon as it is implemented, you are able to test your whole work.<\/p>\n<p>The manger is implemented under <span class=\"lang:sh decode:true crayon-inline \">frameworks\/base\/core\/java\/android\/os\/LCDManager.java<\/span>, the same directory in which our <span class=\"lang:java decode:true crayon-inline \">ILCDService.aidl<\/span> is located. As so often before, I just needed to adjust the old manager to the new interfaces. Otherwise, the manager is a really simple construct. In its constructor, the LCDService is handed over and the available methods are just wrappers for their respective counterparts in the service. Not our first wrapper at this point &#8230;<\/p>\n<p>Now we are just two little changes away from running the first test app for the Grove LCD. Of course, we want to receive a Manager instance for the new Service by the standard way to do it: via <span class=\"lang:java decode:true crayon-inline \">getSystemService<\/span>. This is why we need to register all the stuff described above in <span class=\"lang:sh decode:true crayon-inline \">frameworks\/base\/core\/java\/android\/app\/ContextImpl.java<\/span> by adding:<\/p>\n<pre class=\"lang:java decode:true \">static {\r\n\r\n  registerService(LCD_SERVICE, new ServiceFetcher(){\r\n\r\n  public Object createStaticService(ContextImpl ctx){\r\n\r\n       IBinder b = ServiceManager.getService(LCD_SERVICE);                     \t\t   ILCDService service = ILCDService.Stub.asInterface(b);                     \t\t   return new LCDManager(service);\r\n\r\n  }});\r\n\r\n }<\/pre>\n<p>Normally, a few of this registrations should be located at this file, but for reasons we do not know, there aren&#8217;t. We had to do some more research for the right place to register. Take a look at the code if you&#8217;re interested in the nitty gritty.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Testing\"><\/span>Testing!<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>At this part, if everything ran correctly until know (not like our first try and <a href=\"https:\/\/www.inovex.de\/blog\/migrating-an-embedded-android-setup-hal\/\" target=\"_blank\" rel=\"noopener\">the &#8222;const&#8220; described in the previous part of this series<\/a>), you should be able to write a first test application for the Grove LCD.<\/p>\n<p>For several reasons you need to build this test application within the source tree. We will speak about a way to publish our interface for all developers in the next part. But as an example you can control the LCD now directly through the service (only usable for a built-in app):<\/p>\n<pre class=\"lang:java decode:true \">import android.os.ILCDService;\r\n\r\n\/\/onCreate\r\n\r\n IBinder b = ServiceManager.getService(\"lcd1313M1\");\r\n\r\n ILCDService lcd = ILCDService.Stub.asInterface(b);\r\n\r\n \tlcd.displayInit();\r\n\r\n        lcd.setRGB(0, 0, 0);<\/pre>\n<p>Or through the ServiceManager:<\/p>\n<pre class=\"lang:java decode:true \">import android.os.LCDManager;\r\n\r\n\/\/onCreate\r\n\r\nLCDManager manager = getSystemService(LCD_SERVICE);\r\n\r\nmanager.displayInit();\r\n\r\nmanager.setRGB(255,0,0);<\/pre>\n<p>For more background on custom service integration look at the <a href=\"http:\/\/www.linaro.org\/blog\/adding-a-new-system-service-to-android-5-tips-and-how-to\/\" target=\"_blank\" rel=\"noopener\">Linaro website<\/a> and the TI Wiki.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Read-on\"><\/span>Read on<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Now we&#8217;re prepared to write a wrapper with the SDK Add-On, coming up in the last part of this series! In the meantime, have a look at our <a href=\"https:\/\/www.inovex.de\/en\/our-services\/smart-devices-robotics\/\" target=\"_blank\" rel=\"noopener\">Smart Devices division<\/a> and learn how you can join us as a software developer.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With a working HAL, we are able to go further, directly into the Android framework, where the most important system internals are implemented. First we take a look at the Java Native Interface (JNI) Layer, which is located between the HAL and a custom system service, before continuing to the binder, permissions and the manager.<\/p>\n","protected":false},"author":35,"featured_media":13054,"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":[74],"service":[420],"coauthors":[{"id":35,"display_name":"Anna-Lena Marx","user_nicename":"amarx"}],"class_list":["post-3199","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-iot","service-apps"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Migrating the Android Embedded Framework<\/title>\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\/migrating-an-embedded-android-setup-android-framework\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Migrating the Android Embedded Framework\" \/>\n<meta property=\"og:description\" content=\"With a working HAL, we are able to go further, directly into the Android framework, where the most important system internals are implemented. First we take a look at the Java Native Interface (JNI) Layer, which is located between the HAL and a custom system service, before continuing to the binder, permissions and the manager.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/\" \/>\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=\"2017-08-30T06:30:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-17T07:32:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2300\" \/>\n\t<meta property=\"og:image:height\" content=\"876\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Anna-Lena Marx\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting-1024x390.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=\"Anna-Lena Marx\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Anna-Lena Marx\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/\"},\"author\":{\"name\":\"Anna-Lena Marx\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/b7d6fd8c3ec8972f3b14f0205e25d022\"},\"headline\":\"Migrating an embedded Android setup: The Android framework (Part 4)\",\"datePublished\":\"2017-08-30T06:30:44+00:00\",\"dateModified\":\"2026-03-17T07:32:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/\"},\"wordCount\":883,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\",\"keywords\":[\"IoT\"],\"articleSection\":[\"Applications\",\"English Content\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/\",\"url\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/\",\"name\":\"Migrating the Android Embedded Framework\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\",\"datePublished\":\"2017-08-30T06:30:44+00:00\",\"dateModified\":\"2026-03-17T07:32:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#primaryimage\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg\",\"width\":2300,\"height\":876,\"caption\":\"Porting an Android Embedded Setup\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.inovex.de\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migrating an embedded Android setup: The Android framework (Part 4)\"}]},{\"@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\/b7d6fd8c3ec8972f3b14f0205e25d022\",\"name\":\"Anna-Lena Marx\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/a8cfb531252ec2ef604ef3033c45111b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/44ab0d3916e62a17054b8e4cea92702db304b9dcb6dd28fb9915484c1830409b?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/44ab0d3916e62a17054b8e4cea92702db304b9dcb6dd28fb9915484c1830409b?s=96&d=retro&r=g\",\"caption\":\"Anna-Lena Marx\"},\"url\":\"https:\/\/www.inovex.de\/de\/blog\/author\/amarx\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Migrating the Android Embedded Framework","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\/migrating-an-embedded-android-setup-android-framework\/","og_locale":"de_DE","og_type":"article","og_title":"Migrating the Android Embedded Framework","og_description":"With a working HAL, we are able to go further, directly into the Android framework, where the most important system internals are implemented. First we take a look at the Java Native Interface (JNI) Layer, which is located between the HAL and a custom system service, before continuing to the binder, permissions and the manager.","og_url":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2017-08-30T06:30:44+00:00","article_modified_time":"2026-03-17T07:32:48+00:00","og_image":[{"width":2300,"height":876,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","type":"image\/jpeg"}],"author":"Anna-Lena Marx","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting-1024x390.jpg","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Anna-Lena Marx","Gesch\u00e4tzte Lesezeit":"5\u00a0Minuten","Written by":"Anna-Lena Marx"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/"},"author":{"name":"Anna-Lena Marx","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/b7d6fd8c3ec8972f3b14f0205e25d022"},"headline":"Migrating an embedded Android setup: The Android framework (Part 4)","datePublished":"2017-08-30T06:30:44+00:00","dateModified":"2026-03-17T07:32:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/"},"wordCount":883,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","keywords":["IoT"],"articleSection":["Applications","English Content","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/","url":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/","name":"Migrating the Android Embedded Framework","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","datePublished":"2017-08-30T06:30:44+00:00","dateModified":"2026-03-17T07:32:48+00:00","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2017\/06\/android-embedded-porting.jpg","width":2300,"height":876,"caption":"Porting an Android Embedded Setup"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/migrating-an-embedded-android-setup-android-framework\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Migrating an embedded Android setup: The Android framework (Part 4)"}]},{"@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\/b7d6fd8c3ec8972f3b14f0205e25d022","name":"Anna-Lena Marx","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/a8cfb531252ec2ef604ef3033c45111b","url":"https:\/\/secure.gravatar.com\/avatar\/44ab0d3916e62a17054b8e4cea92702db304b9dcb6dd28fb9915484c1830409b?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/44ab0d3916e62a17054b8e4cea92702db304b9dcb6dd28fb9915484c1830409b?s=96&d=retro&r=g","caption":"Anna-Lena Marx"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/amarx\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/3199","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\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=3199"}],"version-history":[{"count":2,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/3199\/revisions"}],"predecessor-version":[{"id":66574,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/3199\/revisions\/66574"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/13054"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=3199"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=3199"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=3199"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=3199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}