// apply plugin: 'groovy' buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' } } allprojects { repositories { jcenter() } } dependencies { // compile 'org.codehaus.groovy:groovy-all:2.4.7' // , publish compile 'com.google.apis:google-api-services-androidpublisher:v2-rev38-1.22.0' }
root/ app/ ... .gitignore - keystore.jks , keystore.jks build.gradle gradle/ iam/ .gitignore - publisher.json , publisher.json - service account secret src/ main/ groovy/ ... .gitignore - signing.properties , build.gradle gradle.properties gradlew gradlew.bat local.properties signing.properties - keystore settings.gradle
keystore.file=keystore.jks keystore.password=<> key.alias=<_> key.password=<_>
... android { ... Properties signingProperties = new Properties() def file = project.rootProject.file('signing.properties') if (fixe.exists()) { signingProperties.load(file.newDataInputStream()) } def prodSigning_keystoreFile = properties.getProperty('keystore.file') def prodSigning_keystorePassword = properties.getProperty('keystore.password') def prodSigning_keyAlias = properties.getProperty('key.alias') def prodSigning_keyPassword = properties.getProperty('key.password') ... signingConfigs { ... production { storeFile file(prodSigning_keystoreFile ) storePassword prodSigning_keystorePassword keyAlias prodSigning_keyAlias keyPassword prodSigning_keyPassword } } productFlavors { ... prod { ... } } buildTypes { ... release { signingConfig production } } }
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport import com.google.api.client.http.FileContent import com.google.api.client.json.jackson2.JacksonFactory import com.google.api.services.androidpublisher.AndroidPublisher import com.google.api.services.androidpublisher.AndroidPublisherScopes import com.google.api.services.androidpublisher.model.Track class ApkPublisher { // String packageName; // ( , warnings) String name; // apk. String apkName; // proguard-mapping String mappingName; void publish() { assert packageName != null assert name != null assert apkName != null assert mappingName != null println "PUBLISHING [ ${packageName} / ${name} ]" def dir = new File("assemble") // service account secret def inputStream = new FileInputStream("iam/publisher.json"); def transport = GoogleNetHttpTransport.newTrustedTransport(); def credential = GoogleCredential.fromStream(inputStream) .createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER)); def builder = new AndroidPublisher.Builder(transport, JacksonFactory.getDefaultInstance(), credential); builder.setApplicationName(name) def androidPublisher = builder.build(); def edits = androidPublisher.edits(); // def editRequest = edits.insert(packageName, null); def edit = editRequest.execute(); // id, final String editId = edit.getId(); println " - edit_id = ${editId}" // apk def apkFilePath = new File(dir, apkName) println " - apk file = ${apkFilePath}" def apkFile = new FileContent("application/vnd.android.package-archive", apkFilePath); def apkUploadRequest = edits.apks().upload(packageName, editId, apkFile); def apkUploadResult = apkUploadRequest.execute(); // verfsionCode int versionCode = apkUploadResult.getVersionCode() println " - version code ${versionCode} has been uploaded" // proguard mapping def mappingFilePath = new File(dir, mappingName) println " - mapping file = ${mappingFilePath}" def mappingFile = new FileContent("application/octet-stream", mappingFilePath); def mappingUploadRequest = edits.deobfuscationfiles() .upload(packageName, editId, versionCode, "proguard", mappingFile); mappingUploadRequest.execute(); println " - mapping for version ${versionCode} has been uploaded" // apk // - List apkVersionCodes = [versionCode] def track = new Track().setVersionCodes(apkVersionCodes) def updateTrackRequest = edits.tracks().update(packageName, editId, "alpha", track); def updatedTrack = updateTrackRequest.execute(); println " - track code ${updatedTrack.getTrack()} has been updated" // , // , "" // , def commitRequest = edits.commit(packageName, editId); def appEdit = commitRequest.execute(); println " - app edit with id ${appEdit.getId()} has been comitted" println "APP [ ${packageName} / ${name} / v${versionCode} ] SUCCESSFULLY PUBLISHED" } }
def void moveToAssemble(String folder, String name, String newName) { def from = new File(folder, name) def to = new File("assemble", newName) from.renameTo(to) println "moved ${from} to ${to}" } // root/assemble // // , def destDir = new File("assemble") destDir.mkdir() for (def item : destDir.listFiles()) { item.delete() } moveToAssemble("app/build/outputs/apk", "app-prod-release.apk", "myapp.apk") moveToAssemble("app/build/outputs/mapping/prod/release", "mapping.txt", "myapp-mapping.txt") // new ApkPublisher( packageName: "com.example.myapp", name: "My app", apkName: "myapp.apk", mappingName: "myapp-mapping.txt" ).publish()
// apk task assembleApk(dependsOn: [ ':app:assembleProdRelease' ]) << { println("APK assembled") } // task publishApk(dependsOn: 'classes', type: JavaExec) { main = 'PublishApk' classpath = sourceSets.main.runtimeClasspath } task assembleAndPublishApk() { dependsOn 'assembleApk' dependsOn 'publishApk' tasks.findByName('publishApk').mustRunAfter 'assembleApk' doLast { println("APK successfilly published, find it in /assemble dir") } }
Source: https://habr.com/ru/post/316302/
All Articles