天天看點

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名稱

第二步:選擇APK (第一個選擇是Google 推出的模式,APK容量将大大縮小,也是官方推薦的,此處暫不講)

Android Studio簽名、打包、自定義apk名稱

第三步:選擇建立簽名檔案 或  選擇已有的簽名檔案(檔案名以 .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名稱

第四步:建立/選擇 完畢簽名檔案,依次填寫 , 并記住密碼(下次就不用填寫了),點選Next

簽名檔案路徑、密碼(Key store path、Key store)

簽名别名、密碼(Key alias、Key password)

Android Studio簽名、打包、自定義apk名稱

第五步:選擇release , 勾選選擇V1、V2 , 點選Finish

v1簽名是對jar進行簽名,V2簽名是對整個apk簽名 

圖像 小部件

第六步:等待簽名打包完成,點選locate即可檢視apk存放位置。

Android Studio簽名、打包、自定義apk名稱

二、配置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名稱

第二步:切換到Build Variants-->app--->Build Types--->release --->選擇Signing Config(下方圖檔中間藍色字型部分)

點選ok 即可;

Android Studio簽名、打包、自定義apk名稱

第三步:進入項目build.gradle(app)檔案中,你會發現多了部分内容,如下:

signingConfigs {    release { 簽名路徑、密碼、别名、别名密碼 }    }
           

此時,使用assembleRelease就會生成release版的apk;

預設路徑儲存在:app/build/outputs/apk/release/app-release.apk

Android Studio簽名、打包、自定義apk名稱

注意(報錯):

Could not set process working directory to .....  could not setcwd() (errno 2: 沒有那個檔案或目錄),

出現這個錯誤,點選Refresh Gradle project 即可;

Android Studio簽名、打包、自定義apk名稱

三、自定義打包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名稱

四、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産品隻支援英語
            }
     }