adbkit-apkreader provides a Node.js API for extracting information from Android APK files. For example, it allows you to read the AndroidManifest.xml
of an existing APK file.
Install via NPM:
npm install --save adbkit-apkreader
Note that while adbkit-apkreader is written in CoffeeScript, it is compiled to JavaScript before being published to NPM, which means that you are not required to use CoffeeScript.
var util = require('util')
var ApkReader = require('adbkit-apkreader')
var reader = ApkReader.readFile('HelloApp.apk')
var manifest = reader.readManifestSync()
console.log(util.inspect(manifest, { depth: null }))
Alternate syntax to manually creating an ApkReader instance. Currently, only files are supported, but support for streams might be added at some point.
- file The path to the APK file.
- Throws:
Error
on error (e.g. if the file is not valid) - Returns: An
ApkReader
instance.
Manually construct an ApkReader
instance. Useful for testing and/or playing around. Normally you would use ApkReader.readFile(file)
to create the instance.
- file The path to the APK file.
- Throws:
Error
on error (e.g. if the file is not valid) - Returns: N/A
Synchronously reads and parses the AndroidManifest.xml
file inside the APK and returns a simplified object representation of it.
- Throws:
Error
(e.g. if parsing was unsuccessful) - Returns: A JavaScript
Object
representation of the manifest. See example output below:
{ versionCode: 1,
versionName: '1.0',
package: 'com.example.hello.helloapp.app',
usesPermissions: [],
permissions: [],
permissionTrees: [],
permissionGroups: [],
instrumentation: null,
usesSdk: { minSdkVersion: 7, targetSdkVersion: 19 },
usesConfiguration: null,
usesFeatures: [],
supportsScreens: null,
compatibleScreens: [],
supportsGlTextures: [],
application:
{ theme: 'resourceId:0x7f0b0000',
label: 'resourceId:0x7f0a000e',
icon: 'resourceId:0x7f020057',
debuggable: true,
allowBackup: true,
activities:
[ { label: 'resourceId:0x7f0a000e',
name: 'com.example.hello.helloapp.app.MainActivity',
intentFilters:
[ { actions: [ { name: 'android.intent.action.MAIN' } ],
categories: [ { name: 'android.intent.category.LAUNCHER' } ],
data: [] } ],
metaData: [] } ],
activityAliases: [],
launcherActivities:
[ { label: 'resourceId:0x7f0a000e',
name: 'com.example.hello.helloapp.app.MainActivity',
intentFilters:
[ { actions: [ { name: 'android.intent.action.MAIN' } ],
categories: [ { name: 'android.intent.category.LAUNCHER' } ],
data: [] } ],
metaData: [] } ],
services: [],
receivers: [],
providers: [],
usesLibraries: [] } }
Synchronously reads and parses the binary XML file at the given path inside the APK file. Attempts to be somewhat compatible with the DOM API.
- path The path to the binary XML file inside the APK. For example, giving
AndroidManifest.xml
as the path would parse the manifest (but you'll probably want to usereader.readManifestSync()
instead). - Throws:
Error
(e.g. if parsing was unsuccessful) - Returns: A JavaScript
Object
representation of the root node of the XML file. All nodes including the root node have the following properties:- namespaceURI The namespace URI or
null
if none. - nodeType
1
for element nodes,2
for attribute nodes, and4
for CData sections. - nodeName The node name.
- For element nodes, the following additional properties are present:
- attributes An array of attribute nodes.
- childNodes An array of child nodes.
- For attribute nodes, the following additional properties are present:
- name The attribute name.
- value The attribute value, if possible to represent as a simple value.
- typedValue May be available when the attribute represents a complex value. See android.util.TypedValue for more information. Has the following properties:
- value The value, which might
null
,String
,Boolean
,Number
or even anObject
for the most complex types. - type A
String
representation of the type of the value. - rawType A raw integer presentation of the type of the value.
- value The value, which might
- For CData nodes, the following additional properties are present:
- data The CData.
- typedValue May be available if the section represents a more complex type. See above for details.
- namespaceURI The namespace URI or
- android.util.TypedValue For more information about value types.
- Dong Liu's excellent Java-based APK parser, which was used as a reference implementation.
- A detailed blog port about Android's binary XML format
- Stackoverflow discussion about the topic
- android-apktool The most advanced CLI/Java-based APK tool.
See CONTRIBUTING.md.
See LICENSE.
Copyright © CyberAgent, Inc. All Rights Reserved.