為啥要做反編譯
之前在進(jìn)行項(xiàng)目時(shí),經(jīng)常性的會(huì)出現(xiàn)plist內(nèi)某個(gè)參數(shù)有錯(cuò),或者資源出錯(cuò),亦或者script腳本有問題,導(dǎo)致重新出包。出一個(gè)包需要兩個(gè)小時(shí),驗(yàn)證起來成本非常高。之前有想過優(yōu)化打包流程,優(yōu)化效果不理想,所以想到了將舊的ipa包解開,進(jìn)行資源替換,之后再將app重簽打成ipa的方法。這樣的話,就可以將打包流程分解開來,xcode編譯,打腳本npk,處理資源哪步有問題就進(jìn)行哪一步。
正文
第一步
工具準(zhǔn)備
1.codesign的命令行工具來實(shí)現(xiàn)重簽名。(mac自帶)
2.有效證書 和 描述文件(xxx.mobileprovision)及對(duì)應(yīng)的Bundle identifier
3.重簽名的ipa包(如果你是從蘋果商店下載來的,那接下來就不要看了,下面沒有砸殼的內(nèi)容)
解壓ipa包
終端命令:$unzip /.../xx.ipa 解壓到當(dāng)前目錄
證書操作
1.查看有效證書,找到你要重簽名的證書名稱
終端命令,或者直接鑰匙串看也行:
$security find-identity -v
2.修改描述文件名稱為:embedded.mobileprovision
3.拷貝embedded.mobileprovision文件到解壓的APP的目錄里
生成entitlements.plist授權(quán)機(jī)制文件
1.通過security命令,從embedded.mobileprovision文件中生成一個(gè)完整的plist文件
security cms -D -i /../embedded.mobileprovision > entitlements_full.plist
2.獲取其中的Entitlements字段
/usr/libexec/PlistBuddy -x -c 'Print:Entitlements' entitlements_full.plist > entitlements.plist
重簽名
把上面生成的entitlements.plist寫入
/usr/bin/codesign --continue -f -s "iPhone Distribution: ShenZhen Chmtech Science & Technology Co.,Ltd." --entitlements "/.../entitlements.plist" "/.../xxoo.app"
*****這里對(duì)第一步的步驟進(jìn)行了自動(dòng)化,傳入ipa路徑,描述文件路徑以及包名即可:*****
#!/bin/sh
#默認(rèn)填入數(shù)據(jù),不填可以不用管
#舊的需要解開的ipa
oldIpaPath=None;
mobileprovisiofile=None;
packagename=None
if [ "$1" ]
then
oldIpaPath="$1"
fi
if [ "$2" ]
then
mobileprovisiofile="$2"
fi
if [ "$3" ]
then
packagename="$3"
fi
IPA_PATH=${oldIpaPath}
MOBILEPROVISIO_FILE=${mobileprovisiofile}
PACKAGENAME=${packagename}
#獲取當(dāng)前文件所在的絕對(duì)路徑
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
#info.plist的路徑
PLIST_PATH=${SHELL_FOLDER}"/Payload/dm48.app/info.plist"
#entitlements.plist的路徑
entitlements=${SHELL_FOLDER}"/entitlements.plist"
PAYLOAD_PATH=${SHELL_FOLDER}"/Payload"
echo "11111111", ${IPA_PATH}
echo "22222222", ${SHELL_FOLDER}
echo "33333333", ${MOBILEPROVISIOFILE}
if [ ${IPA_PATH} = None ] ; then
echo "ipa路徑不存在,退出~~~"
exit 0
fi
if [${MOBILEPROVISIO_FILE} = None ] ; then
echo "描述文件不存在,退出~~~~~"
exit 0
fi
if [${packagename} = None ] ; then
echo "跟上包名~~~~~~~"
exit 0
fi
if [ -x "$PAYLOAD_PATH" ]
then
echo "Remove file $appDetailName"
rm -rf "$PAYLOAD_PATH"
fi
unzip ${IPA_PATH}
echo "替換掉描述文件"
cp -f ${MOBILEPROVISIO_FILE} ${SHELL_FOLDER}"/Payload/dm48.app/embedded.mobileprovision"
security find-identity -v
security cms -D -i ${SHELL_FOLDER}"/Payload/dm48.app/embedded.mobileprovision" > entitlements_full.plist
/usr/libexec/PlistBuddy -x -c 'Print:Entitlements' entitlements_full.plist > entitlements.plist
echo ${PLIST_PATH}
#重新定義PACKAGENAME
/usr/libexec/PlistBuddy -c 'Set :CFBundleIdentifier "'${PACKAGENAME}'"' ${PLIST_PATH}
/usr/bin/codesign --continue -f -s "iPhone Distribution: ChangYou.com Korea LLC (6XKS4M5W94)" --entitlements ${entitlements} ${SHELL_FOLDER}"/Payload/dm48.app"
echo "第一步成功啦,下面隨意修改"
第二步
到這里的話,咱們就已經(jīng)把.app重簽過了,大家可以根據(jù)各自的需求來進(jìn)行修改,或修改.plist,.data,或替換資源都可以,基本除了引擎編譯的內(nèi)容,其他都可以替換和修改。
第三步
這里所操作的步驟較少,主要就是把a(bǔ)pp文件打成ipa,廢話不多說,直接上代碼,直接傳入包體的名字以及.app文件的路徑即可:
#!/bin/sh
#默認(rèn)填入數(shù)據(jù),不填可以不用管
appNameStr="替換為你app的包名,eg. Sky"
appOriginPathStr="替換為你app文件的絕對(duì)路徑,eg. xxx/Sky.app"
appIconPathStr="圖標(biāo)文件絕對(duì)路徑,eg. xxx/Icon.png"
if [ "$1" ]
then
appNameStr="$1"
fi
if [ "$2" ]
then
appOriginPathStr="$2"
fi
if [ "$3" ]
then
appIconPathStr="$3"
fi
appName=${appNameStr}
appDetailName=${appName}".app"
appPayloadName=${appName}"/Payload"
appCopyToPayloadPath=${appPayloadName}"/"${appDetailName}
appOriginPath=${appOriginPathStr}
appIconPath=${appIconPathStr}
if [ ! -x "$appOriginPath" ];
then
echo "打包路徑不存在,退出"
exit 0
fi
if [ -x "$appName" ]
then
rm -rf "$appName"
echo "Remove folder $appName"
else
echo "folder $appName does not exist"
fi
echo "make dir $appName"
mkdir "$appName"
mkdir "$appPayloadName"
if [ -x "$appDetailName" ]
then
echo "Remove file $appDetailName"
rm -rf "$appDetailName"
fi
echo "copy $appDetailName ..."
cp -r "$appOriginPath" "$appDetailName"
echo "copy $appName to payload"
#替換xxx為app名稱
cp -r "$appDetailName" "$appCopyToPayloadPath"
echo "copy icon to iTunesArtwork"
cp "$appIconPath" ${appName}"/iTunesArtwork"
cd "$appName"
echo "start zip..."
zip -r ${appName}".ipa" Payload iTunesArtwork
exit 0
上邊就是具體的流程了,這倆shell文件和ipa以及描述文件放一個(gè)文件夾下,運(yùn)行腳本即可