Skip to content

Instantly share code, notes, and snippets.

@JakeWharton
Last active March 25, 2024 13:54
Show Gist options
  • Select an option

  • Save JakeWharton/6002797 to your computer and use it in GitHub Desktop.

Select an option

Save JakeWharton/6002797 to your computer and use it in GitHub Desktop.
`classes.dex` method count helpers. Requires smali/baksmali from https://code.google.com/p/smali/ 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"
done
rm -rf $dir
}
@reilost

reilost commented Sep 18, 2013

Copy link
Copy Markdown

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

@ligi

ligi commented Jul 4, 2014

Copy link
Copy Markdown

@aried3r

aried3r commented Jul 9, 2014

Copy link
Copy Markdown

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

@VinyWenkz

Copy link
Copy Markdown

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

@sschuberth

Copy link
Copy Markdown

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

@mrsasha

mrsasha commented Sep 14, 2014

Copy link
Copy Markdown

If someone is looking for the windows solution (like I was), I wrote a simple batch file here: https://gist.github.com/mrsasha/9f24e129ced1b1db791b

@jaredrummler

Copy link
Copy Markdown

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"'

:P


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

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

@zhywang

zhywang commented Mar 19, 2015

Copy link
Copy Markdown
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 :)

@ajaykumarns

Copy link
Copy Markdown

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)
dex_file="$dex_dir/dexed.jar"
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