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.
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.
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
- 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.
Checkout the sample app with multi-modules where only the Application module defines AndroidManifest.xml
- available
here
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. 🎉