目前在研究Android手机字体的灵活设置问题,归类各手机厂商的实现方式:
1:在主体商店设置字体后,手机需要重起
2:在主题商店设置字体后,立即生效
方案1的效果已基本实现,但是方案二的效果有基础轮廓,但是还是好奇,所以用友商的手机过来看看究竟。
当通过Adb进入到友商系统时,全是.Odex的文件,原本的.Jar已经被预优化。因此面临.Odex的反编译问题。
首先列出需要的工具:
A:smali/baksmali
B:dex2jar
C:jadx
附件中有添加对应工具,本文档只记录对应的方法。
本文以Framework.odex文件的反编译为目标,介绍反编译的方法和步骤:
假设所有工具已经下载到位,统一放在Decompile目录下,目录结构如图所示:
Decompile
|————smali
|
——smali
——baksmali
|————dex2jar
|
——d2j*.bat
|————jadx
|
——jadx-ui.bat
步骤:
1.进入到Decompile目录,Adb连接对应设备,执行以下命令:
adb pull /system/framework/framework.odex
2.执行java -jar smali\baksmali-2.1.3.jar,会有如下打印
usage: java -jar baksmali.jar [options] <dex-file>
disassembles and/or dumps a dex file
-?,--help prints the help message then exits.
Specify twice for debug options
......
-X,--experimental enable experimental opcodes to be
disassembled, even if they aren't
necessarily supported in the Android
runtime yet
3.执行java -jar smali\baksmali-2.1.3.jar -a 16 -x framework.odex -d .
会有如下错误:
Error occurred while loading boot class path files. Aborting.
org.jf.util.ExceptionWithContext: Cannot locate boot class path file /system/framework/telephony-msim.odex
at org.jf.dexlib2.analysis.ClassPath.loadClassPathEntry(ClassPath.java:277)
at org.jf.dexlib2.analysis.ClassPath.fromClassPath(ClassPath.java:182)
at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:67)
at org.jf.baksmali.main.run(main.java:113)
at org.jf.baksmali.main.main(main.java:322)
4.执行adb pull /system/framework/telephony-msim.odex,并且继续执行步骤3,如果有类似步骤3的抱错,参考步骤4执行,直到步骤3完全正常,跳转到步骤5
5.baksmali 执行成功后,会产生out 目录,里面放的是中间文件。执行如下命令:
java -jar smali\smali-2.1.3.jar -a 16 -o classes.dex out,如果out目录之前已经存在,请先删除。
6.执行dex2jar\d2j-dex2jar.bat classes.dex,classes-dex2jar.jar 就是我们要的Jar包
7.将classes-dex2jar.jar 拖动到jadx\jadx-gui.bat上打开,即可察看源码。
注:其实也可以在执行完步骤5之后,直接使用jadx打开dex文件。