Android Gradle plugin sample
Plugin will upload apk to distribution system after building release artifact.
Create Project
In the gradle folder, copy samples->customPlugin->plugin to your work directory. Gradle distribution can be downloaded here
build.gradle
Change build.gradle to this strusture
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
compile 'com.android.tools.build:gradle:0.14.0'
}
apply plugin: 'maven'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.12'
}
group = 'com.tunebrains.beta'
version = '1.0-SNAPSHOT'
Configure plugin and deploy to local folder
Rename and change plugin description file under src->main->resources->META-INF->gradle-plugins folder
File Name: com.tunebrains.beta-gradle-beta-upload.properties
implementation-class=com.tunebrains.beta.gradle.UploadApkPlugin
Create groovy class com.tunebrains.beta.gradle.UploadApkPlugin
package com.tunebrains.beta.gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
class UploadApkPlugin implements Plugin<Project> {
@Override
void apply(Project pProject) {
}
}
Specify folder to deploy plugin
uploadArchives {
repositories {
mavenDeployer {
repository(url: "file:///Users/alex/Projects/Tutorials/repo")
}
}
}
Execute gradle tast to upload archive. Refresh gradle task if required.
Apply plugin in your Android project.
In top level build.gradle
buildscript {
repositories {
//...
maven {
url uri('file:///Users/alex/Projects/Tutorials/repo')
}
}
dependencies {
classpath group: 'com.tunebrains.beta', name: 'releaseupload',
version: '1.0-SNAPSHOT'
}
}
In app level build.gradle
Apply plugin:
apply plugin: 'com.tunebrains.beta-release-upload'
Its time for write some code.
We will add custom tasks betaDebug and betaRelease to upload debug and release apks.
pProject.configure(pProject) {
def hasProp = pProject.hasProperty("android")
if (hasProp) {
tasks.whenTaskAdded { task ->
pProject.("android").applicationVariants.all { variant ->
def expectingTask = "package${variant.name.capitalize()}".toString()
if (expectingTask.equals(task.name)) {
def variantName = variant.name
def newTaskName = "beta${variantName.capitalize()}"
pProject.task(newTaskName) << {
//write task code
}
}
}
}
}
}
To perform multipart post add apache dependencies to build.gradle
compile 'org.apache.httpcomponents:httpmime:4.+'
compile 'commons-io:commons-io:2.+'
compile 'org.apache.commons:commons-compress:1.+'
To get resulting apk for upload we can use task field
String apkFilename = task.outputFile.toString()
Now we need to post our resulting apk to server endpoint.
private Object uploadApk(Project project, String apkFilename, String mappingFilename) {
String serverEndpoint = "http://localhost:3000"
String url = "${serverEndpoint}/api/v3/uploads.json"
MultipartEntity entity = buildEntity(apkFilename, mappingFilename)
String via = ""
return post(url, entity, via)
}
private MultipartEntity buildEntity(String apkFilename, String mappingFilename) {
MultipartEntity entity = new MultipartEntity()
entity.addPart('upload[data_file_name]', new FileBody(new File(apkFilename)))
return entity
}
private Object post(String url, MultipartEntity entity, String via) {
DefaultHttpClient httpClient = buildHttpClient()
HttpPost post = new HttpPost(url)
post.setEntity(entity)
HttpResponse response = httpClient.execute(post)
String json = EntityUtils.toString(response.getEntity())
def parser = new JsonSlurper()
def parsed = parser.parseText(json)
return parsed
}
private DefaultHttpClient buildHttpClient() {
DefaultHttpClient httpClient = new DefaultHttpClient()
return httpClient
}
In result of evecution uploadApk we got the resulting json object of parsed server response. And can for example print to console url where you can find the build.
Enjoy!