megazord-gradle/README.md

4.4 KiB

Mozilla Application Services megazord Gradle Plugin

Plugin for consuming Mozilla Application Services megazord native libraries.

Overview

Mozilla Application Services publishes many native (Rust) code libraries that stand alone: each published Android ARchive (AAR) contains managed code (classes.jar) and multiple .so library files (one for each supported architecture). That means consuming multiple such libraries entails at least two .so libraries, and each of those libraries includes the entire Rust standard library as well as (potentially many) duplicated dependencies. To save space and allow cross-component native-code Link Time Optimization (LTO, i.e., inlining, dead code elimination, etc) Application Services also publishes composite libraries -- so called megazord libraries or just megazords -- that compose multiple Rust components into a single optimized .so library file. The managed code can be easily configured to use such a megazord without additional changes.

The megazord-gradle plugin makes it easy to consume such megazord libraries.

Getting started

Add the plugin to your root build.gradle, like:

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'gradle.plugin.org.mozilla.megazord-gradle:megazord-gradle:0.1.0'
    }
}

Then add a stanza like:

apply plugin: 'org.mozilla.appservices.megazord-gradle'

to build.gradle files that consume Application Services Android libraries, either directly, like:

dependencies {
    implementation 'org.mozilla.sync15:logins:0.11.2'
    implementation 'org.mozilla.fxaclient:fxaclient:0.11.2'
}

or transitively, like:

dependencies {
    implementation 'org.mozilla.components:service-firefox-accounts:0.34.0'
    implementation 'org.mozilla.components:service-sync-logins:0.34.0'
}

You should see substitutions like:

Substituting 'org.mozilla.appservices.composites:lockbox' for 'org.mozilla.sync15:logins'
Substituting 'org.mozilla.appservices.composites:lockbox' for 'org.mozilla.fxaclient:fxaclient

Configuration

megazord {
    // Define new or modify existing megazord definitions.
    megazords {
        newMegazord {
            moduleIdentifier 'stringGroup:andModule'
            moduleIdentifier 'stringGroup', 'stringModule'
            component 'stringGroup1:andModule1'
            component 'stringGroup1', 'stringModule1'
            component 'stringGroup2:andModule2'
            component 'stringGroup2', 'stringModule2'
            ...
        }
    }

    // Reset to the default megazord definitions.
    useMozillaMegazords()

    // Allow a megazord to be strictly larger than the matched components.
    failIfMegazordIsStrictSuperset = false
}

failIfMegazordIsStrictSuperset

By default, the plugin fails if a configuration has a megazord that matches all the known components but includes additional components. Set this to false to allow such a megazord, like:

megazord {
   failIfMegazordIsStrictSuperset = false
}

This may add additional component dependencies to the configuration.

megazords

New megazord definitions can be defined, and existing megazord definitions modified, using the megazords block. For example, the "lockbox" megazord could be defined like:

megazord {
    megazords {
        lockbox {
            moduleIdentifier 'org.mozilla.appservices.composites:lockbox'
            component 'org.mozilla.fxaclient:fxaclient'
            component 'org.mozilla.sync15:logins'
        }
    }
}

while the existing "reference-browser" megazord could be modified to match the "lockbox" megazord like:

megazord {
    megazords {
        "reference-browser" {
            moduleIdentifier 'org.mozilla.appservices.composites:reference-browser'
            components.clear()
            component 'org.mozilla.fxaclient:fxaclient'
            component 'org.mozilla.sync15:logins'
        }
    }
}