Skip to content

GradleUp/auto-manifest

Repository files navigation

Auto Manifest CI

AndroidManifest.xml file is crucial to define Android specific properties like minSdkVersion, uses-permission etc.

Unfortunately, package property must be defined in AndroidManifest.xml and mandatory for BuildConfig and R class generation. In most of my Gradle modules, AndroidManifest.xml is just 1 line:

<manifest package="foo" />

Here comes AutoManifest Gradle Plugin to rescue 🚀

  • This is not meant for full replacement for AndroidManifest.xml file. It is useful for those 1-liner manifests where you don't have any Activity/Service or permission defined.
  • It is easy to integrate into current projects. If manifest file is present, it will be no-op.
  • You can add it per module or to the root build.gradle. If applied to root, it will even auto generate package names based on module paths.

Configuration

Gradle Plugin Portal

Add the plugin in your build.gradle file (preferably in root one)

Kotlin
plugins {
    id("com.gradleup.auto.manifest") version "<latest-version>"
}

autoManifest {
    // Mandatory packageName
    packageName.set("com.company.example")

    // OPTIONAL //
    // Applies recursively to sub-modules so you don't have to
    // Sub-module package names will be auto generated by using their relative path
    // Default: true
    applyRecursively.set(true)
    
    // OPTIONAL //
    // Using dashes `-` is pretty common in module names. But they are not allowed within Java package names.
    // When this flag is enabled, they will be replaced by a dot. By default, they will be replaced with an underscore.
    // Default: false
    replaceDashesWithDot.set(true)
 
    //
    // Disables auto manifest generation per module (aka subproject)
    //
    // When [applyRecursively] is enabled, if you face any issues on a certain module with custom
    // setup, you can use this to disable for that module.
    // Example in a module:
    //
    // plugins {
    //   id("com.android.library")
    //   id("auto-manifest")
    // }
    // autoManifest.disable()
    //
    disable()
}
Groovy
plugins {
    id 'com.gradleup.auto.manifest' version '<latest-version>'
}

autoManifest {
    // Mandatory packageName
    packageName = 'com.company.example'

    // OPTIONAL //
    // Applies recursively to sub-modules so you don't have to
    // Sub-module package names will be auto generated by using their relative path
    // Default: true
    applyRecursively = true
 
    // OPTIONAL //
    // Using dashes `-` is pretty common in module names. But they are not allowed within Java package names.
    // When this flag is enabled, they will be replaced by a dot. By default, they will be replaced with an underscore.
    // Default: false
    replaceDashesWithDot = true
    
    //
    // Disables auto manifest generation per module (aka subproject)
    //
    // When [applyRecursively] is enabled, if you face any issues on a certain module with custom
    // setup, you can use this to disable for that module.
    // Example in a module:
    //
    // plugins {
    //   id("com.android.library")
    //   id("auto-manifest")
    // }
    // autoManifest.disable()
    //
    disable()
}

Ta-da 🎉 Now just put your Java/Kotlin files and don't worry about the rest.

Nested Modules

To make it easy for you applyRecursively is enabled by default. This will automatically generate AndroidManifest.xml for you in all modules recursively. You have 2 options to override:

  • If you need more info like permissions, Activity definitions, you can continue to have your AndroidManifest.xml and recursive generation will be skipped for that module.
  • If you need to override, you can apply the plugin again in a nested Gradle module and provide a custom packageName

Performance

  • This project uses Gradle's Lazy Task Configuration APIs and do not cause eager task creation in AGP.
  • It generates the AndroidManifest.xml file lazily. That means "zero" impact on Gradle configuration times.
  • It supports build cache so that the files are generated only once and re-used across builds.

Sample App

Checkout the sample app with multi-modules where only the Application module defines AndroidManifest.xml - available here

In Action

Here is the first integration into one of my apps: https://github.com/tasomaniac/OpenLinkWith/commit/5b4029e922c33816fde67400e6c1ac40e015c9b9

Plugin is added in couple of lines and many AndroidManifest.xml files are removed. 🎉