Skip to content

chenhuifeng/androidbinary

 
 

Repository files navigation

androidbinary

Build Status GoDoc

Go library for parsing Android binary formats: compiled XML (AndroidManifest.xml), resources.arsc, and high-level APK metadata.

Features

  • Parse binary XML and resource tables (resources.arsc)
  • Open APK, zip bundles (e.g. disney.zip with embedded base.apk), and XAPK (e.g. Emby.xapk)
  • Extract app icon (android:icon / ic_launcher) and TV banner (android:banner) as raster images
  • Prefer mipmap PNG/WebP over adaptive-icon XML; rasterize vector/adaptive icons when needed
  • CLI tool: apk/cmd/extract-icons

Install

go get github.com/chenhuifeng/androidbinary/v2@latest

Requires Go 1.17+.

Quick start — APK

package main

import (
	"fmt"
	"image/png"
	"os"

	"github.com/chenhuifeng/androidbinary/v2/apk"
)

func main() {
	pkg, err := apk.OpenFile("app.apk") // also: disney.zip, Emby.xapk
	if err != nil {
		panic(err)
	}
	defer pkg.Close()

	fmt.Println("package:", pkg.PackageName())
	fmt.Println("version:", pkg.VersionName())

	icon, _, err := pkg.Icon(nil)
	if err != nil {
		panic(err)
	}
	if icon != nil {
		f, _ := os.Create("ic_launcher.png")
		defer f.Close()
		png.Encode(f, icon)
	}

	banner, _, err := pkg.Banner(nil)
	if err != nil {
		panic(err)
	}
	if banner != nil {
		f, _ := os.Create("banner.png")
		defer f.Close()
		png.Encode(f, banner)
	}
}

See apk/README.md for icon/banner behavior, supported containers, and the extract-icons command.

High-level API

Method Description
OpenFile(path) Open .apk, zip with embedded APK, or .xapk
Icon(config) App icon as image.Image (nil if not set)
Banner(config) TV banner only (nil if not set)
Label(config) Localized app label
PackageName() Package name from manifest
VersionName() / VersionCode() Version info
MainActivity() Launcher activity name
Manifest() Parsed manifest struct

Low-level API

Binary XML

f, _ := os.Open("AndroidManifest.xml")
xf, _ := androidbinary.NewXMLFile(f)
data, _ := io.ReadAll(xf.Reader())
// use encoding/xml on data

Resource table

f, _ := os.Open("resources.arsc")
tf, _ := androidbinary.NewTableFile(f)
value, _ := tf.GetResource(resID, nil)

Changelog

v2.0.4

  • XAPK / App Bundle split APK support: merge resources.arsc from split config APKs (e.g. config.xhdpi.apk)
  • Read drawable files across base + split zips; fallback to xapk manifest.json icon field

v2.0.3

  • Adaptive-icon: composite background (gradient) + foreground with vector <group> transforms
  • Banner vector drawables rasterize at 320×180 (Android TV banner); icons at 192×192
  • Raster PNG/WebP icons and banners keep native decoded dimensions

v2.0.2

  • Fix Go module path: github.com/chenhuifeng/androidbinary/v2 (required for go get v2.x)

v2.0.1

  • APK icon/banner extraction, zip/xapk support, extract-icons CLI (broken go get — module path lacked /v2; use v2.0.2)

Earlier releases

See git tags.

Development

go test ./...
cd apk && go test -v ./...

APK integration tests need local files under apk/testdata/ (not committed). See apk/testdata/README.md.

go run ./cmd/extract-icons -apk testdata/base.apk -o ./out

License

MIT — see LICENSE.

About

Android binary file parser written in golang

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Go 100.0%