需求
项目中,apk进行so文件加固时采用了顶象的技术,相关流程比较长非常麻烦,故做成脚本一键生成。
知识点
本案例中主要运用了以下技术:
- apktool的使用
- apksigner的使用
- 顶象加固工具的使用
- 实现具有用户交互的菜单界面
源码
@echo off
color 9f & title DXLockUtil V1.0.0
:menu
cls
echo ====================================================================
echo.
echo 注意事项:
echo 1. 使用本工具前app宿主必须先集成相关依赖库并且在APP初始化时进行初始化
echo 2. 目前仅支持armeabi-v7a的so文件加固
echo 3. 请将apk的名字命名为app-release.apk放入apk文件夹中
echo 4. 由于顶象加固工具不支持中文路径,请确保本工具放在无中文、无空格的文件路径下
echo.
echo 菜单选项:
echo 请选择要进行的操作,然后按回车
echo.
echo 1.从反编译开始
echo.
echo 2.从生成证书开始
echo.
echo 3.从生成apk开始
echo.
echo 4.从apk签名开始
echo.
echo Q.退出
echo.
echo ====================================================================
echo.
:cho
set choice=
set /p choice= 请选择:
IF NOT "%choice%"=="" SET choice=%choice:~0,1%
if /i "%choice%"=="1" goto step1
if /i "%choice%"=="2" goto step2
if /i "%choice%"=="3" goto step3
if /i "%choice%"=="4" goto step4
if /i "%choice%"=="Q" goto finish
echo 选择无效,请重新输入
echo.
goto cho
:step1
echo ====================================================================
echo [Step1]: decompile apk
echo ====================================================================
if not exist apk\app-release.apk echo app-release.apk does not exist, check your operation & goto finish
if exist out call :clean
java -jar tools\apktool_2.4.1.jar d apk\app-release.apk -o out\temp -p out\apktool
if errorlevel 1 goto finish
:step2
echo ====================================================================
echo [Step2]: generate license
echo ====================================================================
java -jar tools\dx-lock-license-generator-1.0.5.jar -a apk\app-release.apk -i out\temp\lib\armeabi-v7a\libDXLockLib.so, -o out\so\armeabi-v7a -m pro -anti_debug 0 -anti_pkg -anti_sign
if not exist out\so\armeabi-v7a\libDXLockLib.so.release goto finish
echo [Message]:create lisence success!!!
if exist out\temp\lib\armeabi-v7a\libDXLockLib.so del out\temp\lib\armeabi-v7a\libDXLockLib.so
if exist out\temp\lib\armeabi-v7a\libDXLockLib.so echo [Message]:delete so file success!!! else goto finish
copy out\so\armeabi-v7a\libDXLockLib.so.release out\temp\lib\armeabi-v7a\libDXLockLib.so
if not exist out\temp\lib\armeabi-v7a\libDXLockLib.so echo [Message]:^copy so file failed!!! else goto finish
:step3
echo ====================================================================
echo [Step3]: generate unsigned apk
echo ====================================================================
java -jar tools\apktool_2.4.1.jar b out\temp -o out\apktool\app-release-unsign.apk
if errorlevel 1 goto finish
:step4
echo ====================================================================
echo [Step4]: generate signed apk
echo ====================================================================
set version=29.0.3
:: sign apk with jarsigner
:: jarsigner -verbose -keystore tools\BBGKeyStore(noisivkih).keystore -storepass noisivkih -keypass noisivkih -signedjar out\app-release-unsign-signed.apk out\apktool\app-release-unsign.apk noisivkih
:: sign apk with apksigner
if "%ANDROID_HOME%"=="" echo [Message]: ANDROID_HOME not configed & goto finish
if not exist %ANDROID_HOME%\build-tools\%version%\lib\apksigner.jar echo [Message]: apksigner %version% not downloaded & goto finish
if exist %ANDROID_HOME%\build-tools\%version%\zipalign.exe %ANDROID_HOME%\build-tools\%version%\zipalign.exe -v -p 4 out\apktool\app-release-unsign.apk out\apktool\app-release-aligned.apk
java -jar %ANDROID_HOME%\build-tools\%version%\lib\apksigner.jar sign --ks tools\BBGKeyStore(noisivkih).keystore --ks-key-alias noisivkih --ks-pass pass:noisivkih --key-pass pass:noisivkih --out out\app-release-signed.apk out\apktool\app-release-aligned.apk
:finish
echo [Message]:all tasks finished & pause > nul
goto :eof
:clean
echo ====================================================================
echo [Step5]: clear temp folder
echo ====================================================================
echo [Message]: cleaning temp files...
@for /r . %%a in (.) do @if exist "%%a\out" rd /s /q "%%a\out" & @if exist "%%a\temp" rd /s /q "%%a\temp"
echo [Message]: cleaning finished
goto menu