Android开发中,不可避免的会对apk进行签名打包,在此记录一下,方便以后查看;
目前开发环境:Android Studio 3.3
主要讲以下几个方面问题:
1、手动对apk签名打包
2、配置Gradle进行自动签名打包
3、自定义打包apk的名称
4、记录一个小错误: Could not get unknown property ‘release’ for SigningConfig Container.
5、配置不同风格
6、剔除无用语言资源,限定产品语言
日常开发中 常见的组合就是 配置gradle自动签名打包 + 自定义apk存放路径
第一步:As--->导航栏--->Build--->Generate Signed Bundle /APK...
第二步:选择APK (第一个选择是Google 推出的模式,APK容量将大大缩小,也是官方推荐的,此处暂不讲)
第三步:选择创建签名文件 或 选择已有的签名文件(文件名以 .jks结尾)
如果是创建签名文件,就点击下图红色箭头指向的选项,选择已有右边的选项;
创建签名文件:
Alias(别名)、Password(设置别名密码)、Confirm(确认别名密码)、Validity(证书有限期,推荐25年)、First and Last Name(开发者姓名),Organizational Unit(开发者的组织代码),Organization(开发者的组织名字),City or Locality(开发者所在的城市),State or Province(开发者所在的省份),Country Code(XX)(开发者所在的国家的代码,中国填写86)填写信息的目的用于生产密钥和签名认证。
名字密码最好记录下来,后续升级还要用到,如果时间长忘记了,那你就挂机吧 -_-
第四步:创建/选择 完毕签名文件,依次填写 , 并记住密码(下次就不用填写了),点击Next
签名文件路径、密码(Key store path、Key store)
签名别名、密码(Key alias、Key password)
第五步:选择release , 勾选选择V1、V2 , 点击Finish
v1签名是对jar进行签名,V2签名是对整个apk签名
图像 小部件
第六步:等待签名打包完成,点击locate即可查看apk存放位置。
第一步:右键项目--->Open Module Setting -->Modules-->app--->Signing Configs
点击下图中release上面的加号(我这里是之前创建的release,第一次是没有个release的,这里只是为了方便说明加号的箭头)弹出Create New Signing Config ,填入release ,点击ok,效果如下图,
然后在release下方依次填写入之前生成的
签名文件路径、密码(Key store path、Key store)
签名别名、密码(Key alias、Key password)
第二步:切换到Build Variants-->app--->Build Types--->release --->选择Signing Config(下方图片中间蓝色字体部分)
点击ok 即可;
第三步:进入项目build.gradle(app)文件中,你会发现多了部分内容,如下:
signingConfigs { release { 签名路径、密码、别名、别名密码 } }
此时,使用assembleRelease就会生成release版的apk;
默认路径保存在:app/build/outputs/apk/release/app-release.apk
注意(报错):
Could not set process working directory to ..... could not setcwd() (errno 2: 没有那个文件或目录),
出现这个错误,点击Refresh Gradle project 即可;
修改打包后的apk名称(如果你愿意手动配置当我没说),那就需要在build.gradle文件中进行配置了,找到文件中的buildTypes
第一步:加载配置文件signapk.properties:
在app的根目录下创建文件,命名为signapk.properties ;将
签名文件路径、密码(Key store path、Key store)、签名别名、密码(Key alias、Key password)放置进去
(一般情况下,keystore文件路径、密码、别名及其密码都不会直接放在build.gradle文件中的)
build.gradle(app)中加入以下代码:
Properties signprops = new Properties()
signprops.load(new FileInputStream(file("signapk.properties")))
第二步:build.gradle(app)中加入时间格式
/*时间*/
static def releaseTime(){
return new Date().format("yyyyMMdd",TimeZone.getTimeZone("UTC"));
}
第三步:build.gradle(app)中找到buildTypes标签,加入自定义路径部分代码:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if(outputFile !=null && outputFile.name.endsWith('.apk')){
//此处的project.appname也可以在signapk.properties文件中声明。fileName即生成apk的名称
def fileName = "${signprops['project.appname']}
-${defaultConfig.versionCode}
-${defaultConfig.versionName}-${releaseTime()}"
if(variant.buildType.name.equals('release')){
outputFileName = fileName + ".apk"
} else if(variant.buildType.name.equals('debug')){
outputFileName = fileName + "-debug.apk"
}
}
}
}
}
第四步:点击sync,点击assembleRelease,查看apk(可根据个人需要,调整修改相关属性)
如有报错,点击上述图片的 Refresh Gradle project ,进行刷新,
然后点击下图中的assembleRelease,等待结束后,进入app/build/outputs/apk/release/目录下,即可查看生成的apk;
例如:Shodow-100-1.0.0-20190605.apk (app名称+版本号+版本名称+日期+文件后缀)
解决办法: 将
signingConfigs {} 标签放在 buildTypes{}标签前面,即可Sync通过;
flavorDimensions 'res'// 定义要替换res目录下风格属性
/*为不同的APP配置不同产品风格,替换不同资源文件,代码*/
productFlavors {
def appname = signprops['project.appname']
if ("Crazy".equals(appname)) {
crazy {
dimension 'res'
}
} else if ("Happy".equals(appname)) {
happy {
dimension 'res'
}
}
}
当项目本身支持多国语言时,对不同产品风格进行适配,某些产品限定支持的国家语言,此时,可以使用resConfig移除无用资源;
productFlavors {
def appname = signprops['project.appname']
if ("Crazy".equals(appname)) {
crazy {
dimension 'res'
resConfigs "en","zh" //限定当前Happy产品只支持英语和中文
} else if ("Happy".equals(appname)) {
happy {
dimension 'res'
resConfigs "en" //限定当前Happy产品只支持英语
}
}