Skip to content

Manifest

Represents parsed AndroidManifest.xml information.

Overview

The Manifest class provides access to the parsed AndroidManifest.xml file, including package information, version, permissions, and application metadata.

typescript
import { Apk } from "node-apk";

const apk = new Apk("app.apk");
const manifest = await apk.getManifestInfo();

Properties

package

typescript
readonly package: string

The unique package identifier for the application.

Example

typescript
console.log(`Package: ${manifest.package}`);
// Output: Package: com.example.myapp

versionCode

typescript
readonly versionCode: number

The internal version number. This value is used by the system to determine which version is newer.

Example

typescript
console.log(`Version Code: ${manifest.versionCode}`);
// Output: Version Code: 42

versionName

typescript
readonly versionName: string

The version name shown to users.

Example

typescript
console.log(`Version: ${manifest.versionName}`);
// Output: Version: 2.5.1

applicationLabel

typescript
readonly applicationLabel: string | number

The application label. This can be either:

  • A string if the label is hardcoded
  • A number (resource ID) if the label references a string resource

Example

typescript
const label = manifest.applicationLabel;

if (typeof label === "number") {
  // Resolve from resources
  const resources = await apk.getResources();
  const resolved = resources.resolve(label);
  console.log(`App Name: ${resolved[0]?.value}`);
} else {
  console.log(`App Name: ${label}`);
}

TIP

Use apk.getLabel() to automatically resolve the label from resources.


applicationIcon

typescript
readonly applicationIcon: number

The resource ID of the application icon.

Example

typescript
const resources = await apk.getResources();
const iconResources = resources.resolve(manifest.applicationIcon);

for (const res of iconResources) {
  console.log(`Icon: ${res.value} (${res.locale?.language})`);
}

TIP

Use apk.getLauncherIcon() to extract the icon directly.


permissions

typescript
readonly permissions: Iterable<string>

An iterable of all permissions required by the application.

Example

typescript
console.log("Permissions:");
for (const permission of manifest.permissions) {
  console.log(`  - ${permission}`);
}
// Output:
// Permissions:
//   - android.permission.INTERNET
//   - android.permission.CAMERA
//   - android.permission.ACCESS_FINE_LOCATION

Convert to array:

typescript
const permsArray = [...manifest.permissions];
console.log(`Total permissions: ${permsArray.length}`);

receivers

typescript
readonly receivers: Iterable<Receiver>

An iterable of all broadcast receivers declared in the manifest.

Example

typescript
for (const receiver of manifest.receivers) {
  console.log(`Receiver: ${receiver.name}`);
  console.log(`  Permission: ${receiver.permission}`);
  console.log(`  Exported: ${receiver.exported}`);
}

raw

typescript
readonly raw: XmlElement

The raw binary XML element tree. Use this for properties without built-in accessors.

Example

typescript
// Access raw XML structure
console.log(JSON.stringify(manifest.raw, null, 2));

// Access specific elements
const activities = manifest.raw.children["activity"];
for (const activity of activities ?? []) {
  console.log(`Activity: ${activity.attributes["name"]}`);
}

Receiver Class

Represents a broadcast receiver from the manifest.

Properties

typescript
class Receiver {
  readonly name: string;           // Class name of the receiver
  readonly permission: string;     // Required permission (may be undefined)
  readonly exported: boolean;      // Whether the receiver is exported
  readonly raw: XmlElement;        // Raw XML element
}

Example

typescript
for (const receiver of manifest.receivers) {
  if (receiver.exported) {
    console.log(`Exported receiver: ${receiver.name}`);
    if (receiver.permission) {
      console.log(`  Requires: ${receiver.permission}`);
    }
  }
}

Complete Example

typescript
import { Apk } from "node-apk";

async function analyzeApk(path: string) {
  const apk = new Apk(path);
  const manifest = await apk.getManifestInfo();

  console.log("=== APK Information ===");
  console.log(`Package: ${manifest.package}`);
  console.log(`Version: ${manifest.versionName} (${manifest.versionCode})`);

  console.log("\n=== Permissions ===");
  const permissions = [...manifest.permissions];
  console.log(`Total: ${permissions.length}`);
  for (const perm of permissions) {
    console.log(`  - ${perm}`);
  }

  console.log("\n=== Receivers ===");
  for (const receiver of manifest.receivers) {
    console.log(`  ${receiver.name}`);
    if (receiver.exported) {
      console.log(`    ⚠️ Exported`);
    }
  }

  // Use raw access for custom elements
  console.log("\n=== Activities ===");
  const activities = manifest.raw.children["activity"] ?? [];
  console.log(`Total: ${activities.length}`);
}

analyzeApk("app.apk");

Released under the MIT License.