Coder Social home page Coder Social logo

grab / grazel Goto Github PK

View Code? Open in Web Editor NEW
272.0 11.0 21.0 5.18 MB

A tool to migrate Android projects from Gradle to Bazel incrementally and automatically

Home Page: https://grab.github.io/grazel/

License: Other

Kotlin 93.19% Starlark 6.73% Java 0.08%
bazel bazel-migration gradle-to-bazel android gradle gradle-plugin kotlin android-bazel

grazel's Introduction

Grazel

Grazel stands for Gradle to Bazel. A Gradle plugin to migrate Android projects to Bazel build system in an incremental and automated fashion.

Maven Central

Components

  • Gradle plugin
  • A Kotlin Starlark DSL to generate Starlark code in a type-safe way.
  • Grab Bazel Common - Custom rules to bridge the gap between Gradle/Bazel.

Features

  • Generate BUILD.bazel, WORKSPACE for given Android project and reduce the overall migration effort.
  • Setup hybrid build to build part of project graph to build with Bazel and rest with Gradle.
  • Minimal source changes to codebase - supported by Grab Bazel Common.
  • Gradle Configuration as source of truth.

For documentation and usage instructions, please visit website.

How it works

It works by automatically generating Bazel scripts for given Android project based on your Gradle configuration. For simple projects, it should be able to migrate, fully build and launch the app with bazel mobile-install //<target-name>.

For example, for the following Gradle configuration:

apply plugin: "com.android.library"
apply plugin: "kotlin-android"

android {
    compileSdkVersion rootProject.compileSdk
    defaultConfig {
        minSdkVersion rootProject.minSdk
        targetSdkVersion rootProject.targetSdk
        versionCode 1
        versionName "1.0"
    }
}

dependencies {
    implementation project(":app")
    implementation project(":base")
    implementation "androidx.test.espresso:espresso-idling-resource:3.2.0"
}

Grazel's migrateToBazel task generates the following build script:

load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library")

kt_android_library(
    name = "quiz",
    srcs = glob([
        "src/main/java/**/*.kt",
    ]),
    custom_package = "com.google.samples.apps.topeka.quiz",
    manifest = "src/main/AndroidManifest.xml",
    resource_files = glob([
        "src/main/res/**",
    ]),
    visibility = [
        "//visibility:public",
    ],
    deps = [
        "//app",
        "//base",
        "@maven//:androidx_test_espresso_espresso_idling_resource",
    ],
)

See migration capabilities for supported features. In advanced cases, where entire project might not be migratable, it migrates part of the graph and sets up hybrid build where part of the graph can be built with Bazel and rest with Gradle.

Resources

License

Copyright 2022 Grabtaxi Holdings PTE LTD (GRAB)

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.

grazel's People

Contributors

arunkumar9t2 avatar marinashaposhnikova avatar minkuan88 avatar minkuanlim-grabtaxi avatar mohamadk avatar mohammadkahelghi-grabtaxi avatar msfjarvis avatar qichuan avatar rifqifahmi-grabtaxi avatar rifqimfahmi avatar roscrazy avatar vanminh-grabtaxi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

grazel's Issues

Grazel not supporting private repositories

I'm trying to migrate to bazel, but I cannot find a way of adding private repo, it seems like rules_jvm_external does support this ->

maven_install(
    artifacts = [
        "junit:junit:4.12",
        "androidx.test.espresso:espresso-core:3.1.1",
        "org.hamcrest:hamcrest-library:1.3",
    ],
    repositories = [
        # Private repositories are supported through HTTP Basic auth
        "http://username:password@localhost:8081/artifactory/my-repository",
        "https://maven.google.com",
        "https://repo1.maven.org/maven2",
    ],
)

Is it missing or I is it me who missed it in the docs?

Thanks

desugar_java8 failed on executing kapt dependencies

I got the following error when I ran bazelisk mobile-install:

ERROR: /private/var/tmp/*/738fc54fee5051b993b283099c23f8de/external/maven/BUILD:9056:11: Desugaring external/maven/v1/https/repo1.maven.org/maven2/com/google/auto/auto-common/0.10/auto-common-0.10.jar for Android failed: (Exit 1): desugar_java8 failed: error executing command 
  (cd /private/var/tmp/*/738fc54fee5051b993b283099c23f8de/execroot/doc_android_client && \
  exec env - \
    PATH=/Users/*/Library/Caches/bazelisk/downloads/bazelbuild/bazel-5.1.1-darwin-x86_64/bin:/Users/*/.bytebm/bin:/Users/*/.rvm/gems/ruby-2.5.0/bin:/Users/*/.rvm/gems/ruby-2.5.0@global/bin:/Users/*/.rvm/rubies/ruby-2.5.0/bin:/Users/*/.nvm/versions/node/v12.21.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/puppetlabs/bin:/Library/Apple/usr/bin:/Users/*/.rvm/bin:/Users/*/library/android/sdk/tools/bin:/Users/*/library/android/sdk/platform-tools:/Users/*/Library/Android/sdk/tools:/Users/*/Tools/gradle-profiler/bin:/Users/*/bin:/Users/*/Tools:/Users/*/as.sh:/Users/*/.rvm/bin \
  bazel-out/darwin-opt-exec-2B5CBBC6/bin/external/bazel_tools/tools/android/desugar_java8 @bazel-out/android-armeabi-v7a-fastbuild/bin/external/maven/_dx/com_google_auto_auto_common/auto-common-0.10.jar_desugared.jar-0.params)
# Configuration: 3d1e1e8c918685c3805362c4c2aea87c66c0efef8a46a537f832c4b02b91eb91
# Execution platform: @local_config_platform//:host
java.lang.IllegalStateException: Couldn't desugar invokedynamic for com/google/auto/common/GeneratedAnnotationSpecs.apply using java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (6) with arguments [(Ljava/lang/Object;)Ljava/lang/Object;, com/squareup/javapoet/AnnotationSpec$Builder.build()Lcom/squareup/javapoet/AnnotationSpec; (5), (Lcom/squareup/javapoet/AnnotationSpec$Builder;)Lcom/squareup/javapoet/AnnotationSpec;]
	at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:474)
	at org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(MethodVisitor.java:461)
	at org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(MethodVisitor.java:461)
	at com.google.devtools.build.android.desugar.strconcat.IndyStringConcatDesugaring$IndifiedStringConcatInvocationConverter.visitInvokeDynamicInsn(IndyStringConcatDesugaring.java:141)
	at org.objectweb.asm.MethodVisitor.visitInvokeDynamicInsn(MethodVisitor.java:461)
	at org.objectweb.asm.ClassReader.readCode(ClassReader.java:2444)
	at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1487)
	at org.objectweb.asm.ClassReader.accept(ClassReader.java:717)
	at com.google.devtools.build.android.desugar.Desugar.desugarClassesInInput(Desugar.java:542)
	at com.google.devtools.build.android.desugar.Desugar.desugarOneInput(Desugar.java:319)
	at com.google.devtools.build.android.desugar.Desugar.desugar(Desugar.java:239)
	at com.google.devtools.build.android.desugar.Desugar.processRequest(Desugar.java:1012)
	at com.google.devtools.build.android.desugar.Desugar.runPersistentWorker(Desugar.java:972)
	at com.google.devtools.build.android.desugar.Desugar.main(Desugar.java:950)
Caused by: java.lang.ClassNotFoundException: Class com.squareup.javapoet.AnnotationSpec$Builder not found
	at com.google.devtools.build.android.desugar.io.HeaderClassLoader.findClass(HeaderClassLoader.java:53)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at com.google.devtools.build.android.desugar.LambdaDesugaring.loadFromInternal(LambdaDesugaring.java:337)
	at com.google.devtools.build.android.desugar.LambdaDesugaring.access$500(LambdaDesugaring.java:56)
	at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.toMethodHandle(LambdaDesugaring.java:655)
	at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.toJvmMetatype(LambdaDesugaring.java:644)
	at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:408)
	... 13 more
Target //assemble/doc-sdk-demo:doc-sdk-demo failed to build

I think desugar should only process runtime dependencies. Is anything wrong with my grazel configuration?

grazel {
    android {
        ndkEnable = false
    }
    rules {
        bazelCommon {
            gitRepository {
                commit = "3568b6190f4f805d2c18af243e79b506dd99bfce"
                remote = "https://github.com/grab/grab-bazel-common.git"
            }
        }
        mavenInstall {
            httpArchiveRepository {
                sha256 = "f36441aa876c4f6427bfb2d1f2d723b48e9d930b62662bf723ddfb8fc80f0140"
                stripPrefix = "rules_jvm_external-4.1"
                url = "https://github.com/bazelbuild/rules_jvm_external/archive/4.1.zip"
            }
            resolveTimeout = 5400
            artifactPinning {
                enabled.set(true)
            }
            versionConflictPolicy = "pinned"
        }
        kotlin {
            gitRepository {
                commit = "eae21653baad4b403fee9e8a706c9d4fbd0c27c6"
                remote = "https://github.com/bazelbuild/rules_kotlin.git"
            }
            compiler {
                version = "1.4.20"
                sha = "46720991a716e90bfc0cf3f2c81b2bd735c14f4ea6a5064c488e04fd76e6b6c7"
            }
            kotlinC {
                useIr = false
            }
            toolchain {
                enabled = true
                apiVersion = "1.4"
                reportUnusedDeps = "off"
                strictKotlinDeps = "off"
                abiJars = true
                multiplexWorkers = true
                languageVersion = "1.4"
                jvmTarget = "1.8"
            }
        }
    }
}

Look forward to your kind reply.

Sample Application Crashes at runtime

I'm trying to get the sample android application running happily. The only change I've made to the repo is updating build_tools_version to 30.0.3 from 30.0.2 in the WORKSPACE file.

Running: android 8.1.0
Installing with: bazel mobile-install //sample-android:sample-android

The app crashes almost immediately after starting. The stack trace I see immediately is:

2022-08-22 14:10:30.834 31847-31847/com.grab.grazel.android.sample E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.grab.grazel.android.sample, PID: 31847
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.grab.grazel.android.sample/com.grab.grazel.android.sample.MainActivity}: android.view.InflateException: Binary XML file line #17: Binary XML file line #17: Error inflating class androidx.constraintlayout.widget.ConstraintLayout
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: android.view.InflateException: Binary XML file line #17: Binary XML file line #17: Error inflating class androidx.constraintlayout.widget.ConstraintLayout
     Caused by: android.view.InflateException: Binary XML file line #17: Error inflating class androidx.constraintlayout.widget.ConstraintLayout
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at android.view.LayoutInflater.createView(LayoutInflater.java:647)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:699)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195)
        at com.grab.grazel.android.sample.MainActivity.onCreate(MainActivity.kt:51)
        at android.app.Activity.performCreate(Activity.java:7036)
        at android.app.Activity.performCreate(Activity.java:7027)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/constraintlayout/widget/R$styleable;
        at androidx.constraintlayout.widget.ConstraintLayout.init(ConstraintLayout.java:590)
        at androidx.constraintlayout.widget.ConstraintLayout.<init>(ConstraintLayout.java:567)
        at java.lang.reflect.Constructor.newInstance0(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334) 
        at android.view.LayoutInflater.createView(LayoutInflater.java:647) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:699) 
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195) 
        at com.grab.grazel.android.sample.MainActivity.onCreate(MainActivity.kt:51) 
        at android.app.Activity.performCreate(Activity.java:7036) 
        at android.app.Activity.performCreate(Activity.java:7027) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
2022-08-22 14:10:30.835 31847-31847/com.grab.grazel.android.sample E/AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.constraintlayout.widget.R$styleable" on path: DexPathList[[dex file "/data/local/tmp/incrementaldeployment/com.grab.grazel.android.sample/dex/incremental_classes5.dex", dex file "/data/local/tmp/incrementaldeployment/com.grab.grazel.android.sample/dex/incremental_classes3.dex", dex file "/data/local/tmp/incrementaldeployment/com.grab.grazel.android.sample/dex/incremental_classes4.dex", dex file "/data/local/tmp/incrementaldeployment/com.grab.grazel.android.sample/dex/incremental_classes1.dex", dex file "/data/local/tmp/incrementaldeployment/com.grab.grazel.android.sample/dex/incremental_classes2.dex"],nativeLibraryDirectories=[/data/user/0/com.grab.grazel.android.sample/lib, /system/lib, /vendor/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)
        at com.google.devtools.build.android.incrementaldeployment.IncrementalClassLoader$DelegateClassLoader.findClass(IncrementalClassLoader.java:57)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        	... 26 more

I want to check to see if the sample app is working for others, and if it is, what could I be doing differently.

Does Grazel support Bazel 6.0, rules_kotlin 1.7.0?

Hello maintainers,
I've been migrating some of my modules to Bazel, and they are successfully generating .jar file. But when I'm using Grazel, it is not detected jar files.

Starting a Gradle Daemon, 3 incompatible Daemons could not be reused, use --status for details
Configuration cache is an incubating feature.
Calculating task graph as no configuration cache is available for tasks: tasks

> Configure project :
Running hybrid build
Running bazelisk build //...
Starting local Bazel server and connecting to it...

INFO: Invocation ID: 95ee5368-dd3f-4783-b766-e731fb792ba4

DEBUG: /private/var/tmp/_bazel_albetjanuar/ca846914b849faaaa2037805183bc87b/external/io_bazel_rules_kotlin_master/src/main/starlark/release_archive/repository.bzl:45:14: build Thu Feb  2 08:29:25 WIB 2023

Loading: 

Loading: 0 packages loaded

Analyzing: 159 targets (55 packages loaded, 0 targets configured)

Analyzing: 159 targets (126 packages loaded, 8025 targets configured)

INFO: Analyzed 159 targets (127 packages loaded, 8904 targets configured).

INFO: Found 159 targets...

[4 / 238] [Prepa] BazelWorkspaceStatusAction stable-status.txt

[1,191 / 3,304] checking cached actions

INFO: Elapsed time: 6.977s, Critical Path: 1.19s

INFO: 1 process: 1 internal.

INFO: Build completed successfully, 1 total action

Found aar targets : [//:dagger-android.aar, //:dagger-android-support.aar]
Running bazelisk build //:dagger-android.aar //:dagger-android-support.aar
INFO: Invocation ID: 12e9cd86-cd4c-4212-9449-d618516cf754

This is one of BUILD.bazel file.

load("@rules_jvm_external//:defs.bzl", "artifact")
load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library")

kt_android_library(
    name = "box",
    srcs = glob([
        "src/*.kt",
    ]),
    custom_package = "core.ui.box",
    manifest = "AndroidManifest.xml",
    plugins = ["//:jetpack_compose_compiler_plugin"],
    visibility = [
        "//visibility:public",
    ],
    deps = [
        artifact("androidx.compose.foundation:foundation"),
        artifact("androidx.compose.runtime:runtime"),
    ],
)

Can you guys give me any pointer? Thanks
cc @arunkumar9t2

Grazel for non-android projects?

Hello,

I was wondering if Grazel could be used for gradle projects unrelated to Android? It's not clear how android-specific Grazel is.

./gradlew migrateToBazel and dynamic modules

Hello,

I have integraded grazel in a multi module project but I got failure when running the gradle task ./gradlew migrateToBazel
this is the stack trace

Caused by: java.util.NoSuchElementException: List contains no element matching the predicate.
        at com.grab.grazel.migrate.android.DefaultAndroidManifestParser.androidManifestFile(AndroidManifestParser.kt:86)
        at com.grab.grazel.migrate.android.DefaultAndroidManifestParser.parsePackageName(AndroidManifestParser.kt:49)
        at com.grab.grazel.migrate.android.DefaultAndroidLibraryDataExtractor.extract(AndroidLibraryDataExtractor.kt:84)
        at com.grab.grazel.migrate.android.DefaultAndroidLibraryDataExtractor.extract(AndroidLibraryDataExtractor.kt:65)
        at com.grab.grazel.migrate.builder.KtAndroidLibTargetBuilder.build(KtAndroidLibTargetBuilder.kt:69)
        at com.grab.grazel.migrate.internal.ProjectBazelFileBuilder.build(ProjectBazelFileBuilder.kt:39)
        at com.grab.grazel.tasks.internal.GenerateBazelScriptsTask.action(GenerateBazelScriptsTask.kt:65)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:555)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:540)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:523)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)


Hybrid builds does not work after variant specific Bazel targets support was added.

Hybrid build used to work on many heuristic assumptions especially with target names and that has since changed since we added android variant specific targets in Bazel. Due to this name change, dependency substitution no longer work correctly and probably needs review on how to link bazel built artifacts for Gradle use considering recent changes.

A proper approach might be to handle this in bazel-common similar to how databinding aar was handled and reduce the implementation details in grazel for scalability.

BUILD.bazel not generated.

Problem 1.
Not sure why this is happening but it seems like some of my modules getting the Deleted test/test_fixtures_ui/BUILD.bazel and I don;t see the migrated BUILD.bazel file

> Task :test:test_fixtures_ui:generateBazelScripts
Deleted test/test_fixtures_ui/BUILD.bazel

> Task :test:test_fixtures:generateBazelScripts
Generated test/test_fixtures/BUILD.bazel

my config

grazel {
    android {
        features {
            dataBinding = true
        }
        variantFilter {
            this.setIgnore(name != "release" && name != "prodEnv")
        }
        ndkApiLevel = 28
    }

    rules {
        bazelCommon {
            gitRepository {
                commit = "646475fa68b984f476871f0e8073234e8cae559c" // Commit hash
                remote = "https://github.com/grab/grab-bazel-common.git"
            }
        }
        test {
            enableTestMigration = true
            detectSourceSets = true
        }
        dependencies {
            overrideArtifactVersions.add("androidx.navigation:navigation-runtime:2.3.2")
        }
        mavenInstall {
            httpArchiveRepository {
                sha256 = "b17d7388feb9bfa7f2fa09031b32707df529f26c91ab9e5d909eb1676badd9a6"
                stripPrefix = "rules_jvm_external-4.5"
                url = "https://github.com/bazelbuild/rules_jvm_external/archive/4.5.zip"
            }
            artifactPinning {
                enabled.set(false)
            }
            versionConflictPolicy = "pinned"
        }
    }

Problem 2.

When I enable artifactPinning I get dependency conflict ->

Error in fail: Error while fetching artifact with coursier: Resolution error: Conflicting dependencies:
androidx.navigation:navigation-runtime:2.3.2 or [2.3.0] or [2.4.0] wanted by

  androidx.hilt:hilt-navigation:1.0.0 wants 2.3.2
  └─ androidx.hilt:hilt-navigation-compose:1.0.0

  androidx.navigation:navigation-fragment:2.3.0 wants [2.3.0]
  └─ com.datadoghq:dd-sdk-android:1.15.0

  androidx.navigation:navigation-runtime-ktx:2.4.0 wants [2.4.0]
  ├─ androidx.navigation:navigation-compose:2.4.0 wants androidx.navigation:navigation-runtime-ktx:[2.4.0]
  │  └─ androidx.hilt:hilt-navigation-compose:1.0.0
  └─ com.datadoghq:dd-sdk-android:1.15.0 wants androidx.navigation:navigation-runtime-ktx:2.3.0

but adding overrideArtifactVersions.add("androidx.navigation:navigation-runtime:2.3.2") doesn't work at all.

and I do get the same

> Task :test:test_fixtures_ui:generateBazelScripts
Deleted test/test_fixtures_ui/BUILD.bazel

NoSuchMethodError for getSigningConfig() when running migrateToBazel

Got the following exception when running ./gradlew migrateToBazel against a multi-module Android project:


FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:generateBazelScripts'.
> 'com.android.builder.model.SigningConfig com.android.builder.model.BuildType.getSigningConfig()'

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:generateBazelScripts'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:188)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:186)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:174)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)
Caused by: java.lang.NoSuchMethodError: 'com.android.builder.model.SigningConfig com.android.builder.model.BuildType.getSigningConfig()'
        at com.grab.grazel.migrate.android.DefaultKeyStoreExtractor.extract(KeyStoreExtractor.kt:48)
        at com.grab.grazel.migrate.android.DefaultAndroidBinaryDataExtractor.extract(AndroidBinaryDataExtractor.kt:77)
        at com.grab.grazel.migrate.builder.AndroidBinaryTargetBuilder.buildAndroidBinaryTargets(AndroidBinaryTargetBuilder.kt:81)
        at com.grab.grazel.migrate.builder.AndroidBinaryTargetBuilder.build(AndroidBinaryTargetBuilder.kt:65)
        at com.grab.grazel.migrate.internal.ProjectBazelFileBuilder.build(ProjectBazelFileBuilder.kt:39)
        at com.grab.grazel.tasks.internal.GenerateBazelScriptsTask.action(GenerateBazelScriptsTask.kt:60)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:502)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:74)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:74)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:487)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:470)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:106)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:249)
        at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
        at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:50)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:58)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:39)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:180)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:75)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:46)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:29)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:105)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:98)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:37)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:85)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:42)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:92)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:114)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:73)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:47)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:92)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:92)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:33)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:43)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:31)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution$2.withWorkspace(ExecuteActionsTaskExecuter.java:284)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:185)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:174)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)

Make `migrateToBazel` and dependant tasks cacheable.

Currently explicitly caching is disabled due to complexity but we need to consider adding task inputs and migrate to property API where needed to ensure migrateToBazel provides fast local development loop.

  1. Separate resolve dependencies into separate aggregating task and make it cacheable
  2. Establishing input and output for generator and formatters.
  3. Make artifact pinning cacheable by making WORKSPACE as the input and maven_install.json as the output.

Project scope

Generate BUILD.bazel, WORKSPACE for given Android project and reduce the overall migration effort.

In the README.md it is explained that the tool will generate BUILD.bazel for given android project, can this be used or adapted for general gradle projects with multiple components etc. ?

Generate accurate `jetify_include_list`

Currently all artifacts are put in jetify_include_list whether they use old support libs are not. We can use ResolvedComponentResult API to traverse transitives of each artifact and determine jetify is really needed or not.

Rewrite JetifierDataExtractor to be cacheable Gradle task preferably.

Blocked by #89

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.