解决方案:批量处理APK文件并进行odex化
根据用户的需求,我们需要解决两个主要问题:
1. 将*.apk.odex
重命名成普通的*.odex
文件。
2. 减少脚本复杂度,使流程更简洁。
一、简化脚本以直接生成所需命名格式的.odex
文件
用户原脚本如下:
dexopt-wrapper $i1 ${i1}.apk.odex
mv $SYSAPP*.apk.odex $SYSAPP/*.odex
mv $SYSPRIVAPP*.apk.odex $SYSPRIVAPP/*.odex
我们可以结合使用dexopt-wrapper
命令以直接生成所需的.odex
文件,同时避免多余的mv
操作。通过调整脚本如下:
#!/bin/sh
SYSAPP=/mnt/extSdCard/FilesToOdex/system/app/
SYSPRIVAPP=/mnt/extSdCard/FilesToOdex/system/priv-app/
for i1 in $SYSAPP*.apk $SYSPRIVAPP*.apk; do
echo "Odexing $i1..."
dexopt-wrapper "$i1" "${i1%.*}.odex"
done
这里的关键在于${i1%.*}
这部分,%.*
表示去掉最后一个扩展名(包括.
),剩下的就是原本文件的名字。
二、处理APK文件
如果还需要实现从.apk
中移除classes.dex
的功能(虽然这可能破坏.apk
的完整性和信任度,因此不推荐在实际环境中操作原始.apk
文件)。可以手动解压和重组.apk
,但是可以通过修改脚本进行批量处理:
#!/bin/sh
SYSAPP=/mnt/extSdCard/FilesToOdex/system/app/
SYSPRIVAPP=/mnt/extSdCard/FilesToOdex/system/priv-app/
# 解压操作(示例简化逻辑,实际应用中需具体实现)
unzip -o "$i1" classes.dex -d "$(dirname "$i1")"
for i1 in $SYSAPP*.apk $SYSPRIVAPP*.apk; do
echo "Odexing $i1..."
dexopt-wrapper "$i1" "${i1%.*}.odex"
done
# 重新打包操作(示例简化逻辑,具体实现需自行调试)
for i1 in $(find $SYSAPP -name "*.apk" -o find $SYSPRIVAPP -name "*.apk"); do
output_file="${i1%.apk}-no-classes.dex.apk"
# 假设这里已经将原来的classes.dex文件删除或者处理了...
zip -0 "$output_file" $(find "$i1"* | grep -v "classes.dex") $i1/classes/* > /dev/null 2>&1
done
这段脚本先通过解压操作提取出classes.dex
,之后对已完成odex化的apk文件进行处理并重新打包。注意这里仅是一个简化示例,实际应用中需要考虑更多细节和边缘情况。
三、最终的脚本整合
综合上述两点,一个简明且功能完整的脚本如下:
#!/bin/sh
SYSAPP=/mnt/extSdCard/FilesToOdex/system/app/
SYSPRIVAPP=/mnt/extSdCard/FilesToOdex/system/priv-app/
# 解压操作(实际应用需自行实现细节)
unzip -o "$1" classes.dex -d "$(dirname "$1")"
for i1 in $SYSAPP*.apk $SYSPRIVAPP*.apk; do
echo "Odexing $i1..."
dexopt-wrapper "$i1" "${i1%.*}.odex"
done
# 重新打包操作(实际应用需自行实现细节)
for i1 in $(find $SYSAPP -name "*.apk" -o find $SYSPRIVAPP -name "*.apk"); do
output_file="${i1%.apk}-no-classes.dex.apk"
zip -0 "$output_file" $(find "$i1"* | grep -v "classes.dex") $i1/classes/* > /dev/null 2>&1
done
echo "All done!"
这个脚本简化了对.apk
文件的操作,确保在odex化处理过程中仅保留必要的内容。
正文完