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
的值。