主頁 > 移動端開發 > 詳解android專案配置簽名檔案的完整流程

詳解android專案配置簽名檔案的完整流程

2021-10-28 08:14:22 移動端開發

1.背景

接手的專案近期需要上線,于是復習了一下專案簽名檔案配置流程,這里做個系統性總結,

2.最終目標

根據需求為debug包與release包配置簽名檔案,快速滿足中小型專案的需要,

3.創建簽名檔案

要將簽名檔案配置到專案中,首先需要創建一個簽名檔案,android studio為我們提供了圖形化創建方式,這里簡單贅述一下:

導航欄build下選擇 generate signed bundle/apk,如下圖:

QQ截圖20210427151350.png

國內的就選擇apk,點擊next:

QQ截圖20210427151520.png

點擊 create new,創建一個新的簽名檔案:

QQ截圖20210427151600.png

接下來需要填入一些資訊,下面的截圖簡單解釋了一下,其中,certificate下的六個填空題,做一個就可以了,這里建議應填盡填:

QQ截圖20210427153617.png

填完之后,點擊OK,進行創建,完事兒~ 等等?咋還報錯了嘞?瞅瞅說的啥,,,

QQ截圖20210427154512.png

哦~ 他讓咱們用命令列遷移到行業標準格式,那來吧:復制一下警告彈窗里的那條命令(keytool -importkeystore......pkcs12),打開terminal終端,粘貼進去,點回車,走你~ 按照提示,輸入源秘鑰庫口令,就是剛剛設定的密碼,再回車,走你~ OK,到這里,簽名檔案就創建完成了,

QQ截圖20210427154759.png

4.生成release與debug簽名檔案的配置資訊

我們需要在app的build.gradle下生成測驗包與正式包的配置腳本,來分別配置debug包與release包的不同屬性,比如測驗包與正式包都使用自己的簽名檔案、正式包開混淆但測驗包不開等等,方便我們進行開發與上線, android studio也為我們提供了圖形化操作界面,下面一起來走一遍:

導航欄 file -> project structure,進到專案結構界面

QQ截圖20210427161946.png

專案結構界面依次選擇: modules -> app -> signing configs,如下圖:

QQ截圖20210427162829.png

點擊“+”新增一個配置資訊,輸入release,代表這是用于正式包的簽名檔案資訊,點擊OK:

QQ截圖20210427163308.png

QQ截圖20210427163628.png

輸入相關資訊后,點擊 apply,release包的簽名檔案就生成完畢了,同理,生成debug包的簽名檔案配置資訊,用于日常開發與除錯,這里建議與release包使用相同的簽名檔案,避免相同包名的debug版本與release版本,由于簽名不同而重復卸載與安裝(插個題外話:必須要讓debug包與release包使用不同簽名檔案的小伙伴,可以采用給測驗包追加包名的方式,避免正式包與測驗包的包名沖突,這里先挖個坑【坑1】,下文來填上), release簽名檔案配置如圖:

QQ截圖20210427164118.png

debug簽名檔案配置如圖:

QQ截圖20210427164258.png

點擊OK之后,等待專案配置完成,然后打開專案app目錄下的build.gradle檔案,我們可以看到,release包的簽名資訊與debug包的簽名資訊都已經生成,如圖:

QQ截圖20210427164400.png

但是目前為止,我們僅僅是生成了自己的兩種簽名檔案資訊,卻還沒配置到測驗包與正式包里,那么怎么在編譯測驗包或者正式包的時候,讓他們各自使用自己的簽名檔案資訊呢?先別捉急,咱喝口茶緩一緩先,

5.將簽名檔案資訊配置給對應的包

喝著茶咱也別閑著,來看一看app目錄下build.gradle里面的buildType的資訊:

QQ截圖20210427172611.png

這個bulidType里,記錄著專案的release包、debug包等各種包的配置,咱們可以看到,創建專案的時候,系統為咱們顯式自動生成了release包的配置,但是只配置了兩個值,這里簡單解釋一下:

  • minifyEnabled:是否開啟混淆(debug模式默認為true,release模式默認false)
  • proguardFiles:混淆檔案(僅在minifyEnabled為true時生效) OK,接下來咱們先配置release包的簽名檔案,依舊是打開專案結構界面,但是選擇 build variants,如圖:

QQ截圖20210427172854.png

咱們看到,系統已經生成了一個release,這個就是正式包的組態檔,咱們這次只需要設定一下簽名檔案就OK了,別的設定可以自行了解,在signing config下選擇設定的signingConfigs.release選項,點擊apply來應用設定, 編譯完成后,回到app目錄下的build.gradle,查看buildTypes,如圖:

QQ截圖20210427180458.png

到這里,release包的簽名檔案便配置完成了, 接下來配置debug包的簽名檔案,依舊是打開專案結構界面創建變數界面(file-> project structure -> build variants ),選擇app包:

QQ截圖20210428100206.png

點擊“+”號,輸入debug,點擊OK后,debug包的各項默認配置便顯示出來了,

QQ截圖20210428100401.png

咱們可以根據需要來更改這些配置,比如,Debuggable(應用是否可除錯,底下解釋【埋坑2】)默認值是true,這時候咱們可以顯式的指定出來,就給它默認值改為手動設定的true,當然,這里不改也是沒問題的,Debuggable如下圖:

QQ截圖20210428100458.png

【坑2】解釋:debuggable,顧名思義,就是是否可調式,指的是應用在運行程序中,能否通過編譯器進行除錯,最直接的表現就是系統日志輸出,默認情況下,release包下處于關閉模式,debug包處于開啟模式,開發程序中,必要情況下可以更改該值來除錯debug包或者release包,

配置debug包簽名檔案操作與配置release包的簽名檔案基本一樣,找到 signing config,選擇簽名檔案,然后點擊apply來應用配置,最后OK,如下圖:

QQ截圖20210428103707.png

同步完成后,可以看到編譯器已經為我們自動產生了debug包的配置資訊,并應用了咱們自定義的簽名檔案:

QQ截圖20210428100741.png

到這里,簽名檔案的基本配置流程已經講完了,但是這樣的配置是會產生簽名檔案資訊的安全問題的, 在談安全問題之前,咱們先填一填前面埋的【坑1】:關于在debug包追加包名的事兒,有興趣的小伙伴來了解一下,沒興趣的可以跳下一小節了, 前面提到,為了避免測驗包與正式包安裝沖突,咱們可以使用兩種方式,一種是上面的使用同一個簽名檔案,另一種是給測驗包追加包名,讓他們包名不同,從而避免包名沖突,android studio同樣為我們提供了圖形化追加包名的方式,甚至剛剛我們還見到過,

[ 黑人問號臉.jpg ]

不信你看截圖:

QQ截圖20210428105758.png

沒錯,就是在這里追加包名,比如我的demo的默認包名是com.dylan.signaturetest,我想讓測驗包的包名是com.dylan.signaturetest.debug,那么我只需要在這個application id suffix里添加“.debug”即可,如圖:

QQ截圖20210428110918.png

依次點擊apply與OK后,等待同步完成,查看build.gradle的配置如下:

QQ截圖20210428110154.png

可以看到,applicationIdSuffix屬性已經被添加成功,這時候我們分別運行正式包與測驗包,運行方式如圖:

正式包運行方式截圖

測驗包運行方式截圖

運行結果如圖:

84ffa90b605e851c5e437a70bd3bccf.jpg

可以看到,兩個包可以同時存在,查看包名,如圖:

測驗包包名截圖

正式包包名截圖

正如我們期望的那樣,正式包與測驗包同時存在了, OK,上面埋的坑填完了,底下講一講上文提到的,簽名檔案資訊安全問題,

6.將簽名檔案資訊移動到專案本地組態檔

前面我們發現,簽名檔案的檔案名、密碼等極其敏感的資訊,都是放在專案app包下的build.gradle里的,會隨著專案的發包,一起發到各大應用市場,這樣安裝包被不懷好意的玩家們進行反編譯后,輕而易舉的就可以獲取到我們的簽名檔案資訊,除此之外,檔案路徑寫在gradle里,在多端協作開發同一個專案的時候,大家的簽名檔案放置的位置五花八門,也會引起這里gradle檔案的簽名檔案路徑被多人頻繁修改的問題, 為了避免這種情況,往往我們會將簽名檔案的配置資訊單獨在本地組態檔local.properties里,該檔案在新建專案的時候,android studio會幫我們創建好,位于專案根目錄下,在進行Git版本控制時,默認不會被添加到Git提交到遠程倉庫,在別人第一次拉取遠程倉庫代碼時,只需要創建自己的local.properties檔案即可,檔案截圖如下:

QQ截圖20210428132122.png

可以看到,我們的android SDK路徑就是在這里配置的,底下我們來撰寫代碼,來實作從local.properties檔案里讀取簽名檔案資訊,

首先,local.properties檔案內指定簽名檔案路徑、密碼、別名、別名密碼等資訊,如圖:

QQ截圖.png

接著在app目錄下的build.gradle檔案的android下撰寫代碼,讀取local.properties檔案,并讀取指定的資訊,如圖:

QQ截圖20210428135421.png

最后,將讀取到的簽名檔案資訊配置給signingConfigs內debug與release,如圖:

QQ截圖20210428135904.png

至此,簽名檔案從產生到配置的完整流程,算是已經講完了,

7.總結

本文講解了從零開始配置一個android專案簽名檔案的完整流程,通過閱讀本文,我們可以對簽名檔案配置有一個整體的把握,后續配置簽名檔案也可以一文搞定, 由于筆者能力有限,文章難免出現錯誤,歡迎指正!

附錄:相關原始碼

核心組態檔一共兩點,即專案根目錄下的local.properties與app目錄下的build.gradle檔案的android屬性,分別如下:

local.properties

## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=C\:\\Users\\Dylan\\AppData\\Local\\Android\\Sdk
#
#簽名檔案配置資訊
keyStoreFile=C\:\\Users\\Dylan\\Desktop\\signatureTest.jks
keyStorePassword=123456
keyAlias=key0
keyAliasPassword=123456

復制代碼

使用的時候更換為自己的簽名檔案相關資訊,

app//build.gradle

android {

    // 讀取local.properties檔案
    Properties properties = new Properties()
    InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream()
    properties.load(inputStream)

    // 讀取簽名檔案
    def keyKeyStoreFile = file(properties.getProperty('keyStoreFile'))
    // 讀取簽名檔案別名、密碼等資訊
    def keyKeyStorePassword = properties.getProperty('keyStorePassword')
    def keyKeyAlias = properties.getProperty('keyAlias')
    def keyKeyAliasPassword = properties.getProperty('keyAliasPassword')


    signingConfigs {
        release {
            storeFile keyKeyStoreFile
            storePassword keyKeyStorePassword
            keyAlias keyKeyAlias
            keyPassword keyKeyAliasPassword
        }
        debug {
            storeFile keyKeyStoreFile
            storePassword keyKeyStorePassword
            keyAlias keyKeyAlias
            keyPassword keyKeyAliasPassword
        }
    }
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.dylan.signaturetest"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            signingConfig signingConfigs.debug
            debuggable true
            applicationIdSuffix '.debug'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}
復制代碼

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/339191.html

標籤:其他

上一篇:八年 Android 開發要20k,大家覺得多還是少嗎?

下一篇:java版Spring Cloud+SpringBoot+mybatis+uniapp b2b2c 之分析商品管理強化商品互聯網特性及線上商品生命周期管理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more