Android 打包記
安卓打包相比iOS算是簡單的多的多了,沒有那么 多證書限制
安卓打包只需要一個簽名文件(keystore),能證明這個包(apk)是屬于你的就行了
一、生成keystore
兩種方法可以生成keystore
(1) Android Studio (V3.4.2)






操作完成后,在android/路徑下會生成一個名為adnpack_dist.keystore的文件
關(guān)于Signature Versions: V1, V2 請參考 https://blog.csdn.net/lvshuchangyin/article/details/62227286
(2) keytool命令 CLI
$ keytool -genkey -v -keystore andpack_dist_cli.keystore -alias andpack_dist_cli -keyalg RSA -keysize 2048 -validity 10000
輸出:
輸入密鑰庫口令:
再次輸入新口令:
您的名字與姓氏是什么?
[Unknown]: yongqianvip
您的組織單位名稱是什么?
[Unknown]: com
您的組織名稱是什么?
[Unknown]: com
您所在的城市或區(qū)域名稱是什么?
[Unknown]: bj
您所在的省/市/自治區(qū)名稱是什么?
[Unknown]: bj
該單位的雙字母國家/地區(qū)代碼是什么?
[Unknown]: CN
CN=yongqianvip, OU=com, O=com, L=bj, ST=bj, C=CN是否正確?
[否]: y
正在為以下對象生成 2,048 位RSA密鑰對和自簽名證書 (SHA256withRSA) (有效期為 10,000 天):
CN=yongqianvip, OU=com, O=com, L=bj, ST=bj, C=CN
輸入 <my-key-alias> 的密鑰口令
(如果和密鑰庫口令相同, 按回車):
[正在存儲andpack_dist_cli.keystore]
Warning:
JKS 密鑰庫使用專用格式。建議使用 "keytool -importkeystore -srckeystore andpack_dist_cli.keystore -destkeystore andpack_dist_cli.keystore -deststoretype pkcs12" 遷移到行業(yè)標(biāo)準(zhǔn)格式 PKCS12。
針對CLI執(zhí)行最后的Warning問題,建議參照提示,把我們生成的非標(biāo)準(zhǔn)keystore遷移到標(biāo)準(zhǔn)格式
操作完成后,在android/路徑下生成一個名為adnpack_dist_cli.keystore的文件
二、使用keystore給應(yīng)用簽名
通過上述兩種方式,我們得到了keystore文件(這個文件默認(rèn)是被VCS忽略的,本地保留即可),在工程中通過配置,在打包時用來給包簽名
在android/app/build.gradle中編輯以下信息
android {
...
// 簽名配置部分
signingConfigs{
release{
storeFile file("../andpack_dist.keystore") // keystore相對路徑
storePassword "715@1234567"
keyAlias "andpack_dist"
keyPassword "715@1234567"
}
buildTypes {
release {
...
signingConfig signingConfigs.release // 配置簽名
}
}
...
}
在android/下執(zhí)行:
$ ./gradlew assembleRelease
一切正常則會在andorid/app/build/outputs/apk/下輸出apk
三、其他
通過上述步驟得到簽名過的apk,已經(jīng)可以用于發(fā)布了,但是實(shí)測過程發(fā)現(xiàn),一個空的工程輸出的apk竟然將近20M大小,這是不能接受的,所以用Android Studio分析一個apk的組成結(jié)構(gòu)

問題很明顯了,沒有選擇目標(biāo)架構(gòu),默認(rèn)包含了 armeabi-v7a, x86, arm64-v8a, x86_64四種架構(gòu),這個可以根據(jù)自己實(shí)際業(yè)務(wù)場景選擇配置,因?yàn)槲也皇亲鯝ndroid 原生開發(fā)的,所以這塊可能解釋的不太清除,請客官自行Google
如果僅保留armeabi-v7a,修改android/app/build.gradle
android {
...
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a"
}
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a"
}
}
...
}
重新打包,得到的apk包結(jié)構(gòu)如下
