Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Building APK with Gradle outside IDE (migrating from Ant)

I have been using this tutorial to educate myself on how to build APK outside Eclipse by just using command line (and Ant) - http://www.androidengineer.com/2010/06/using-ant-to-automate-building-android.html

Now that build system will be shifting toward Gradle I would like to have similar advanced tutorial for reference. Most of the tutorials out there (like this one)deal just with basic stuff but I would like to know how to perform some "advanced" things like automatically replacing values in code during build (so that I can have multiple variants of APK).

like image 463
nikib3ro Avatar asked Oct 04 '22 15:10

nikib3ro


1 Answers

Standard examples provided by Google are here

http://tools.android.com/tech-docs/new-build-system/gradle-samples-0.4.2.zip?attredirects=0&d=1

For automatically changing values in code use BuildConfig class. Examples are in the link above.

Variants are explained here http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants

UPDATE

as this example gets bit stale here is pasetbin to newer version http://pastebin.com/FmcCZwA5

main difference is Robolectric support provided by plugin, and support library fetched from SDK internal repo

Older version

Less basic example with Robolectric and AndroidAnnotations

Use nexus

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.4'
  }
}

apply plugin: 'android'

repositories {
  mavenCentral()
  maven {
    url 'https://oss.sonatype.org/content/repositories/snapshots/'
  }
}

use AndroidAnnotation processor, Robolectric local tests and Jackson

configurations {
  compile
  testLocalCompile.extendsFrom(compile)
  androidannotations.extendsFrom(compile)
}

dependencies {
  compile files('libs/android-support-v4.jar')
  compile 'org.androidannotations:androidannotations-api:3.0-SNAPSHOT'
  compile 'com.github.japgolly.android:svg-android:2.0.3'
  compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.12'
  testLocalCompile 'junit:junit:4.8.2'
  testLocalCompile 'org.robolectric:robolectric:2.2-SNAPSHOT'
  testLocalCompile 'com.google.android:android:4.0.1.2'
  testLocalCompile 'com.google.android:support-v4:r6'
  testLocalCompile 'org.roboguice:roboguice:2.0'
  androidannotations 'org.androidannotations:androidannotations:3.0-SNAPSHOT'
}

android {
  compileSdkVersion 17
  buildToolsVersion "17.0.0"

Configure standard instrumentation tests

  defaultConfig {
    minSdkVersion 7
    targetSdkVersion 16
    testPackageName "com.mypackage.myapp.test"
    testInstrumentationRunner "com.maypackage.myapp.test.Runner"
  }
}

Invoke AndroidAnnotations processor on all variants

afterEvaluate { project ->
  android.applicationVariants.each { variant ->
    variant.javaCompile.options.compilerArgs += [
            '-classpath', configurations.compile.asPath,
            '-processorpath', configurations.androidannotations.asPath,
            '-processor', 'org.androidannotations.AndroidAnnotationProcessor',
            '-AandroidManifestFile=' + variant.processResources.manifestFile
    ]
  }
}

Define sourcesets for Robolectric local tests

sourceSets {
  testLocal {
    java.srcDir file('src/test/java')
    resources.srcDir file('src/test/resources')
  }
}

Local Robolectric tests task

task localTest(type: Test, dependsOn: assemble) {
  testClassesDir = sourceSets.testLocal.output.classesDir

  android.sourceSets.main.java.srcDirs.each { dir ->
    def buildDir = dir.getAbsolutePath().split('/')
    buildDir =  (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')

    sourceSets.testLocal.compileClasspath += files(buildDir)
    sourceSets.testLocal.runtimeClasspath += files(buildDir)
}

classpath = sourceSets.testLocal.runtimeClasspath

}

Run Robolectric in debug mode

localTest.doFirst {
  jvmArgs '-Xdebug',
        '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005'
}
like image 135
robotoaster Avatar answered Oct 12 '22 07:10

robotoaster