Skip to content

Instantly share code, notes, and snippets.

Last active March 25, 2024 13:54
Show Gist options
  • Save JakeWharton/6002797 to your computer and use it in GitHub Desktop.
Save JakeWharton/6002797 to your computer and use it in GitHub Desktop.
`classes.dex` method count helpers. Requires smali/baksmali from and dexdump from the build-tools in the Android SDK be on your PATH.
function dex-method-count() {
cat $1 | head -c 92 | tail -c 4 | hexdump -e '1/4 "%d\n"'
function dex-method-count-by-package() {
dir=$(mktemp -d -t dex)
baksmali $1 -o $dir
for pkg in `find $dir/* -type d`; do
smali $pkg -o $pkg/classes.dex
count=$(dex-method-count $pkg/classes.dex)
name=$(echo ${pkg:(${#dir} + 1)} | tr '/' '.')
echo -e "$count\t$name"
rm -rf $dir
Copy link

reilost commented Sep 18, 2013

this sh file is used to count how many method in the dex file or split dex file to more than one dex file ?

Copy link

ligi commented Jul 4, 2014

Copy link

aried3r commented Jul 9, 2014

Before I roll my own, do you use any kind of script to always point to the latest build tools directory in your PATH?

Copy link

Hi, I'm a new developer.
How do I use this? I already have baksmali results, but when i call sh, here is the error: line 3: `dex-method-count': not a valid identifier

Copy link

@aried3r A version that always uses the latest build tools (and optional CSV output for use with the Jenkins Plot plugin) is here.

Copy link

mrsasha commented Sep 14, 2014

If someone is looking for the windows solution (like I was), I wrote a simple batch file here:

Copy link

Don't use cat to feed a single file's content to a filter. cat is a utility used to concatenate the contents of several files together.

This would be better:

head -c 92 $1 | tail -c 4 | hexdump -e '1/4 "%d\n"'


If you just want the dex count for one apk (not by package) you could do:

unzip -p $apk classes.dex | head -c 92 | tail -c 4 | hexdump -e '1/4 "%d\n"'

Copy link

zhywang commented Mar 19, 2015

function dex-method-count-by-package() {
dexdump -f classes.dex | grep \(in | awk '{print $4}'|awk -F/ '{print $1"."$2"."$3;}' | sort | uniq -c | sort

It's not very accurate but it's fast and simple :)

Copy link

dex-method-count seems to return incorrect number of methods for me. I used the following script to count the number of methods in my jar file:

dex_dir=$(mktemp -d -t dex)
dx --dex --output $dex_file $1
baksmali $dex_file -o $dex_dir
count=$(find $dex_dir -type f -exec grep "\.method" '{}' \; | wc -l | tr -d ' ')
echo "There are $count methods in $1"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment