しかし、これは真実ではないことを報告できてうれしいです。 Android Studioから直接アプリケーションを公開できます! さらに、CIでAndroid Studioを使用せずにこれを実行できます。これは通常のGradleタスクを使用して実行されるためです。
私のソリューションは前の記事で説明したものと似ていますが、javaの代わりにgroovyスクリプトを使用しました。
スクリプトからアプリケーションを公開するには、公開するためのアクセス権を持つユーザーを作成し、認証用のコードで使用する.jsonファイルを取得する必要があります。 特定の記事でそれを取得する方法とGoogle Play Developer APIへのアクセスをアクティブにするために必要なことを確認できます。または、サーバー側でのGoogle Play Billingの使用に関する出版物を読むことができます。グーグルプレイへ。
これからは、サービスアカウントシークレットを含む、欲しがる.jsonファイルが既にあると仮定します。
まず、プロジェクトを準備します。 アプリではなく、ルートプロジェクトのbuild.gradleを使用します。 root / build.gradleを次のようにしましょう:
// 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' }
何が行われた:
1. プラグインの適用:「groovy」
プロジェクトでgroovyコンパイラーをアクティブにします。
2.依存関係-'org.codehaus.groovy:groovy-all:2.4.7'をコンパイルします
Groovyの最新バージョンをプロジェクトにインポートします
3. 依存関係-'com.google.apis:google-api-services-androidpublisher:v2-rev38-1.22.0'をコンパイルします
私たちはGoogleからライブラリをインポートしています。これは実際、Google Playで出版物を扱う機会を提供しています( だけでなく )。
これで、groovyスクリプトとgroovyクラスを作成し、プロジェクトで使用できます。 しかし、最初に、groovyクラスのソースディレクトリを作成し、必要な他のファイルを整理します。
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
Google Playでアプリケーションを公開するには、リリース証明書に署名する必要があります。 しかし、キーストア、外観、およびパスワードをリポジトリに保存したくないのですか? .gitignoreを使用します。 パスワード自体はroot / signing.propertiesファイルに配置されます :
keystore.file=keystore.jks keystore.password=<> key.alias=<_> key.password=<_>
これらのパスワードをファイルから読み取り、 root / app / build.gradleに適切な署名構成を作成します
... 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 } } }
これで、gradle assembleProdReleaseを使用してapkファイルを取得し、Google Playにアップロードできます。
apkが公開するスクリプト自体の作成を始めましょう。 ルート/ src / main / groovy / ApkPublisher.groovyファイルを作成します 。
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" } }
2番目のファイルルート/ src / main / groovy / PublishApk.groovy :
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()
ファイルをダウンロードするスクリプトの準備ができました。 それでは、Gradleタスクの作成に進みましょう。
ルート/ build.gradle
// 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") } }
これで、 gradle assembleAndPublishApkコマンドを実行してapkをアルファチャネルに公開するだけで十分です。 そして、これは開発の各コミットの後でも簡単に行うことができます。 さらに、proguard-mappingファイルをすぐにダウンロードします。
PS他に何を読む?
1.前回の記事-Androidアプリ内課金:モバイルアプリケーションからサーバーの検証とテストまで
2. Google Play Developer APIリファレンス
3. GitHubでのGoogleの例