Android Studio签名、打包、自定义apk名称

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存放路径

一、手动对apk进行签名打包

第一步:As--->导航栏--->Build--->Generate Signed Bundle /APK...

Android Studio签名、打包、自定义apk名称_第1张图片

第二步:选择APK (第一个选择是Google 推出的模式,APK容量将大大缩小,也是官方推荐的,此处暂不讲)

Android Studio签名、打包、自定义apk名称_第2张图片

第三步:选择创建签名文件 或  选择已有的签名文件(文件名以 .jks结尾)

如果是创建签名文件,就点击下图红色箭头指向的选项,选择已有右边的选项;

创建签名文件:       

Alias(别名)、Password(设置别名密码)、Confirm(确认别名密码)、Validity(证书有限期,推荐25年)、First and Last Name(开发者姓名),Organizational Unit(开发者的组织代码),Organization(开发者的组织名字),City or Locality(开发者所在的城市),State or Province(开发者所在的省份),Country Code(XX)(开发者所在的国家的代码,中国填写86)填写信息的目的用于生产密钥和签名认证。

名字密码最好记录下来,后续升级还要用到,如果时间长忘记了,那你就挂机吧 -_-

Android Studio签名、打包、自定义apk名称_第3张图片

第四步:创建/选择 完毕签名文件,依次填写 , 并记住密码(下次就不用填写了),点击Next

签名文件路径、密码(Key store path、Key store)

签名别名、密码(Key alias、Key password)

Android Studio签名、打包、自定义apk名称_第4张图片

第五步:选择release , 勾选选择V1、V2 , 点击Finish

v1签名是对jar进行签名,V2签名是对整个apk签名 

图像 小部件

第六步:等待签名打包完成,点击locate即可查看apk存放位置。

Android Studio签名、打包、自定义apk名称_第5张图片

 

二、配置Gradle进行自动签名打包

第一步:右键项目--->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)

Android Studio签名、打包、自定义apk名称_第6张图片

第二步:切换到Build Variants-->app--->Build Types--->release --->选择Signing Config(下方图片中间蓝色字体部分)

点击ok 即可;

Android Studio签名、打包、自定义apk名称_第7张图片第三步:进入项目build.gradle(app)文件中,你会发现多了部分内容,如下:

signingConfigs {    release { 签名路径、密码、别名、别名密码 }    }

此时,使用assembleRelease就会生成release版的apk;

默认路径保存在:app/build/outputs/apk/release/app-release.apk

Android Studio签名、打包、自定义apk名称_第8张图片

 

注意(报错):

Could not set process working directory to .....  could not setcwd() (errno 2: 没有那个文件或目录),

出现这个错误,点击Refresh Gradle project 即可;

Android Studio签名、打包、自定义apk名称_第9张图片

 

三、自定义打包apk的存放路径

修改打包后的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名称+版本号+版本名称+日期+文件后缀)

Android Studio签名、打包、自定义apk名称_第10张图片

四、Could not get unknown property ‘release’ for SigningConfig Container. 的错误

解决办法:  将

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'
            }
        } 
    }

六、使用resConfigs去除无用语言资源

当项目本身支持多国语言时,对不同产品风格进行适配,某些产品限定支持的国家语言,此时,可以使用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产品只支持英语
            }
     } 

 

 

 

你可能感兴趣的:(签名打包)