APK Tools
15 Mar 2017APK Tools
I’ve found many APK tools to be quite useful for diagnosing issues with Xamarin.Android. Here is a small list of tools that I find helpful.
apktool
apktool is a tool for reverse engineering Android applications. It can be used to decode resources to nearly original form and rebuild them after making some modifications.
Decode
One of the most useful usecases of apktool
is to ensure your generated .apk is correct. You can use the decode
/ d
method to take an .apk
and “unzip” it’s original contents.
usage: apktool d MyApplication.apk
Build
The other usecase is to build a .apk
after making a couple of modifications. You can use the build
/ b
method to build an .apk
usage: apktool b foo
Which will build a folder named foo into an .apk file.
Note: If you aren’t using the wrapper script, you may need to invoke it via java -jar apktool.jar
aapt
aapt provides a couple of useful tools for our .apk files. You can find aapt
inside of your Android SDK’s build-tools
folder.
list
aapt list
- shows the contents of the package.
usage: aapt list MyApplication.apk
META-INF/MANIFEST.MF
META-INF/ANDROIDD.SF
META-INF/ANDROIDD.RSA
AndroidManifest.xml
res/drawable/icon.png
res/layout/main.xml
resources.arsc
NOTICE
classes.dex
assemblies/MyApplication.dll
assemblies/Java.Interop.dll
assemblies/Microsoft.CSharp.dll
assemblies/Mono.Android.dll
assemblies/mscorlib.dll
assemblies/System.Core.dll
assemblies/System.dll
assemblies/System.Xml.dll
assemblies/System.Threading.dll
assemblies/System.Runtime.dll
assemblies/System.Collections.dll
assemblies/System.Collections.Concurrent.dll
assemblies/System.Diagnostics.Debug.dll
assemblies/System.Reflection.dll
assemblies/System.Linq.dll
assemblies/System.Runtime.InteropServices.dll
assemblies/System.Runtime.Extensions.dll
assemblies/System.Reflection.Extensions.dll
assemblies/Mono.CSharp.dll
assemblies/System.Runtime.Serialization.dll
environment
lib/armeabi-v7a/libmonodroid.so
lib/armeabi-v7a/libmonosgen-2.0.so
typemap.jm
typemap.mj
dump
aapt dump
- provides values of individual elements or parts of a package. There are a few different items we can dump:
badging - dumps badging information like the versions, sdk targets, etc
usage: aapt dump badging MyApplication.apk
package: name='MyApplication.MyApplication' versionCode='1' versionName='1.0' platformBuildVersionName='7.1.1'
sdkVersion:'16'
application-icon-160:'res/drawable/icon.png'
application: label='' icon='res/drawable/icon.png'
launchable-activity: name='md5ef8aabbe49b48f4362a43abcfb4dce14.MainActivity' label='MyApplication' icon='res/drawable/icon.png'
feature-group: label=''
uses-feature: name='android.hardware.faketouch'
uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps'
main
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales:
densities: '160'
native-code: 'armeabi-v7a'
permissions - dumps permission information such as what uses-permissions
are in use
usage: aapt dump permissions MyApplication.apk
package: MyApplication.MyApplication
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.READ_CALENDAR'
uses-permission: name='android.permission.READ_CONTACTS'
resources - dumps resources in each resource category such as string/array/layout/etc
usage: aapt dump resources MyApplication.apk
Package Groups (1)
Package Group 0 id=0x7f packageCount=1 name=MyApplication.MyApplication
Package 0 id=0x7f name=MyApplication.MyApplication
type 1 configCount=1 entryCount=1
spec resource 0x7f020000 MyApplication.MyApplication:drawable/icon: flags=0x00000000
config (default):
resource 0x7f020000 MyApplication.MyApplication:drawable/icon: t=0x03 d=0x00000000 (s=0x0008 r=0x00)
type 2 configCount=1 entryCount=1
spec resource 0x7f030000 MyApplication.MyApplication:layout/main: flags=0x00000000
config (default):
resource 0x7f030000 MyApplication.MyApplication:layout/main: t=0x03 d=0x00000001 (s=0x0008 r=0x00)
type 3 configCount=1 entryCount=2
spec resource 0x7f040000 MyApplication.MyApplication:string/Hello: flags=0x00000000
spec resource 0x7f040001 MyApplication.MyApplication:string/ApplicationName: flags=0x00000000
config (default):
resource 0x7f040000 MyApplication.MyApplication:string/Hello: t=0x03 d=0x00000002 (s=0x0008 r=0x00)
resource 0x7f040001 MyApplication.MyApplication:string/ApplicationName: t=0x03 d=0x00000003 (s=0x0008 r=0x00)
configurations - dumps any configuration that has been setup
usage: aapt dump configurations MyApplication.apk
imsi=0/0 lang=-- reg=-- orient=0 touch=0 dens=160 kbd=0 nav=0 input=0 scrnW=0 scrnH=0 sz=0 long=0 vers=0.0
imsi=0/0 lang=-- reg=-- orient=0 touch=0 dens=240 kbd=0 nav=0 input=0 scrnW=0 scrnH=0 sz=0 long=0 vers=0.0
imsi=0/0 lang=-- reg=-- orient=0 touch=0 dens=0 kbd=0 nav=0 input=0 scrnW=0 scrnH=0 sz=0 long=0 vers=0.0
xmltree - dumps the xml parse tree for an xml file in a package
usage: aapt dump xmltree MyApplication.apk res/layout/main.xml
N: android=http://schemas.android.com/apk/res/android
E: LinearLayout (line=1)
A: android:orientation(0x010100c4)=(type 0x10)0x1
A: android:layout_width(0x010100f4)=(type 0x10)0xffffffff
A: android:layout_height(0x010100f5)=(type 0x10)0xffffffff
xmlstrings - dumps all strings inside for an xml file in a package
usage: aapt dump xmlstrings MyApplication.apk res/layout/main.xml
String pool of 7 unique UTF-8 non-sorted strings, 7 entries and 0 styles using 176 bytes:
String #0: orientation
String #1: layout_width
String #2: layout_height
String #3: android
String #4: http://schemas.android.com/apk/res/android
String #5:
String #6: LinearLayout
ClassyShark
ClassyShark is a binary inspection tool that can help you find information such as your total dex count, decompilation of .class
files, and much more. It supports .dex, .aar, .so, .apk, .jar, .class, .xml
files for further inspection.
usage: java -jar classyshark.jar
You should see a program like the following:
You can then inspect any aspect of your binary such as decompiling a class, viewing what’s inside of a dex file, and much more.
Classes
You can view what’s inside of your main dex list. Also known as the classes.dex
file that is generated in the Android build process.
Methods Count
You can also see the current method count of the classes.dex
list from an overview
Summary
Although this blog post only showcases 3 tools, there are so many ways to get information from your binaries to diagnose issues such as multidex, versioning, etc in you Xamarin.Android application!
If you enjoyed this post, please consider subscribing to my upcoming book’s email list:
You can signup at the following link: Programming Xamarin.Android Email List