{"id":365,"date":"2010-09-13T00:27:48","date_gmt":"2010-09-13T07:27:48","guid":{"rendered":"http:\/\/wiebe-elsinga.com\/blog\/?p=365"},"modified":"2011-10-20T21:17:31","modified_gmt":"2011-10-21T04:17:31","slug":"android-automatic-build-environment","status":"publish","type":"post","link":"http:\/\/wiebe-elsinga.com\/blog\/android-automatic-build-environment\/","title":{"rendered":"How-To: Android automatic build environment"},"content":{"rendered":"<div class=\"wpsso-pinterest-pin-it-image\" style=\"display:none !important;\">\n<\/div><!-- .wpsso-pinterest-pin-it-image -->\n\n<p><a href=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/05\/android.jpg\"><img loading=\"lazy\" class=\"alignleft size-thumbnail wp-image-170\" style=\"padding-right: 10px;\" title=\"android\" src=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/05\/android-150x150.jpg\" alt=\"\" width=\"150\" height=\"150\" srcset=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/05\/android-150x150.jpg 150w, http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/05\/android-300x300.jpg 300w, http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/05\/android-200x200-cropped.jpg 200w, http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/05\/android.jpg 500w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/><\/a>After setting up your <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=259\">Android development environment<\/a>, <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=275\">Developing an Android Application<\/a>, and Created an <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=300\"> Android Test environment<\/a> it\u2019s time to integrate your application and corresponding tests inside an automatic build environment. The steps to achieve this are:<\/p>\n<ul>\n<li>Create an maven project structure.<\/li>\n<li>Adding the specific Android setting to maven.<\/li>\n<li>Build and run the application.<\/li>\n<li>Build and run the tests.<\/li>\n<\/ul>\n<p>This post isn\u2019t about <strong>CI<\/strong>, it\u2019s about how to setup an automatic build environment with use of <strong>Maven<\/strong>. I will use the Android application and corresponding tests which was developed inside my previous posts.<br \/>\n<!--more--><\/p>\n<h2>Create a Maven project structure<\/h2>\n<p>If you are brand new to it you may wish to first check out <a href=\"http:\/\/maven.apache.org\/guides\/getting-started\/maven-in-five-minutes.html\">Maven in 5 minutes<\/a>. Basically create a parent-child structure as shown below.<\/p>\n<p>parent<br \/>\n|\u2014 Android<br \/>\n|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u2014  <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=352#pom_app.xml\">pom.xml<\/a><br \/>\n|\u2014 AndroidTest<br \/>\n|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u2014 <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=352#pom_test.xml\">pom.xml<\/a><br \/>\n|\u2014 <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=352#pom_parent.xml\">pom.xml<\/a><\/p>\n<p>In this post I\u2019m using maven version 2.2.1.<\/p>\n<h2>Adding the specific Android setting to maven<\/h2>\n<p>I will be using the <a href=\"http:\/\/code.google.com\/p\/maven-android-plugin\/\">maven-android-plugin<\/a> to build the Android application and <a href=\"http:\/\/code.google.com\/p\/robotium\/\">Robotium<\/a> to test the application. In this post I\u2019m using maven-android-plugin version 2.5.2.<\/p>\n<p>The parent project <em>pom.xml<\/em> must reference the maven-android-plugin, along with the android API level targeted, here I cite version 2.2 (api level 8 )<\/p>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"xml codecolorer\"><span class=\"sc3\"><span class=\"re1\">&lt;plugin<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;groupId<span class=\"re2\">&gt;<\/span><\/span><\/span>com.jayway.maven.plugins.android.generation2<span class=\"sc3\"><span class=\"re1\">&lt;\/groupId<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;artifactId<span class=\"re2\">&gt;<\/span><\/span><\/span>maven-android-plugin<span class=\"sc3\"><span class=\"re1\">&lt;\/artifactId<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;configuration<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;sdk<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;platform<span class=\"re2\">&gt;<\/span><\/span><\/span>2.2<span class=\"sc3\"><span class=\"re1\">&lt;\/platform<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;\/sdk<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;emulator<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;avd<span class=\"re2\">&gt;<\/span><\/span><\/span>Device<span class=\"sc3\"><span class=\"re1\">&lt;\/avd<span class=\"re2\">&gt;<\/span><\/span><\/span> <br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;wait<span class=\"re2\">&gt;<\/span><\/span><\/span>2000<span class=\"sc3\"><span class=\"re1\">&lt;\/wait<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;\/emulator<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;deleteConflictingFiles<span class=\"re2\">&gt;<\/span><\/span><\/span>true<span class=\"sc3\"><span class=\"re1\">&lt;\/deleteConflictingFiles<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;undeployBeforeDeploy<span class=\"re2\">&gt;<\/span><\/span><\/span>true<span class=\"sc3\"><span class=\"re1\">&lt;\/undeployBeforeDeploy<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;\/configuration<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n&nbsp; <span class=\"sc3\"><span class=\"re1\">&lt;extensions<span class=\"re2\">&gt;<\/span><\/span><\/span>true<span class=\"sc3\"><span class=\"re1\">&lt;\/extensions<span class=\"re2\">&gt;<\/span><\/span><\/span><br \/>\n<span class=\"sc3\"><span class=\"re1\">&lt;\/plugin<span class=\"re2\">&gt;<\/span><\/span><\/span><\/div><\/div>\n<h2>Build and run the application<\/h2>\n<ul>\n<li>To build the <em> Android.apk<\/em>, we need add a version of the android platform as a build path dependency in the Android project <em>pom.xml<\/em> file.<\/li>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"xml codecolorer\"><span class=\"re1\">&lt;dependencies<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;dependency<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">&lt;groupId<span class=\"re2\">&gt;<\/span><\/span>com.google.android<span class=\"re1\">&lt;\/groupId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">&lt;artifactId<span class=\"re2\">&gt;<\/span><\/span>android<span class=\"re1\">&lt;\/artifactId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">&lt;scope<span class=\"re2\">&gt;<\/span><\/span>provided<span class=\"re1\">&lt;\/scope<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;\/dependency<span class=\"re2\">&gt;<\/span><\/span><br \/>\n<span class=\"re1\">&lt;\/dependencies<span class=\"re2\">&gt;<\/span><\/span><\/div><\/div>\n<li>Add the goal into the Android project <em>pom.xml<\/em> to deploy the apk onto an Android emulator.<\/li>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"xml codecolorer\"><span class=\"re1\">&lt;plugins<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;plugin<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">&lt;groupId<span class=\"re2\">&gt;<\/span><\/span>com.jayway.maven.plugins.android.generation2<span class=\"re1\">&lt;\/groupId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">&lt;artifactId<span class=\"re2\">&gt;<\/span><\/span>maven-android-plugin<span class=\"re1\">&lt;\/artifactId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">&lt;executions<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"re1\">&lt;execution<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re1\">&lt;goals<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re1\">&lt;goal<span class=\"re2\">&gt;<\/span><\/span>deploy<span class=\"re1\">&lt;\/goal<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re1\">&lt;\/goals<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"re1\">&lt;\/execution<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">&lt;\/executions<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;\/plugin<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;plugin<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">&lt;artifactId<span class=\"re2\">&gt;<\/span><\/span>maven-compiler-plugin<span class=\"re1\">&lt;\/artifactId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;\/plugin<span class=\"re2\">&gt;<\/span><\/span><br \/>\n<span class=\"re1\">&lt;\/plugins<span class=\"re2\">&gt;<\/span><\/span><\/div><\/div>\n<li>Specify the source directory.<\/li>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"xml codecolorer\"><span class=\"re1\">&lt;sourceDirectory<span class=\"re2\">&gt;<\/span><\/span>$<span class=\"br0\">&#123;<\/span>project.basedir<span class=\"br0\">&#125;<\/span>\/src<span class=\"re1\">&lt;\/sourceDirectory<span class=\"re2\">&gt;<\/span><\/span><\/div><\/div>\n<li>Run the emulator<\/li>\n<li>Run the maven command <strong>mvn clean install<\/strong> inside the Android project.<\/li>\n<li>You should get the following result.<\/li>\n<\/ul>\n<p><center><br \/>\n<a href=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/09\/installed-app.gif\"><img loading=\"lazy\" class=\"aligncenter size-thumbnail wp-image-377\" title=\"installed app\" src=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/09\/installed-app-150x150.gif\" alt=\"\" width=\"150\" height=\"150\" \/><\/a><br \/>\n<\/center><br \/>\n<\/p>\n<h2>Build and run the tests<\/h2>\n<ul>\n<li>To run the tests inside the AndroidTest project, we need add the following dependency inside the AndroidTest project <em>pom.xml<\/em> file.<\/li>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"xml codecolorer\"><span class=\"re1\">&lt;dependency<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;groupId<span class=\"re2\">&gt;<\/span><\/span>com.jayway.android.robotium<span class=\"re1\">&lt;\/groupId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;artifactId<span class=\"re2\">&gt;<\/span><\/span>robotium-solo<span class=\"re1\">&lt;\/artifactId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;version<span class=\"re2\">&gt;<\/span><\/span>1.4.0<span class=\"re1\">&lt;\/version<span class=\"re2\">&gt;<\/span><\/span><br \/>\n<span class=\"re1\">&lt;\/dependency<span class=\"re2\">&gt;<\/span><\/span><br \/>\n<span class=\"re1\">&lt;dependency<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;groupId<span class=\"re2\">&gt;<\/span><\/span>com.google.android<span class=\"re1\">&lt;\/groupId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;artifactId<span class=\"re2\">&gt;<\/span><\/span>android<span class=\"re1\">&lt;\/artifactId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;scope<span class=\"re2\">&gt;<\/span><\/span>provided<span class=\"re1\">&lt;\/scope<span class=\"re2\">&gt;<\/span><\/span><br \/>\n<span class=\"re1\">&lt;\/dependency<span class=\"re2\">&gt;<\/span><\/span><br \/>\n<span class=\"re1\">&lt;dependency<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;groupId<span class=\"re2\">&gt;<\/span><\/span>com.google.android<span class=\"re1\">&lt;\/groupId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;artifactId<span class=\"re2\">&gt;<\/span><\/span>android-test<span class=\"re1\">&lt;\/artifactId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;scope<span class=\"re2\">&gt;<\/span><\/span>provided<span class=\"re1\">&lt;\/scope<span class=\"re2\">&gt;<\/span><\/span><br \/>\n<span class=\"re1\">&lt;\/dependency<span class=\"re2\">&gt;<\/span><\/span><\/div><\/div>\n<li>Add the source code of the Android application which it tests.<\/li>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"xml codecolorer\"><span class=\"re1\">&lt;dependency<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;groupId<span class=\"re2\">&gt;<\/span><\/span>com.my.android<span class=\"re1\">&lt;\/groupId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;artifactId<span class=\"re2\">&gt;<\/span><\/span>Android<span class=\"re1\">&lt;\/artifactId<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;version<span class=\"re2\">&gt;<\/span><\/span>$<span class=\"br0\">&#123;<\/span>project.version<span class=\"br0\">&#125;<\/span><span class=\"re1\">&lt;\/version<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;scope<span class=\"re2\">&gt;<\/span><\/span>compile<span class=\"re1\">&lt;\/scope<span class=\"re2\">&gt;<\/span><\/span><br \/>\n&nbsp; <span class=\"re1\">&lt;type<span class=\"re2\">&gt;<\/span><\/span>jar<span class=\"re1\">&lt;\/type<span class=\"re2\">&gt;<\/span><\/span><br \/>\n<span class=\"re1\">&lt;\/dependency<span class=\"re2\">&gt;<\/span><\/span><\/div><\/div>\n<li>Specify the source directory.<\/li>\n<div class=\"codecolorer-container xml default\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><div class=\"xml codecolorer\"><span class=\"re1\">&lt;sourceDirectory<span class=\"re2\">&gt;<\/span><\/span>$<span class=\"br0\">&#123;<\/span>project.basedir<span class=\"br0\">&#125;<\/span>\/src<span class=\"re1\">&lt;\/sourceDirectory<span class=\"re2\">&gt;<\/span><\/span><\/div><\/div>\n<li>Run the emulator<\/li>\n<li> Run the maven command <strong>mvn clean install<\/strong> inside the parent project.<\/li>\n<li>You should get the following result.<\/li>\n<\/ul>\n<p><center><br \/>\n<a href=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/09\/output-testrun.gif\"><img loading=\"lazy\" class=\"aligncenter size-full wp-image-379\" title=\"output testrun\" src=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/09\/output-testrun.gif\" alt=\"\" width=\"391\" height=\"135\" srcset=\"http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/09\/output-testrun.gif 391w, http:\/\/wiebe-elsinga.com\/blog\/wp-content\/uploads\/2010\/09\/output-testrun-300x104.gif 300w\" sizes=\"(max-width: 391px) 100vw, 391px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Here\u2019s the fully-configured project <em>pom.xm<\/em>l files using ALL of the above:<\/p>\n<p>parent<br \/>\n|\u2014 Android<br \/>\n|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u2014  <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=361#pom_app.xml\">pom.xml<\/a><br \/>\n|\u2014 AndroidTest<br \/>\n|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|\u2014 <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=361#pom_test.xml\">pom.xml<\/a><br \/>\n|\u2014 <a href=\"http:\/\/wiebe-elsinga.com\/blog\/?p=361#pom_parent.xml\">pom.xml<\/a><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>After setting up your Android development environment, Developing an Android Application, and Created an Android Test environment it\u2019s time to integrate your application and corresponding tests inside an automatic build environment. The steps to achieve this are: Create an maven project structure. Adding the specific Android setting to maven. Build and run the application. Build and run the tests. This post isn\u2019t about CI, it\u2019s about how to setup an automatic build environment with use of Maven. I will use the Android application and corresponding tests which was developed inside my previous posts.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[7,95],"tags":[154,21,23],"_links":{"self":[{"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/posts\/365"}],"collection":[{"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/comments?post=365"}],"version-history":[{"count":0,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/posts\/365\/revisions"}],"wp:attachment":[{"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/media?parent=365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/categories?post=365"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wiebe-elsinga.com\/blog\/wp-json\/wp\/v2\/tags?post=365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}