version m5
以 Contacts程序为例,解释
1. Contacts程序的位置
2. Contacts程序的classes.dex的位置
3. 导出class
4. 反编译
Contacts.App就是模拟器里的联络人程序,google还没有发布源码,想在里面改些东西,文档里并无明示,就只好自己找源码了。
1. 找到Contacts.App的位置
自带的程序都在/system/app下
$ adb shell
# cd /system/app
# ls
GoogleAppsProvider.apk
MasfProxyService.apk
MediaProvider.apk
SettingsProvider.apk
TelephonyProvider.apk
ContactsProvider.apk
Browser.apk
Contacts.apk
Development.apk
Fallback.apk
GTalkSettings.apk
Home.apk
GoogleApps.apk
Maps.apk
Phone.apk
ImProvider.apk
gtalkservice.apk
Contacts.apk就是Contacts程序,ContactsProvider.apk提供Contact Content Provider(content://contacts/)对联络人的读与写。
可以用adb pull把这些包抓出来。实际上它就是个zip包,里面包含有这样的目录结构
META-INF/
res/
AndroidManifest.xml
classes.dex
resources.arsc
classes.dex即是编译后的代码。不过里面所有的xml文档皆不可读,只有res下的一些图片可以看到。
2. classes.dex的位置
Dalvik的缓存里面存有classes.dex的副本,我们也可以访问他们。
# cd /data/dalvik-cache
# ls
system@framework@core.jar@classes.dex
system@framework@ext.jar@classes.dex
system@framework@framework.jar@classes.dex
system@framework@framework-tests.jar@classes.dex
system@app@Browser.apk@classes.dex
system@app@Contacts.apk@classes.dex
system@app@Development.apk@classes.dex
system@app@Fallback.apk@classes.dex
system@app@GTalkSettings.apk@classes.dex
system@app@GoogleApps.apk@classes.dex
system@app@GoogleAppsProvider.apk@classes.dex
system@app@Home.apk@classes.dex
system@app@ImProvider.apk@classes.dex
system@app@Maps.apk@classes.dex
system@app@MasfProxyService.apk@classes.dex
system@app@MediaProvider.apk@classes.dex
system@app@Phone.apk@classes.dex
system@app@SettingsProvider.apk@classes.dex
system@app@TelephonyProvider.apk@classes.dex
system@app@gtalkservice.apk@classes.dex
system@app@ContactsProvider.apk@classes.dex
3. 导出class
这里的.dex并不是.jar文件,他是Dalvik自己定义优化的可执行文件,所以也不能直接把他看成jar导出。模拟器里提供了一个叫做dexdump的工具。
# dexdump
dexdump: no file specified
Copyright (C) 2007 Google, Inc.
dexdump: [-d] [-f] [-h] dexfile...
-d : disassemble code sections
-f : display summary information from file header
-h : display file header details
用他就可以把可读的class导出了
# dexdump -d -f -h system@app@Contacts.apk@classes.dex >> Contacts.apk.dump
# dexdump -d -f -h system@app@ContactsProvider.apk@classes.dex >> ContactsProvider.apk.dump
得到的两个文件Contacts.apk.dump和ContactsProvider.apk.dump。然后将之pull出来
4. 反编译
MS还没人找到把他反编了的办法,不过里面好像还有那么点意思,就是读起来费劲了点。
至于xml文件的格式,据说是叫做 wbxml,二进制xml文件,怎么转回来正在研究中。