diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..d6aea25
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.anarres.gradle.plugin.jarjar.JarjarTask
+
+import static androidx.build.SupportConfig.*
+import static androidx.build.dependencies.DependenciesKt.*
+
+buildscript {
+    dependencies {
+        classpath('gradle.plugin.com.google.protobuf:protobuf-gradle-plugin:0.8.8')
+        classpath('org.anarres.jarjar:jarjar-gradle:1.0.1')
+    }
+}
+
+plugins {
+    id('com.android.library')
+    id('com.google.protobuf')
+    id('org.anarres.jarjar')
+}
+
+android {
+    buildToolsVersion BUILD_TOOLS_VERSION
+    compileSdkVersion COMPILE_SDK_VERSION
+    defaultConfig {
+        minSdkVersion DEFAULT_MIN_SDK_VERSION
+        targetSdkVersion TARGET_SDK_VERSION
+        testInstrumentationRunner INSTRUMENTATION_RUNNER
+    }
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_1_8
+        targetCompatibility = JavaVersion.VERSION_1_8
+    }
+    sourceSets {
+        main {
+            java.srcDir 'java/src/'
+            manifest.srcFile 'AndroidManifest.xml'
+            proto.srcDir 'proto/'
+        }
+        androidTest.java.srcDir 'java/tests/instrumentation/'
+    }
+}
+
+dependencies {
+    api('androidx.annotation:annotation:1.1.0')
+
+    implementation project(':icing:nativeLib')
+    implementation('com.google.protobuf:protobuf-javalite:3.10.0')
+
+    androidTestImplementation(ANDROIDX_TEST_CORE)
+    androidTestImplementation(ANDROIDX_TEST_RULES)
+    androidTestImplementation(TRUTH)
+}
+
+protobuf {
+    protoc {
+        artifact = 'com.google.protobuf:protoc:3.10.0'
+    }
+
+    generateProtoTasks {
+        all().each { task ->
+            task.builtins {
+                java {
+                    option 'lite'
+                }
+            }
+        }
+    }
+}
+
+// Create jarjar artifact for all variants (debug/release)
+android.libraryVariants.all { variant ->
+    def variantName = variant.name
+    def suffix = variantName.capitalize()
+    def jarjarTask = tasks.create("jarjar${suffix}", JarjarTask) {
+        destinationName "icing-java-${variantName}-jarjar.jar"
+        from 'com.google.protobuf:protobuf-javalite:3.10.0'
+        from files(variant.javaCompileProvider.get().destinationDir)
+        dependsOn variant.javaCompileProvider.get()
+        classRename 'com.google.protobuf.**', 'com.google.android.icing.protobuf.@1'
+    }
+
+    def jarjarConf = configurations.register("jarjar${suffix}")
+    artifacts.add("${jarjarConf.name}", jarjarTask.destinationPath) {
+        name "icing-java-${variantName}-jarjar"
+        type 'jar'
+        builtBy jarjarTask
+    }
+}
