as中apk簽名和多渠道打包
1.什麼是簽名:
數字簽名就是為你的程式打上一種標記,來作為你自己的標識,當別人看到簽名的時候會知道它是與你相關的
2.為什麼要簽名
- 防止盜版,app市場可以檢測簽名
- 未簽名的apk無法安裝,也沒法釋出到應用市場
- 包名相同,簽名不同的apk無法升級覆蓋
3.怎麼簽名
bulid-》generate signed apk,如果jks檔案已經存在,選擇即可,如果不存在,新建一個
4.jks檔案的keystore密碼,別名和私鑰密碼
JKS檔案就好像一個倉庫,倉庫有一個密碼,裡面存放金鑰,包括公鑰和私鑰,每個金鑰都有一個別名,公鑰通過別名就可以直接訪問了,私鑰還要對應一個密碼,需要別名和密碼兩個引數才能獲得
簽名時的兩個密碼(key store密碼和key 密碼),即倉庫密碼和私鑰密碼。
5.release版和debug版的區別,如何在gradle中配置簽名
區別:
release版本是沒法在真機上斷點除錯的
debug版本預設有一個簽名檔案,release版本必須自己配置簽名檔案
配置的方法是在gradle中寫配置資訊,別名和兩個密碼都不能寫錯(簽名檔案放到工程根目錄下):
android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.qianfeng.zhouyi.picassodemo"minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } signingConfigs { release { storeFile file("release.jks") storePassword "123456" keyAlias "release" keyPassword "123456" } } buildTypes { release { signingConfig signingConfigs.release }} }
6.多渠道打包
基本原理是利用Gradle的 manifest merger 功能,這個功能的主要用途是能夠在執行時替換AndroidManifest.xml裡面的內容,具體功能大家自行檢視文件吧,這裡就不贅述了。
我用的是友盟的統計,所以現在AndroidManifest.xml裡面會有這麼一段:
<meta-data
android:name="UMENG_CHANNEL"
android:value="Channel_ID" />
裡面的Channel_ID就是渠道標示。我們的目標就是在編譯的時候這個值能夠自動變化。
第一步 在AndroidManifest.xml裡配置PlaceHolder
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
第二步 在模組的build.gradle檔案的defaultConfig里加上PlaceHolder定義
android {
...
defaultConfig {
...
manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
}
}
這裡的作用有兩個,一是宣告 UMENG_CHANNEL_VALUE
是可替換值的PlaceHolder,二是為其設定預設值。
第三步 在模組的build.gradle檔案裡新增ProductFlavors配置
android {
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
或批量:
android {
...
defaultConfig {
...
manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
}
productFlavors {
default_channel{}
wandoujia{}
_360{}
yingyongbao{}
xiaomi{}
baidu{}
huawei{}
jifeng{}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
}
}
所謂ProductFlavors其實就是可定義的產品特性,配合 manifest merger
使用的時候就可以達成在一次編譯過程中產生多個具有自己特性配置的版本。
上面這個配置的作用就是,為每個渠道包產生不同的 UMENG_CHANNEL_VALUE
的值。