如何odex系统即分离apk和odex
发布网友
发布时间:2022-04-21 19:24
我来回答
共1个回答
热心网友
时间:2023-06-30 06:24
想要odex系统首先必须先处理/system/framework/下面的jar文件,其次才是/system/app下面的apk和jar等。
换种说法:
如果framework下面的文件没有odex化,都是单独的jar文件,那么系统中其他地方比如/system/app下即使存在odex文件也应该是无效的。
如果framework下的文件已经odex化,那么其他地方的apk和jar可以odex化也可以不odex都可以正常运行。
0901的包初始是deodex的,也就是所有apk都是合并好的没有odex文件存在。想要odex系统可以执行那个包解压后的odex.bat来达到目的。
odex.bat主要是调用/system/xbin/odex_framework和/system/xbin/odex_app这两个脚本。(直接在手机端用终端模拟器来执行这两个脚本应该也行,也就是说odex化的过程应该可以不依赖电脑)
odex_framework和odex_app要用到busybox、dexopt-wrapper、zip、zipalign等命令,因此需要事先将这些工具准备妥当。(0901包里面这些第三方的命令行工具基本都在/system/xbin目录下,busybox最好使用相关软件来安装,其他命令复制好后改好权限就行。)
下面直接看/system/xbin/odex_framework这个脚本,它负责odex化framework下的文件,内容如下,###开头的行都是我写的说明:
#!/system/bin/sh
### 挂载system分区为可读写,并将目录切换到/system/framework。
busybox mount -o rw,remount /system
cd /system/framework
### dexopt-wrapper这个命令直接用来生成odex文件。比如dexopt-wrapper /system/framework/core.jar /system/framework/core.odex就是由core.jar生成core.odex。
### 另外framework下面的文件odex有顺序要求,具体的顺序可见手机根目录下的init.rc这个文件,在这个init.rc里面查找BOOTCLASSPATH这行,这行后面会列出一些jar文件,那么我们这里odex的顺序就要照着那个列出的顺序来进行。各机型各版本这个顺序可能有区别,因此这里必须照实际情况排好顺序,否则生成了odex也多半是启动不了的。
### 一行处理一个文件,依次按顺序执行。
dexopt-wrapper /system/framework/core.jar /system/framework/core.odex
dexopt-wrapper /system/framework/core-junit.jar /system/framework/core-junit.odex
dexopt-wrapper /system/framework/bouncycastle.jar /system/framework/bouncycastle.odex
dexopt-wrapper /system/framework/ext.jar /system/framework/ext.odex
dexopt-wrapper /system/framework/framework.jar /system/framework/framework.odex
dexopt-wrapper /system/framework/android.policy.jar /system/framework/android.policy.odex
dexopt-wrapper /system/framework/services.jar /system/framework/services.odex
dexopt-wrapper /system/framework/apache-xml.jar /system/framework/apache-xml.odex
dexopt-wrapper /system/framework/filterfw.jar /system/framework/filterfw.odex
### 需要按顺序处理的文件处理完成后,其他的文件就不用在意顺序了,直接用个for语句来统一处理。
for j in /system/framework/*.jar
do
odexj=`echo $j | sed -e 's/.jar/.odex/g'`
if [ -f $odexj ]; then
echo "++++++++++++"
echo "$odexj already exists, skipping"
echo "++++++++++++"
else
echo "dexopt-wrapper $j $odex"
dexopt-wrapper $j $odexj
fi
done
### 到此时所有的文件都已经生成了相应的odex文件,下面的步骤是删除掉原始jar文件里面的classes.dex以及对文件zipalign优化,这一步应该不是必须的但推荐也处理一下。同样也是for语句来统一处理。zip命令负责删除classes.dex打包,zipalign命令负责zipalign优化。
for filename in `find . -name '*.jar'`
do
# step 1 - did we succesfully odex?
if [ -f `echo $filename | sed 's/\(.*\.\)jar/\1odex/'` ]
then
# step 2 - remove the classes.dex from the jar
zip -d $filename classes.dex
# step 3 - zipalign, just in case
zipalign -f -v 4 $filename $filename.new
mv $filename.new $filename
fi
done
### 单独对framework-res.apk进行zipalign优化,因为上面的语句只是针对jar文件。并且framework-res.apk中没有classes.dex文件因此它不需要odex处理。
zipalign -f -v 4 framework-res.apk framework-res.apk.new
mv framework-res.apk.new framework-res.apk
### 改好framework下面所有文件的权限。
chmod 644 /system/framework/*
### 清空系统的dalvik缓存然后退出脚本。
busybox rm -f /data/dalvik-cache/*
exit 0
通过上面的脚本framework下的文件都已经odex化,接下来可以处理/system/app下面的文件,当然不处理app下的文件应该也是可以正常运行的。
odex_app就是处理app下的文件的,格式与odex_framework类似并且要简单些,因为里面的文件都没有顺序的要求。