参考了xUltimated的实现逻辑,做了不少修改,精简了最小工具包
下载地址:
http://download.csdn.net/detail/netsniffer/6017991
将手机/system/app下的所有文件pull到origi_app下,将/system/framework下的所有文件pull到origi_frame
adb pull /system/app .\origi_app
adb pull /system/framework .\origi_frame
当前目录下jar目录下文件列表:
-------------------------------------------------------
7z.dll
7z.exe
adb.exe
AdbWinApi.dll
AdbWinUsbApi.dll
baksmali.jar
frame-dep.txt
md5.exe
sleep.exe
smali.jar
zipalign.exe
-------------------------------------------------------
其中
frame-dep.txt 内容(查看adb shell set,参照其中BOOTCLASSPATH环境变量内容):
core.jar:core-junit.jar:bouncycastle.jar:ext.jar:framework.jar:framework2.jar:android.policy.jar:services.jar:apache-xml.jar:sec_edm.jar:seccamera.jar
合并framework下odex的批处理
deodex framework.bat
@shift
@setlocal
@REM @setlocal ENABLEDELAYEDEXPANSION
@ECHO OFF
cls
set count=0
if exist temp del .\temp\*.* /s /q > nul
if not exist temp mkdir temp > nul
dir /b /s .\origi_frame\*.odex | find /C /V "::" > .\temp\file_count
set /p file_count=<.\temp\file_count
if not exist .\origi_frame\*.odex goto :error
if not exist .\origi_frame\*.jar goto :error1
if exist .\done_frame\*.jar goto :error2
:restart
if exist out rmdir out /s /q > nul
if exist *.dex del /q *.dex > nul
if not exist done_frame mkdir done_frame
for /F %%a in ('dir /x/b .\origi_frame\*.odex') do call :do_odex %%~na %%~xa
if %ERRORLEVEL%==10 goto :error3
goto :done
:do_odex
set base1=
@REM set base1=core.jar:core-junit.jar:bouncycastle.jar:ext.jar:framework.jar:framework2.jar:android.policy.jar:services.jar:apache-xml.jar:sec_edm.jar:seccamera.jar
if not exist .\jar\frame-dep.txt goto :nodep
@REM for /f "tokens=* delims= " %%a in (.\jar\frame-dep.txt) do (
@REM if exist .\origi_frame\%%a set base1=!base1!:%%a
@REM )
set /p base1=<.\jar\frame-dep.txt
:nodep
set /a count += 1
title Processing %count% of %file_count% ***DO NOT EXIT***
rem if %1.odex==core.odex goto :end
if %1.odex==guava.odex goto :end
echo.
echo Starting %1.odex
echo *****************************************
if %1==framework echo *******THIS WILL TAKE A LIL BIT!!********
echo * Deodexing... *
echo java -Xss50M -jar .\jar\baksmali.jar -c %base1% -x .\origi_frame\%1.odex -d .\origi_frame\
java -Xss50M -jar .\jar\baksmali.jar -c %base1% -x .\origi_frame\%1.odex -d .\origi_frame\
if not %ERRORLEVEL%==0 goto :merror4
:return
echo * Redexing... *
echo java -Xss100M -Xmx512M -jar .\jar\smali.jar out *
java -Xss100M -Xmx512M -jar .\jar\smali.jar out
echo * Processing... *
if %ERRORLEVEL%==10 goto :error3
copy .\origi_frame\%1.jar .\done_frame\%1.zip > nul
rename out.dex classes.dex
if %ERRORLEVEL%==1 goto :error3
cd .\done_frame
echo * Compressing/Aligning... *
..\jar\7z a %1.zip ..\classes.dex > nul
..\jar\zipalign -f 4 %1.zip %1.jar> nul
del /q %1.zip
if %ERRORLEVEL%==1 goto :error4
cd ..
rmdir /s /q out > nul
del /q *.dex > nul
@Echo %1.odex-DONE -auto-frame- (%TIME% %DATE%) >> log.txt
echo *****************************************
echo %1.jar Finished!
goto :end
:error
pause
cls
color 4
echo.
echo.
echo *****************************************
echo ERROR!! No odex files found!!
echo *****************************************
@Echo **NO ODEX FILES** -auto-frame- (%TIME% %DATE%) >> log.txt
echo
pause
exit 12
:error1
pause
cls
color 4
echo.
echo.
echo *****************************************
echo ERROR!! No jar files found!!
echo *****************************************
@Echo **NO APK FILES** -auto-frame- (%TIME% %DATE%) >> log.txt
echo
pause
exit 12
:error2
cls
color 6
echo
echo.
echo *****************************************
echo WARNING FILES EXIST IN "done_frame"
echo *****************************************
ECHO Do you want to delete files in "done_frame" [Yes/No]?
ECHO.
set CHOICE=error2
set INPUT=
set /P INPUT=[Y/N]: %=%
if "%INPUT%"=="yes" goto :p_del
if "%INPUT%"=="y" goto :p_del
if "%INPUT%"=="no" exit 11
if "%INPUT%"=="n" exit 11
if "%INPUT%"=="" goto :error2
if not "%INPUT%"=="dfsgsdgdg" goto :error2
ECHO.
:p_del
if exist .\done_frame\*.* del .\done_frame\*.* /s /q > nul
@Echo **FILES DELETED IN DONE_FRAME** -auto-frame- (%TIME% %DATE%) >> log.txt
cls
goto :restart
:error3
pause
cls
color 4
echo.
echo.
echo *****************************************
echo MAJOR ERROR!! Please connect your phone!!
echo *****************************************
echo ********DELETING INCORRECT FILES*********
@Echo **lOST CONNECTION TO PHONE** -auto-frame- (%TIME% %DATE%) >> log.txt
@Echo **DELETING PROCESSED FILES** -auto-frame- (%TIME% %DATE%) >> log.txt
if exist out rmdir done_frame /s /q > nul
if exist out rmdir out /s /q > nul
if exist *.dex del /q *.dex > nul
if exist temp rmdir temp /s /q > nul
echo
pause
exit 10
:error4
echo * *
echo *****************************************
echo Restarting %1.odex
echo *****************************************
echo * ERROR! Trying something different! *
echo * Deodexing... *
java -Xss50M -jar .\jar\baksmali.jar -c %base1% -x .\origi_frame\%1.odex -d .\origi_frame\
if not %ERRORLEVEL%==0 goto :merror4
goto :return
:merror4
color 4
pause
echo.
echo.
echo *****************************************
echo MAJOR ERROR!! WITH DEODEXING! %1.odex
echo *****************************************
echo ********DELETING INCORRECT FILES*********
@Echo **ERROR DEODEXING %1.odex** -auto-frame- (%TIME% %DATE%) >> log.txt
@Echo **DELETING PROCESSED FILES** -auto-frame- (%TIME% %DATE%) >> log.txt
echo please exit out of window "***Deodexing ADB Window, DO NOT EXIT!***"
if exist out rmdir done_app /s /q > nul
if exist out rmdir out /s /q > nul
if exist *.dex del /q *.dex > nul
if exist temp rmdir temp /s /q > nul
echo
pause
cls
exit 20
:copy
rem if %1.odex==core.odex copy /y .\origi_frame\core.* .\done_frame\ > nul
@Echo **MADE SPECIAL ARANGEMENT FOR CORE.ODEX** -auto-frame- (%TIME% %DATE%) >> log.txt
goto :end
:done
if exist temp rmdir temp /s /q > nul
pause
exit 0
:end
合并app的odex
deodex app.bat
@shift
@setlocal
@REM @setlocal ENABLEDELAYEDEXPANSION
@ECHO OFF
cls
set count=0
if exist temp del .\temp\*.* /s /q > nul
if not exist temp mkdir temp > nul
dir /b /s .\origi_app\*.odex | find /C /V "::" > .\temp\file_count
set /p file_count=<.\temp\file_count
if not exist .\origi_app\*.odex goto :error
if not exist .\origi_app\*.apk goto :error1
if exist .\done_app\*.apk goto :error2
:restart
if exist out rmdir out /s /q > nul
if exist *.dex del /q *.dex > nul
if not exist done_app mkdir done_app
for /F %%a in ('dir /x/b .\origi_app\*.odex') do call :do_odex %%~na %%~xa
if %ERRORLEVEL%==10 goto :error3
goto :done
:do_odex
set base1=
@REM set base1=core.jar:core-junit.jar:bouncycastle.jar:ext.jar:framework.jar:framework2.jar:android.policy.jar:services.jar:apache-xml.jar:sec_edm.jar:seccamera.jar
if not exist .\jar\frame-dep.txt goto :nodep
@REM for /f "tokens=* delims= " %%a in (.\jar\frame-dep.txt) do (
@REM if exist .\origi_frame\%%a set base1=!base1!:%%a
@REM )
set /p base1=<.\jar\frame-dep.txt
:nodep
set /a count += 1
title Processing %count% of %file_count% ***DO NOT EXIT***
rem if %1.odex==core.odex goto :end
echo.
echo Starting %1.odex
echo *****************************************
echo * Deodexing... *
echo java -Xss50M -jar .\jar\baksmali.jar -c %base1% -x .\origi_app\%1.odex -d .\origi_frame\
java -Xss50M -jar .\jar\baksmali.jar -c %base1% -x .\origi_app\%1.odex -d .\origi_frame\ > nul
if not %ERRORLEVEL%==0 goto :merror4
:return
echo * Redexing... *
echo java -Xss100M -Xmx512M -jar .\jar\smali.jar out *
java -Xss100M -Xmx512M -jar .\jar\smali.jar out
echo * Processing... *
if %ERRORLEVEL%==10 goto :error3
copy .\origi_app\%1.apk .\done_app\%1.zip > nul
rename out.dex classes.dex
if %ERRORLEVEL%==1 goto :error3
cd .\done_app
echo * Compressing/Aligning... *
..\jar\7z a %1.zip ..\classes.dex > nul
..\jar\zipalign -f 4 %1.zip %1.apk> nul
del /q %1.zip
if %ERRORLEVEL%==1 goto :error4
cd ..
rmdir /s /q out > nul
del /q *.dex > nul
@Echo %1.odex-DONE -auto-app- (%TIME% %DATE%) >> log.txt
echo *****************************************
echo %1.apk Finished!
goto :end
:error
pause
cls
color 4
echo.
echo.
echo *****************************************
echo ERROR!! No odex files found!!
echo *****************************************
@Echo **NO ODEX FILES** -auto-app- (%TIME% %DATE%) >> log.txt
echo
pause
exit 12
:error1
pause
cls
color 4
echo.
echo.
echo *****************************************
echo ERROR!! No apk files found!!
echo *****************************************
@Echo **NO APK FILES** -auto-app- (%TIME% %DATE%) >> log.txt
echo
pause
exit 12
:error2
cls
color 6
echo
echo.
echo *****************************************
echo WARNING FILES EXIST IN "done_app"
echo *****************************************
ECHO Do you want to delete files in "done_app" [Yes/No]?
ECHO.
set CHOICE=error2
set INPUT=
set /P INPUT=[Y/N]: %=%
if "%INPUT%"=="yes" goto :p_del
if "%INPUT%"=="y" goto :p_del
if "%INPUT%"=="no" exit 11
if "%INPUT%"=="n" exit 11
if "%INPUT%"=="" goto :error2
if not "%INPUT%"=="dfsgsdgdg" goto :error2
ECHO.
:p_del
if exist .\done_app\*.* del .\done_app\*.* /s /q > nul
@Echo **FILES DELETED IN DONE_APP** -auto-app- (%TIME% %DATE%) >> log.txt
cls
goto :restart
:error3
pause
cls
color 4
echo.
echo.
echo *****************************************
echo MAJOR ERROR!! Please connect your phone!!
echo *****************************************
echo ********DELETING INCORRECT FILES*********
@Echo **lOST CONNECTION TO PHONE** -auto-app- (%TIME% %DATE%) >> log.txt
@Echo **DELETING PROCESSED FILES** -auto-app- (%TIME% %DATE%) >> log.txt
if exist out rmdir done_app /s /q > nul
if exist out rmdir out /s /q > nul
if exist *.dex del /q *.dex > nul
if exist temp rmdir temp /s /q > nul
echo
pause
exit 10
:error4
echo * *
echo *****************************************
echo Restarting %1.odex
echo *****************************************
echo * ERROR! Trying something different! *
echo * Deodexing... *
java -Xss50M -jar .\jar\baksmali.jar -c %base1% -x .\origi_app\%1.odex -d .\origi_frame\
if not %ERRORLEVEL%==0 goto :merror4
goto :return
:merror4
color 4
pause
echo.
echo.
echo *****************************************
echo MAJOR ERROR!! WITH DEODEXING! %1.odex
echo *****************************************
echo ********DELETING INCORRECT FILES*********
@Echo **ERROR DEODEXING %1.odex** -auto-app- (%TIME% %DATE%) >> log.txt
@Echo **DELETING PROCESSED FILES** -auto-app- (%TIME% %DATE%) >> log.txt
echo please exit out of window "***Deodexing ADB Window, DO NOT EXIT!***"
if exist out rmdir done_app /s /q > nul
if exist out rmdir out /s /q > nul
if exist *.dex del /q *.dex > nul
if exist temp rmdir temp /s /q > nul
echo
pause
cls
exit 20
:done
if exist temp rmdir temp /s /q > nul
pause
exit 0
:end
测试更新deodex文件到手机:
adb shell rm -r /system/framework/*.odex
adb shell rm -r /system/app/*.odex
adb push done_frame /system/framework/
adb push done_app /system/app/
adb shell sync
pause