apk簽名bash腳本

一般apk在打包之后還會(huì)進(jìn)行加固旧烧、重新簽名,公司用的樂固不支持對(duì)每個(gè)項(xiàng)目自動(dòng)化簽名画髓,但一個(gè)個(gè)簽名實(shí)在麻煩掘剪,所以寫個(gè)腳本來幫助簽名

  • apk名稱需要遵照格式
  • 簽名后保存到指定位置,方便歸檔
  • 尚未支持批量簽名

腳本:hand_apk.sh

#!/bin/bash
# author:eraise
# description: 把 apk 移動(dòng)到日期目錄下
# 未簽名文件的格式為: 特殊前綴-flavor名稱-版本號(hào)_legu.apk奈虾,后面的_legu.apk為樂固加固自行添加的

cpMapping=true # true 為需要拷貝 mapping 文件保存
openDist=true # true 為需要打開目標(biāo)文件夾

################ 默認(rèn)配置 start #################
buildToolsVersion="25.0.3" # 編譯工具版本夺谁,簽名會(huì)到對(duì)于應(yīng)目錄下去使用相關(guān)工具,如 zipalign
storePwd="123456" # 默認(rèn)的簽名文件密碼
keyPwd="123456" # 默認(rèn)的簽名別名密碼
################ 默認(rèn)配置 end ###################

############# 根據(jù)apk名稱進(jìn)行配置 start ##########
unsignApkPath=$1 # 待簽名的apk路徑

fileDir=${unsignApkPath%/*} # 文件目錄
# echo "dir: "$fileDir
appDef=${unsignApkPath##*/} # 排除無意義的 _legu.apk 和文件夾路徑以便解析
appDef=${appDef%%_legu.apk}
# echo "appDef: "$appDef
appPrefix=${appDef%%-*} # 每個(gè)項(xiàng)目獨(dú)有的前綴
# echo "app: "$appPrefix
flavor=${appDef#*-} # flavor
flavor=${flavor%%-*}
flavor=`echo ${flavor} | tr '[:upper:]' '[:lower:]'`
echo "flavor: "$flavor
version=${appDef##*-}   # 版本號(hào)
echo "version: "$version

# 根據(jù)項(xiàng)目獨(dú)有的前綴來做定制化設(shè)置
case ${appPrefix} in
    'app1')
        modulePath=~/Code/app1/app # module 路徑肉微,用于后續(xù)取出 mapping 文件
        path=~/Documents/app1/apk # apk保存路徑
        keystore="/Users/eraise/Code/keystore/app1.keystore"
        case ${flavor} in # 根據(jù)不同的 flavor 取不同的別名
            'international')
                align="international"
                ;;
            *)
                align="domestic"
                ;;
        esac
        ;;
    'app2')
        modulePath=~/Code/app2/app
        path=~/Documents/app2/apk
        case ${flavor} in
            'international')
                keystore="/Users/eraise/keystore/app2/app2_keystore.jks"
                align="internation"
                ;;
            *)
                keystore="/Users/eraise/Code/app2/app2_keystore.jks"
                align="tw"
                ;;
        esac
        ;;
    'app3')
        modulePath=~/Code/app3/app
        path=~/Documents/app3/apk
        keystore="/Users/eraise/keystore/app3.keystore"
        align='default'
        ;;
esac

if [ ! $align ]; then
    echo '無法識(shí)別key align'
    exit 2
fi
############# 根據(jù)apk名稱進(jìn)行配置 end ############

################ 邏輯部分 start #################

if [ -f ${unsignApkPath} ]
then
    echo "${unsignApkPath} 文件存在匾鸥,任務(wù)開始"
else
    echo "${unsignApkPath} 文件不存在,執(zhí)行失敗"
    exit 2
fi

echo '正在進(jìn)行zipalign'
zipalignFile=${appDef}"-zipalign.apk"
zipalignCmd="$ANDROID_HOME/build-tools/${buildToolsVersion}/zipalign -v -p  4 ${unsignApkPath} ${zipalignFile}"
echo $zipalignCmd
# 執(zhí)行zipalign
${zipalignCmd}

if [ ! -e $zipalignFile ]
then
    echo 'zipalign執(zhí)行失敗'
    exit 2
fi

# 打包出來的apk的存放位置
today=`date +%Y%m%d`
targetPath="${path}/${today}"
if [ ! -d $targetPath ];then
    mkdir $targetPath
fi

if [ ! -d $targetPath ] ; then 
    echo '目標(biāo)文件夾創(chuàng)建失敗' 
    exit 2
fi
targetPath="$targetPath/(${flavor}_v${version//./_})"
if [ ! -d $targetPath ];then
    mkdir $targetPath
fi

if [ ! -d $targetPath ] ; then 
    echo '目標(biāo)文件夾創(chuàng)建失敗' 
    exit 2
fi

echo '正在簽名'
signFile=${appDef}"-signed.apk"
signCmd="$ANDROID_HOME/build-tools/${buildToolsVersion}/apksigner sign \
--ks ${keystore} \
--ks-key-alias ${align} \
--ks-pass pass:${storePwd} \
--key-pass pass:${keyPwd} \
--out ${targetPath}/${signFile} ${zipalignFile}"
${signCmd}

if [ ! -e ${targetPath}/${signFile} ] ; then
    echo '簽名失敗'
    exit 2
fi

echo '刪除臨時(shí)文件'
rm ${zipalignFile}
echo '刪除源文件'
rm ${unsignApkPath}

if $cpMapping
then
    echo '拷貝mapping.txt文件'
    cp ${modulePath}"/build/outputs/mapping/"${flavor}"/release/mapping.txt" ${targetPath}"/"${appDef}"-mapping.txt"
fi

echo '任務(wù)執(zhí)行完成'

if $openDist
then
    open $targetPath
fi

################ 邏輯部分 end ###################

在 gradle 中設(shè)置編譯出的apk按格式命名

不同的targetSdkVersion有不同的寫法碉纳,

  • targetrSdkVersion 26以下:

android 節(jié)點(diǎn)下添加:

applicationVariants.all { variant ->
        variant.outputs.each { output ->
            String dirName = output.getProperties().get("dirName")
            // release 版才需要重命名
            if (dirName.endsWith("release")) {
                def file = "獨(dú)特前綴-" \
                        + dirName.substring(0, dirName.indexOf('/')) + "-" \
                        + defaultConfig.versionName.replace(".", "_") \
                        + ".apk"
                output.outputFile = new File(output.outputFile.parent, file)
            }
        }
    }
  • targetSdkVersion 26以上:
    android>buildTypes>release節(jié)點(diǎn)下添加:
applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    boolean isRelease = output.getProperties().get("dirName").endsWith("release")
                    // release 版才需要重命名
                    if (isRelease) {
                        def outputFile = output.outputFile
                        if (outputFile != null && outputFile.name.endsWith('.apk')) {
                            def fileName = "獨(dú)有前綴-v${defaultConfig.versionName.replace(".", "_")}_${releaseTime()}-${variant.productFlavors[0].name}.apk"
                            output.outputFile = new File(outputFile.parent, fileName)
                        }
                    }
                }
            }

使用

./hand_apk.sh apk路徑

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勿负,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劳曹,更是在濱河造成了極大的恐慌奴愉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铁孵,死亡現(xiàn)場(chǎng)離奇詭異锭硼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蜕劝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門檀头,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岖沛,你說我怎么就攤上這事暑始。” “怎么了烫止?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蒋荚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我馆蠕,道長(zhǎng),這世上最難降的妖魔是什么惊奇? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任互躬,我火速辦了婚禮,結(jié)果婚禮上颂郎,老公的妹妹穿的比我還像新娘吼渡。我一直安慰自己,他們只是感情好乓序,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布寺酪。 她就那樣靜靜地躺著坎背,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寄雀。 梳的紋絲不亂的頭發(fā)上得滤,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音盒犹,去河邊找鬼懂更。 笑死,一個(gè)胖子當(dāng)著我的面吹牛急膀,可吹牛的內(nèi)容都是我干的沮协。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卓嫂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼慷暂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晨雳,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤呜呐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后悍募,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蘑辑,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年坠宴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洋魂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喜鼓,死狀恐怖副砍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庄岖,我是刑警寧澤豁翎,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站隅忿,受9級(jí)特大地震影響心剥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜背桐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一优烧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧链峭,春花似錦畦娄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杖刷。三九已至,卻和暖如春驳癌,著一層夾襖步出監(jiān)牢的瞬間滑燃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工喂柒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留不瓶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓灾杰,卻偏偏與公主長(zhǎng)得像蚊丐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子艳吠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 轉(zhuǎn)載注明出處:http://www.reibang.com/p/5255b100930e 0. 前言 完全由個(gè)人翻...
    王三的貓阿德閱讀 2,515評(píng)論 0 4
  • feisky云計(jì)算麦备、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,844評(píng)論 0 5
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng),請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,131評(píng)論 8 72
  • 第五章 為什么網(wǎng)絡(luò)很重要? 還是一樣的栏渺,專注呛梆、參與、協(xié)作磕诊、對(duì)信息的批判性繼承和聯(lián)網(wǎng)技巧填物。感覺這個(gè)題目和這五個(gè)詞都沒...
    HinataWail閱讀 256評(píng)論 0 0