Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support packaging and extracting protos in Android aar (take 2) #443

Merged
merged 10 commits into from
Nov 18, 2020
Merged
Next Next commit
Create an Android library project and an application project base dep…
…ending on it.
voidzcy committed Nov 3, 2020

Unverified

This commit is not signed, but one or more authors requires that any commit attributed to them is signed.
commit 69926430994a0bd0e7f6360630ce82e925c8817d
18 changes: 18 additions & 0 deletions testProjectAndroidDependentBase/androidTest/proto/sample.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
syntax = "proto3";

option java_package = "com.example.tutorial";
option java_outer_classname = "OuterSample";
option java_multiple_files = true;

// From the main sourceSet
import "helloworld.proto";

message Msg {
string foo = 1;
SecondMsg blah = 2;
}

message SecondMsg {
int32 blah = 1;
helloworld.HelloReply reply = 2;
}
274 changes: 274 additions & 0 deletions testProjectAndroidDependentBase/build_base.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
repositories {
maven { url 'https://maven.google.com' }
maven { url "https://plugins.gradle.org/m2/" }
}

buildscript {
repositories {
maven { url 'https://maven.google.com' }
maven { url "https://plugins.gradle.org/m2/" }
}
}

android {
compileSdkVersion 26
buildToolsVersion "26.0.1"

defaultConfig {
applicationId "io.grpc.helloworldexample"
minSdkVersion 7
targetSdkVersion 23
versionCode 1
versionName "1.0"
}

flavorDimensions 'abi', 'version'

productFlavors {
freeapp {
dimension 'version'
}
retailapp {
dimension 'version'
}
x86 {
dimension 'abi'
}
arm {
dimension 'abi'
}
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}

packagingOptions {
exclude 'io/grpc/testing/integration/empty.proto'
exclude 'io/grpc/testing/integration/test.proto'
exclude 'io/grpc/testing/integration/messages.proto'
exclude 'tmp/stuff.proto'
}

// https://github.com/square/okio/issues/58
lintOptions {
warning 'InvalidPackage'
abortOnError false
}

dexOptions {
javaMaxHeapSize "1g"
threadCount 1 // reduce predex thread count to limit memory usage
}
}

protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0-pre2'
}
javalite {
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
}
generateProtoTasks {
all()*.plugins {
javalite { }
}
ofNonTest()*.plugins {
grpc {
// Options added to --grpc_out
option 'lite'
}
}
}
}

dependencies {
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.squareup.okhttp:okhttp:2.7.5'
compile 'javax.annotation:javax.annotation-api:1.2'
compile 'com.google.protobuf:protobuf-lite:3.0.0'
compile 'io.grpc:grpc-core:1.0.0-pre2'
compile 'io.grpc:grpc-stub:1.0.0-pre2'
compile 'io.grpc:grpc-okhttp:1.0.0-pre2'
compile('io.grpc:grpc-protobuf-lite:1.0.0-pre2') {
// Otherwise Android compile will complain "Multiple dex files define ..."
exclude module: "protobuf-lite"
}
compile(project(':testProjectAndroidLibrary')) {
exclude module: "protobuf-lite"
}
protobuf files('lib/protos.jar')
testCompile 'junit:junit:4.12'
}

def assertJavaCompileHasProtoGeneratedDir(Object variant, Collection<String> codegenPlugins) {
rootProject.assertJavaCompileHasProtoGeneratedDir(project, variant.name, variant.javaCompileProvider.get(), codegenPlugins)
}

afterEvaluate {
// 'gradle test' will run the unit tests, which is still experimental in
// Android plugin, and would do nothing with our setup. We make 'test' to
// trigger the "androidTest" Java compile tasks.
android.testVariants.each { testVariant ->
test.dependsOn testVariant.javaCompileProvider
}

test.doLast {
assert [
'generateArmFreeappDebugAndroidTestProto',
'generateArmFreeappDebugUnitTestProto',
'generateArmFreeappReleaseUnitTestProto',
'generateArmFreeappDebugProto',
'generateArmFreeappReleaseProto',
'generateArmRetailappDebugAndroidTestProto',
'generateArmRetailappDebugUnitTestProto',
'generateArmRetailappReleaseUnitTestProto',
'generateArmRetailappDebugProto',
'generateArmRetailappReleaseProto',
'generateX86FreeappDebugAndroidTestProto',
'generateX86FreeappDebugUnitTestProto',
'generateX86FreeappReleaseUnitTestProto',
'generateX86FreeappDebugProto',
'generateX86FreeappReleaseProto',
'generateX86RetailappDebugAndroidTestProto',
'generateX86RetailappDebugUnitTestProto',
'generateX86RetailappReleaseUnitTestProto',
'generateX86RetailappDebugProto',
'generateX86RetailappReleaseProto',
] as Set == protobuf.generateProtoTasks.all().collect({ it.name }) as Set

assert [
'generateArmFreeappDebugAndroidTestProto',
'generateArmFreeappDebugUnitTestProto',
'generateArmFreeappReleaseUnitTestProto',
'generateArmRetailappDebugAndroidTestProto',
'generateArmRetailappDebugUnitTestProto',
'generateArmRetailappReleaseUnitTestProto',
'generateX86FreeappDebugAndroidTestProto',
'generateX86FreeappDebugUnitTestProto',
'generateX86FreeappReleaseUnitTestProto',
'generateX86RetailappDebugAndroidTestProto',
'generateX86RetailappDebugUnitTestProto',
'generateX86RetailappReleaseUnitTestProto',
] as Set == protobuf.generateProtoTasks.ofTest().collect({ it.name }) as Set

assert [
'generateArmFreeappDebugProto',
'generateArmFreeappReleaseProto',
'generateArmRetailappDebugProto',
'generateArmRetailappReleaseProto',
'generateX86FreeappDebugProto',
'generateX86FreeappReleaseProto',
'generateX86RetailappDebugProto',
'generateX86RetailappReleaseProto',
] as Set == protobuf.generateProtoTasks.ofNonTest().collect({ it.name }) as Set

assert [
'generateArmFreeappDebugAndroidTestProto',
'generateArmFreeappDebugUnitTestProto',
'generateArmFreeappReleaseUnitTestProto',
'generateArmFreeappDebugProto',
'generateArmFreeappReleaseProto',
'generateX86FreeappDebugAndroidTestProto',
'generateX86FreeappDebugUnitTestProto',
'generateX86FreeappReleaseUnitTestProto',
'generateX86FreeappDebugProto',
'generateX86FreeappReleaseProto',
] as Set == protobuf.generateProtoTasks.ofFlavor('freeapp').collect({ it.name }) as Set

assert [
'generateArmRetailappDebugAndroidTestProto',
'generateArmRetailappDebugUnitTestProto',
'generateArmRetailappReleaseUnitTestProto',
'generateArmRetailappDebugProto',
'generateArmRetailappReleaseProto',
'generateX86RetailappDebugAndroidTestProto',
'generateX86RetailappDebugUnitTestProto',
'generateX86RetailappReleaseUnitTestProto',
'generateX86RetailappDebugProto',
'generateX86RetailappReleaseProto',
] as Set == protobuf.generateProtoTasks.ofFlavor('retailapp').collect({ it.name }) as Set

assert [
'generateX86FreeappDebugAndroidTestProto',
'generateX86FreeappDebugUnitTestProto',
'generateX86FreeappReleaseUnitTestProto',
'generateX86FreeappDebugProto',
'generateX86FreeappReleaseProto',
'generateX86RetailappDebugAndroidTestProto',
'generateX86RetailappDebugUnitTestProto',
'generateX86RetailappReleaseUnitTestProto',
'generateX86RetailappDebugProto',
'generateX86RetailappReleaseProto',
] as Set == protobuf.generateProtoTasks.ofFlavor('x86').collect({ it.name }) as Set

assert [
'generateArmFreeappDebugAndroidTestProto',
'generateArmFreeappDebugUnitTestProto',
'generateArmFreeappReleaseUnitTestProto',
'generateArmFreeappDebugProto',
'generateArmFreeappReleaseProto',
'generateArmRetailappDebugAndroidTestProto',
'generateArmRetailappDebugUnitTestProto',
'generateArmRetailappReleaseUnitTestProto',
'generateArmRetailappDebugProto',
'generateArmRetailappReleaseProto',
] as Set == protobuf.generateProtoTasks.ofFlavor('arm').collect({ it.name }) as Set

assert [
'generateArmFreeappDebugAndroidTestProto',
'generateArmFreeappDebugUnitTestProto',
'generateArmFreeappDebugProto',
'generateArmRetailappDebugAndroidTestProto',
'generateArmRetailappDebugUnitTestProto',
'generateArmRetailappDebugProto',
'generateX86FreeappDebugAndroidTestProto',
'generateX86FreeappDebugUnitTestProto',
'generateX86FreeappDebugProto',
'generateX86RetailappDebugAndroidTestProto',
'generateX86RetailappDebugUnitTestProto',
'generateX86RetailappDebugProto'
] as Set == protobuf.generateProtoTasks.ofBuildType('debug').collect({ it.name }) as Set

assert [
'generateArmFreeappReleaseProto',
'generateArmFreeappReleaseUnitTestProto',
'generateArmRetailappReleaseProto',
'generateArmRetailappReleaseUnitTestProto',
'generateX86FreeappReleaseProto',
'generateX86FreeappReleaseUnitTestProto',
'generateX86RetailappReleaseProto',
'generateX86RetailappReleaseUnitTestProto',
] as Set == protobuf.generateProtoTasks.ofBuildType('release').collect({ it.name }) as Set

assert ['generateX86FreeappDebugAndroidTestProto'] as Set ==
protobuf.generateProtoTasks.ofVariant('x86FreeappDebugAndroidTest').collect({ it.name }) as Set

// "androidTest" sourceSet is not a flavor
assert [] as Set == protobuf.generateProtoTasks.ofFlavor('androidTest').collect({ it.name }) as Set

// "unitTest" sourceset is not a flavor
assert [] as Set == protobuf.generateProtoTasks.ofFlavor('unitTest').collect({ it.name }) as Set

android.applicationVariants.each { variant ->
assertJavaCompileHasProtoGeneratedDir(variant, ['javalite', 'grpc'])
}

android.testVariants.each { variant ->
assertJavaCompileHasProtoGeneratedDir(variant, ['javalite'])
}
}
}
22 changes: 22 additions & 0 deletions testProjectAndroidDependentBase/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.grpc.helloworldexample" >

<uses-permission android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Base.V7.Theme.AppCompat.Light" >
<activity
android:name=".HelloworldActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
55 changes: 55 additions & 0 deletions testProjectAndroidDependentBase/main/proto/helloworld.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// Copyright 2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

syntax = "proto3";

// From testProject: src/nano/proto
import "messages.proto";

option java_package = "io.grpc.helloworldexample";

package helloworld;

// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
string name = 1;
// Uses message type from messages.proto
grpc.testing.SimpleContext context = 2;
}

// The response message containing the greetings
message HelloReply {
string message = 1;
}
Loading