{"id":3329,"date":"2018-03-28T13:03:16","date_gmt":"2018-03-28T11:03:16","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=3329"},"modified":"2023-06-08T17:45:49","modified_gmt":"2023-06-08T15:45:49","slug":"android-sdk-and-emulator-in-docker-for-testing","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/28\/android-sdk-and-emulator-in-docker-for-testing\/","title":{"rendered":"Android SDK and emulator in Docker for testing"},"content":{"rendered":"<p style=\"text-align: left; margin-bottom: 10px;\"><em>Related articles:&nbsp;\u25ba<a href=\"https:\/\/wp.me\/p71Rzi-Tb\">Take Me Home &#8211; Project Overview<\/a>&nbsp; \u25ba<a href=\"https:\/\/wp.me\/p71Rzi-RU\">CI\/CD infrastructure: Choosing and setting up a server with Jenkins as Docker image&nbsp;<\/a> \u25ba<a href=\"https:\/\/wp.me\/p71Rzi-SN\">Automated Unit- and GUI-Testing for Android in Jenkins<\/a>&nbsp; \u25ba<a href=\"https:\/\/wp.me\/p71Rzi-SQ\">Testing a MongoDB with NodeJS, Mocha and Mongoose<\/a><\/em><\/p>\n<hr style=\"padding-top: 1px;\">\n<p>During our Android development project, we had to cope with several technological and organizational challenges with regard to construct a stable CI pipeline. Due to our chosen stack of Docker containers for building and deploying we had to confront with the topic how to integrate and deploy a building and testing environment for Android in Docker.<\/p>\n<p>For a better understanding of this challenge following illustration of our stack can be consulted:<\/p>\n<p><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/blubb.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3330\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/28\/android-sdk-and-emulator-in-docker-for-testing\/blubb\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/blubb.png\" data-orig-size=\"951,528\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Overview\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/blubb.png\" class=\"aligncenter wp-image-3330 size-full\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/blubb.png\" alt=\"\" width=\"951\" height=\"528\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/blubb.png 951w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/blubb-300x167.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/blubb-768x426.png 768w\" sizes=\"auto, (max-width: 951px) 100vw, 951px\" \/><\/a><br \/>\n<!--more--><br \/>\nWe recognize that our docker environment is built up in three containers. The \u201cbuild\u201d-Container with a Jenkins environment at the bottom. Our \u201cdatabase\u201d-Container in the center and our \u201cSDK and Emulator\u201d-container on top.<\/p>\n<p>Following challenges have emerged:<\/p>\n<ol>\n<li>How to set-up a build environment for Jenkins in which the Android SDK dependency is located in a different Docker container?<\/li>\n<li>How to deploy the build artifacts on this emulator and run UI-Tests<\/li>\n<\/ol>\n<p>For a better understanding of our first challenge we must understand how we run an Android build in Jenkins.<\/p>\n<p>We used a standard pipeline project for this task which is separated in four Stages:<\/p>\n<p><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Pipeline.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"3332\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/28\/android-sdk-and-emulator-in-docker-for-testing\/pipeline\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Pipeline.png\" data-orig-size=\"1159,296\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Pipeline\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Pipeline-1024x262.png\" class=\"alignnone size-full wp-image-3332\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Pipeline.png\" alt=\"\" width=\"1159\" height=\"296\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Pipeline.png 1159w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Pipeline-300x77.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Pipeline-768x196.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/Pipeline-1024x262.png 1024w\" sizes=\"auto, (max-width: 1159px) 100vw, 1159px\" \/><\/a><\/p>\n<p>Each stage is responsible for an automated step in the build process. In case of an Android build several stages are gradle commands. This means that especially stage two and three are essential.<br \/>\nStep two builds a runnable Android artefact, respectively an .APK file. Step three executes the Android project\u2019s unit tests. To run these gradle commands in a pipeline script you can use a gradle wrapper. A gradle wrapper encapsulates a specific gradle version in the project or installs a specific version if needed. Or You can specify and install gradle through the available Gradle Plugin for Jenkins:<br \/>\nSee&nbsp; <a href=\"https:\/\/wiki.jenkins.io\/display\/JENKINS\/Gradle+Plugin\">https:\/\/wiki.jenkins.io\/display\/JENKINS\/Gradle+Plugin<\/a>.<\/p>\n<p>Another thing is the configuration of the stages is the pipeline script. To invoke gradle commands you should wrap gradle in a separate command like:<\/p>\n<pre class=\"prettyprint lang-groovy\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">def gradle(command) {\n    sh \"${tool name: 'gradle', type: 'hudson.plugins.gradle.GradleInstallation'}\/bin\/gradle ${command}\"\n}<\/pre>\n<p>By declaring this function, you can start any gradle operation by passing the gradle command in the parameter.<\/p>\n<p>E.g.<\/p>\n<pre class=\"prettyprint lang-groovy\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">gradle 'clean test'<\/pre>\n<p>or<\/p>\n<pre class=\"prettyprint lang-groovy\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">gradle 'assembleDebug'<\/pre>\n<p>As said at the beginning, gradle uses the Android SDK to build and tests the project. To find the Android SDK gradle resolves it by default in the environment variable ANDROID_HOME.<br \/>\nBut what do you have to do if the path of ANDROID_HOME is located in another Docker container?<\/p>\n<p>We solved this problem by declaring a Volume for the Android SDK by providing it for our Jenkins container. If you use Docker compose you can easily declare a volume from one container to expose it for another. By doing this you can create a shared path between two or more containers. This could look like this:<\/p>\n<pre class=\"prettyprint lang-yaml\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"dockercompose.yml\">version: '3'\nservices:\n  jenkins:\n    image: \"dockerid\/take-me-home:1.6\"\n    container_name: \"jenkins\"\n    ports:\n      - \"80:8080\"\n    volumes:\n      - app-volume:\/usr\/local\/android-sdk\n      - .\/jenkins_mount_point:\/var\/jenkins_home\n  mongodb:\n    image: mongo:latest\n    container_name: \"mongodb\"\n    environment:\n      - MONGO_DATA_DIR=\/data\/db\n      - MONGO_LOG_DIR=\/dev\/null\n    volumes:\n      - .\/data\/db:\/data\/db\n    ports:\n      - 27017:27017\n\n  android-emulator:\n    image: \"butomo1989\/docker-android-x86-7.1.1\"\n    container_name: \"android-emulator\"\n    volumes:\n        - app-volume:\/root\/\n    ports:\n       - \"6080:6080\"\n       - \"5554:5554\"\n       - \"5555:5555\"\n    args:\n            DEVICE: \"Nexus 5\"\n\n### share volume\nvolumes:\n    app-volume:<\/pre>\n<p>As you can see a volume called \u201capp-volume\u201d is created. In the android-emulator image the SDK is located in \/root\/ and will be mapped to \/usr\/local\/android-sdk in the Jenkins image. Now you only must make sure that your android emulator image is up and running and you have to set the ANDROID_HOME variable to this location.<\/p>\n<p>Now that we can build our Android App with the SDK from the emulator container we can put our focus on UI-Tests and deploying on a Docker-driven Emulator:<\/p>\n<p>If you search in Docker Hub for Android Emulator you will find a couple results. Our experience was that most of these Docker images were outdated or not maintained anymore. The problem is that often after updating the SDK via SDKMANAGER the requirements to the environments are changing. This means that commands in the startup script are often deprecated, so you should build an image by yourself or search a recent image that is not older than a couple of weeks. In our case the image docker-android-x86-7.1.1 from <a href=\"https:\/\/github.com\/butomo1989\">butomo1989<\/a> was well matching. You can find his Docker repo <a href=\"https:\/\/github.com\/butomo1989\/docker-android\">here<\/a>.<\/p>\n<p>Butomo1989 did a great job creating this image. He provides some nice features in his build.<br \/>\nFor example:<\/p>\n<ul>\n<li>noVNC Support (You can connect via Browser to a running emulator)<\/li>\n<li>You can run UI Tests with different 3-rd party frameworks (like Appium, Espresso)<\/li>\n<li>And many more<\/li>\n<\/ul>\n<p>Google provides its own UI Testing framework. It is called the Espresso framework. The tests are written in JUnit4 Style. An example can be seen <a href=\"https:\/\/developer.android.com\/training\/testing\/ui-testing\/espresso-testing.html\">here<\/a>.<\/p>\n<p>In our fifth Stage which is called \u201cTest on emulator\u201d we call our emulator by adb. Make sure you have the Android Debug Bridge installed on your Host machine. In our case the adb must be installed in the Jenkins-Docker image.<\/p>\n<p>You can connect to the emulator device just by calling it in the pipeline script:<\/p>\n<pre class=\"prettyprint lang-groovy\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">sh adb connect &lt;docker-machine-ip-address&gt;:5555<\/pre>\n<p>After a successful connection the adb test command can be called:<\/p>\n<pre class=\"prettyprint lang-groovy\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">sh adb shell am instrument -w &lt;test_package_name&gt;\/&lt;runner_class&gt;<\/pre>\n<p>Providing your Android SDK and Emulator in a separated Docker container gives you certain possibilities. First, it is separated from your building environment. So, you can update your Jenkins container and you don\u2019t have to look after you Android SDK. Second, encapsulating the emulator in another image enables you for resizing and adding more images to your emulator. You could run the container on another Docker Host to distribute load due to high performance requirements of the emulator. If you have got further opinions on this topic do not hesitate to contact me:<br \/>\nml126@hdm-stuttgart.de.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Related articles:&nbsp;\u25baTake Me Home &#8211; Project Overview&nbsp; \u25baCI\/CD infrastructure: Choosing and setting up a server with Jenkins as Docker image&nbsp; \u25baAutomated Unit- and GUI-Testing for Android in Jenkins&nbsp; \u25baTesting a MongoDB with NodeJS, Mocha and Mongoose During our Android development project, we had to cope with several technological and organizational challenges with regard to construct [&hellip;]<\/p>\n","protected":false},"author":871,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[653,651,2],"tags":[],"ppma_author":[745],"class_list":["post-3329","post","type-post","status-publish","format-standard","hentry","category-mobile-apps","category-system-designs","category-system-engineering"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":3421,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/28\/take-me-home-project-overview\/","url_meta":{"origin":3329,"position":0},"title":"Take Me Home &#8211; Project Overview","author":"cp054","date":"28. March 2018","format":false,"excerpt":"Related articles:\u00a0\u25baCI\/CD infrastructure: Choosing and setting up a server with Jenkins as Docker image\u00a0\u25baDockerizing Android SDK and Emulator for testing\u00a0 \u25baAutomated Unit- and GUI-Testing for Android in Jenkins\u00a0 \u25baTesting a MongoDB with NodeJS, Mocha and Mongoose During the winter term 2017\/2018, we created an app called Take Me Home. The\u2026","rel":"","context":"In &quot;Mobile Apps&quot;","block_context":{"text":"Mobile Apps","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/interactive-media\/mobile-apps\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/tmh_admin_usermanagement_bearbeitet.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/tmh_admin_usermanagement_bearbeitet.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/tmh_admin_usermanagement_bearbeitet.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/tmh_admin_usermanagement_bearbeitet.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/tmh_admin_usermanagement_bearbeitet.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/tmh_admin_usermanagement_bearbeitet.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":3397,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/28\/automated-unit-and-gui-testing-for-android-in-jenkins\/","url_meta":{"origin":3329,"position":1},"title":"Automated Unit- and GUI-Testing for Android in Jenkins","author":"Benedikt Schrade","date":"28. March 2018","format":false,"excerpt":"Related articles:\u00a0\u25baTake Me Home - Project Overview\u00a0 \u25baCI\/CD infrastructure: Choosing and setting up a server with Jenkins as Docker image\u00a0\u25baAndroid SDK and emulator in Docker for testing\u00a0 \u00a0\u25baTesting a MongoDB with NodeJS, Mocha and Mongoose In this article we would like to describe, how to write unit- and gui-tests for\u2026","rel":"","context":"In &quot;Mobile Apps&quot;","block_context":{"text":"Mobile Apps","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/interactive-media\/mobile-apps\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3342,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/28\/ci-cd-infrastructure-choosing-and-setting-up-a-server-with-jenkins-as-docker-image\/","url_meta":{"origin":3329,"position":2},"title":"CI\/CD infrastructure: Choosing and setting up a server with Jenkins as Docker image","author":"cp054","date":"28. March 2018","format":false,"excerpt":"Related articles:\u00a0\u25baTake Me Home - Project Overview\u00a0 \u25baAndroid SDK and emulator in Docker for testing\u00a0 \u25baAutomated Unit- and GUI-Testing for Android in Jenkins\u00a0 \u25baTesting a MongoDB with NodeJS, Mocha and Mongoose This article will run you through the motivation for a continuous integration and delivery, choosing a corresponding tool and\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/puttygen.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/puttygen.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/puttygen.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/puttygen.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1924,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-4\/","url_meta":{"origin":3329,"position":3},"title":"Microservices \u2013 Legolizing Software Development IV","author":"Calieston Varatharajah, Christof Kost, Korbinian Kuhn, Marc Schelling, Steffen Mauser","date":"28. February 2017","format":false,"excerpt":"An automated development environment will save you. We explain how we set up Jenkins, Docker and Git to work seamlessly together.","rel":"","context":"In &quot;System Designs&quot;","block_context":{"text":"System Designs","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/draw_io_docker_small-1024x439.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/draw_io_docker_small-1024x439.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/draw_io_docker_small-1024x439.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":3400,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/28\/testing-a-mongodb-with-nodejs-mocha-and-mongoose\/","url_meta":{"origin":3329,"position":4},"title":"Testing a MongoDB with NodeJS, Mocha and Mongoose","author":"Domenik Jockers","date":"28. March 2018","format":false,"excerpt":"Related articles:\u00a0\u25baTake Me Home - Project Overview\u00a0 \u25baCI\/CD infrastructure: Choosing and setting up a server with Jenkins as Docker image\u00a0\u25baAndroid SDK and emulator in Docker for testing\u00a0 \u25baAutomated Unit- and GUI-Testing for Android in Jenkins\u00a0 Setting up the testing environment and workflow Setup: Jenkins CI Docker Container MongoDB Docker Container\u2026","rel":"","context":"In &quot;Databases&quot;","block_context":{"text":"Databases","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/databases\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3314,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/28\/continuous-integration-deployment-for-a-cross-platform-application-part-1\/","url_meta":{"origin":3329,"position":5},"title":"Continuous Integration &#038; Deployment for a Cross-Platform Application &#8211; Part 1","author":"Tobias Eberle, Marco Maisel, Tobias Staib, Mario Walz","date":"28. March 2018","format":false,"excerpt":"When we started the project \"Flora CI\" for the lecture \"System Engineering\", we planned to deal with Continuous Integration. As an important aspect of software engineering all of us have previously been involved in projects where code of developers had to be merged and builds had to be automated somehow.\u2026","rel":"","context":"In &quot;DevOps&quot;","block_context":{"text":"DevOps","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/devops\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/flora-app.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":745,"user_id":871,"is_guest":0,"slug":"ml126","display_name":"Michael Laemmle","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/1135116ac7cac2a58243be08245d779581cafe78500b6aa6220750fa15b29069?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/3329","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/871"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=3329"}],"version-history":[{"count":6,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/3329\/revisions"}],"predecessor-version":[{"id":24749,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/3329\/revisions\/24749"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=3329"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=3329"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=3329"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=3329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}