Comprehensive configuration utilities for Android platform development including manifest manipulation, resource management, build configuration, and native code modification. The AndroidConfig namespace provides fine-grained control over Android project files.
Utilities for reading, writing, and manipulating AndroidManifest.xml files.
namespace AndroidConfig.Manifest {
function readAndroidManifestAsync(projectRoot: string): Promise<AndroidManifest>;
function writeAndroidManifestAsync(
projectRoot: string,
manifest: AndroidManifest
): Promise<void>;
function getMainActivityOrThrow(manifest: AndroidManifest): ManifestActivity;
function getMainActivity(manifest: AndroidManifest): ManifestActivity | null;
function getMainApplicationOrThrow(manifest: AndroidManifest): ManifestApplication;
function getMainApplication(manifest: AndroidManifest): ManifestApplication | null;
function addMetaDataItemToMainApplication(
mainApplication: ManifestApplication,
itemName: string,
itemValue: string,
itemType?: 'resource' | 'value'
): ManifestApplication;
function removeMetaDataItemFromMainApplication(
manifest: AndroidManifest,
itemName: string
): AndroidManifest;
}Usage:
const manifest = await AndroidConfig.Manifest.readAndroidManifestAsync(projectRoot);
const mainApplication = AndroidConfig.Manifest.getMainApplicationOrThrow(manifest);
// Add API key to application
AndroidConfig.Manifest.addMetaDataItemToMainApplication(
mainApplication,
"com.google.android.maps.v2.API_KEY",
"your-api-key-here"
);
await AndroidConfig.Manifest.writeAndroidManifestAsync(projectRoot, manifest);Utilities for managing Android permissions in the manifest.
namespace AndroidConfig.Permissions {
function getPermissions(manifest: AndroidManifest): string[];
function setPermissions(
manifest: AndroidManifest,
permissions: string[]
): AndroidManifest;
function addPermission(
manifest: AndroidManifest,
permission: string
): AndroidManifest;
function removePermissions(
manifest: AndroidManifest,
permissions: string[]
): AndroidManifest;
function ensurePermissions(
manifest: AndroidManifest,
permissions: string[]
): AndroidManifest;
function ensurePermission(
manifest: AndroidManifest,
permission: string
): AndroidManifest;
}Usage:
// Add internet permission
AndroidConfig.Permissions.ensurePermission(
manifest,
"android.permission.INTERNET"
);
// Add multiple permissions
AndroidConfig.Permissions.ensurePermissions(manifest, [
"android.permission.CAMERA",
"android.permission.RECORD_AUDIO",
"android.permission.WRITE_EXTERNAL_STORAGE"
]);Utilities for reading and writing XML resource files.
namespace AndroidConfig.Resources {
function readResourcesXMLAsync(options: {
projectRoot: string;
path: string;
}): Promise<ResourceXML>;
function writeResourcesXMLAsync(options: {
projectRoot: string;
path: string;
xml: ResourceXML;
}): Promise<void>;
}Utilities for managing string resources.
namespace AndroidConfig.Strings {
function setStringItem(
strings: ResourceXML,
name: string,
value: string,
options?: { translatable?: boolean }
): ResourceXML;
function getStringItem(
strings: ResourceXML,
name: string
): string | null;
function removeStringItem(
strings: ResourceXML,
name: string
): ResourceXML;
}Utilities for managing color resources.
namespace AndroidConfig.Colors {
function setColorItem(
colors: ResourceXML,
name: string,
value: string
): ResourceXML;
function getColorItem(
colors: ResourceXML,
name: string
): string | null;
function removeColorItem(
colors: ResourceXML,
name: string
): ResourceXML;
}Utilities for managing style resources.
namespace AndroidConfig.Styles {
function getAppThemeLightNoActionBarGroup(styles: ResourceXML): StyleGroup | null;
function setAppThemeLightNoActionBarGroup(
styles: ResourceXML,
styleGroup: StyleGroup
): ResourceXML;
function setStylesItem(
styles: ResourceXML,
name: string,
styleData: StyleData
): ResourceXML;
function getStylesItem(
styles: ResourceXML,
name: string
): StyleData | null;
function removeStylesItem(
styles: ResourceXML,
name: string
): ResourceXML;
}
interface StyleData {
parent?: string;
items: Array<{
name: string;
value: string;
}>;
}Utilities for managing gradle.properties files.
namespace AndroidConfig.Properties {
function parsePropertiesFile(contents: string): PropertiesItem[];
function propertiesListToString(properties: PropertiesItem[]): string;
function getGradlePropertiesAsync(projectRoot: string): Promise<PropertiesItem[]>;
function setGradlePropertiesAsync(
projectRoot: string,
properties: PropertiesItem[]
): Promise<void>;
interface PropertiesItem {
key: string;
value: string;
}
}Utilities for locating and working with Android project file paths.
namespace AndroidConfig.Paths {
function getAndroidManifestFilePath(projectRoot: string): string;
function getResourceFolderAsync(projectRoot: string): Promise<string>;
function getResourceXMLPathAsync(projectRoot: string, options: {
kind: "values" | "values-night";
name: string;
}): Promise<string>;
function getMainActivityAsync(projectRoot: string): Promise<ApplicationProjectFile>;
function getMainApplicationAsync(projectRoot: string): Promise<ApplicationProjectFile>;
function getProjectBuildGradleFilePath(projectRoot: string): string;
function getAppBuildGradleFilePath(projectRoot: string): string;
function getSettingsGradleFilePath(projectRoot: string): string;
function getGradlePropertiesFilePath(projectRoot: string): string;
interface ApplicationProjectFile {
path: string;
contents: string;
language: "java" | "kotlin";
}
interface GradleProjectFile {
path: string;
contents: string;
}
}Utilities for managing app name configuration.
namespace AndroidConfig.Name {
function setName(manifest: AndroidManifest, name: string): AndroidManifest;
function getName(manifest: AndroidManifest): string | null;
}Utilities for managing package name and application ID.
namespace AndroidConfig.Package {
function getPackage(manifest: AndroidManifest): string;
function setPackage(manifest: AndroidManifest, packageName: string): AndroidManifest;
function getApplicationIdAsync(projectRoot: string): Promise<string>;
function setPackageInBuildGradle(
buildGradle: string,
packageName: string
): string;
function withPackageManifest(config: ExpoConfig): ExpoConfig;
function withPackageGradle(config: ExpoConfig): ExpoConfig;
}Utilities for managing app version configuration.
namespace AndroidConfig.Version {
function getVersionCode(manifest: AndroidManifest): number | null;
function setVersionCode(manifest: AndroidManifest, versionCode: number): AndroidManifest;
function getVersionName(manifest: AndroidManifest): string | null;
function setVersionName(manifest: AndroidManifest, versionName: string): AndroidManifest;
}Utilities for managing screen orientation settings.
namespace AndroidConfig.Orientation {
function getOrientation(manifest: AndroidManifest): string | null;
function setOrientation(
manifest: AndroidManifest,
orientation: "portrait" | "landscape" | "sensor" | "unspecified"
): AndroidManifest;
}Utilities for managing status bar configuration.
namespace AndroidConfig.StatusBar {
function getStatusBarColor(styles: ResourceXML): string | null;
function setStatusBarColor(styles: ResourceXML, color: string): ResourceXML;
function getStatusBarBackgroundColor(colors: ResourceXML): string | null;
function setStatusBarBackgroundColor(colors: ResourceXML, color: string): ResourceXML;
function setStatusBarTranslucent(styles: ResourceXML, translucent: boolean): ResourceXML;
}Utilities for managing primary color theme.
namespace AndroidConfig.PrimaryColor {
function setPrimaryColor(colors: ResourceXML, color: string): ResourceXML;
function getPrimaryColor(colors: ResourceXML): string | null;
}Utilities for modifying Java and Kotlin source files.
namespace AndroidConfig.CodeMod {
function addImports(contents: string, imports: string[]): string;
function appendContentsInsideDeclarationBlock(
contents: string,
declaration: string,
newContents: string
): string;
function insertContentsInsideDeclarationBlock(
contents: string,
declaration: string,
newContents: string
): string;
function findCodeBlock(
contents: string,
declaration: string
): { start: number; end: number } | null;
}Usage:
// Add imports to MainActivity
let mainActivityContents = await fs.readFile(mainActivityPath, "utf8");
mainActivityContents = AndroidConfig.CodeMod.addImports(
mainActivityContents,
[
"import com.example.CustomModule;",
"import android.util.Log;"
]
);
// Add code to onCreate method
mainActivityContents = AndroidConfig.CodeMod.appendContentsInsideDeclarationBlock(
mainActivityContents,
"protected void onCreate(Bundle savedInstanceState)",
" CustomModule.initialize(this);"
);import { AndroidConfig } from "@expo/config-plugins";
async function configureAndroidApp(projectRoot: string, config: {
appName: string;
packageName: string;
versionName: string;
versionCode: number;
primaryColor: string;
permissions: string[];
}) {
// Read manifest
const manifest = await AndroidConfig.Manifest.readAndroidManifestAsync(projectRoot);
// Set basic app info
AndroidConfig.Name.setName(manifest, config.appName);
AndroidConfig.Package.setPackage(manifest, config.packageName);
AndroidConfig.Version.setVersionName(manifest, config.versionName);
AndroidConfig.Version.setVersionCode(manifest, config.versionCode);
// Set permissions
AndroidConfig.Permissions.setPermissions(manifest, config.permissions);
// Write manifest back
await AndroidConfig.Manifest.writeAndroidManifestAsync(projectRoot, manifest);
// Update strings.xml
const stringsPath = await AndroidConfig.Paths.getResourceXMLPathAsync(projectRoot, {
kind: "values",
name: "strings"
});
const strings = await AndroidConfig.Resources.readResourcesXMLAsync({
projectRoot,
path: stringsPath
});
AndroidConfig.Strings.setStringItem(strings, "app_name", config.appName);
await AndroidConfig.Resources.writeResourcesXMLAsync({
projectRoot,
path: stringsPath,
xml: strings
});
// Update colors.xml
const colorsPath = await AndroidConfig.Paths.getResourceXMLPathAsync(projectRoot, {
kind: "values",
name: "colors"
});
const colors = await AndroidConfig.Resources.readResourcesXMLAsync({
projectRoot,
path: colorsPath
});
AndroidConfig.Colors.setColorItem(colors, "colorPrimary", config.primaryColor);
await AndroidConfig.Resources.writeResourcesXMLAsync({
projectRoot,
path: colorsPath,
xml: colors
});
}