A library for generating native app code from JavaScript config through Expo config plugins
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
});
}tessl i tessl/npm-expo--config-plugins@11.0.0docs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10