十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
官方詳細:
成都創(chuàng)新互聯(lián)公司主營嫩江網站建設的網絡公司,主營網站建設方案,app開發(fā)定制,嫩江h(huán)5微信小程序開發(fā)搭建,嫩江網站營銷推廣歡迎嫩江等地區(qū)企業(yè)咨詢
ps:打包前做好config.xml配置如包名
一、添加android平臺
添加之后,在項目目錄的platforms下會生成一個android文件夾。
二、cordova編譯應用
使用build命令編譯應用的發(fā)布版本,這個過程需要你的android sdk和環(huán)境變量、java jdk和環(huán)境變量、android的gradle配置沒有錯誤。
編譯成功之后,在項目路徑platforms/android/build/outputs/apk/android-release-unsigned.apk未簽名文件,這個時候的apk還不能被安裝到手機上。
三、生成簽名文件
輸入的密碼要記住,其他姓名地區(qū)等信息隨便填吧,最好還是記住,成功之后在主目錄下就生成了 jhy-release-key.keystore 文件,命令中jhy-release-key.keystore是生成文件的名字, alias_jhy 是別名,隨便起但是要記住,一會簽名要用到,其他信息如加密、有效日期等就不說了,無需改動。
生成后會提示:
JKS 密鑰庫使用專用格式。建議使用 "keytool -importkeystore -srckeystore jhy-release-key.jks -destkeystore jhy-release-key.jks -deststoretype pkcs12" 遷移到行業(yè)標準格式 PKCS12。
執(zhí)行命令:
執(zhí)行結果: Warning: 已將 "jhy-release-key.jks" 遷移到 Non JKS/JCEKS。將 JKS 密鑰庫作為 "jhy-release-key.jks.old" 進行了備份。
四、簽名應用文件
把在第二步生成的android-release-unsigned.apk拷貝到與生成的jhy-release-key.jks同一目錄下,也就是項目的主目錄下,執(zhí)行命令:
輸入簽名文件的密碼,成功之后主目錄下的android-release-unsigned.apk就被簽名成功了,會比原來未被簽名的apk文件大一點,能夠安裝到手機或android虛擬機上了。
簽名完成后會提示沒有時間戳,忽略即可
檢測是否簽名成功:
也可用以下命令簽名并生成新apk文件
在android studio中的打包,通常使用以下兩個選項之一,兩個方式都可以構建出apk包
這兩個有什么區(qū)別?
概括一句話:根據(jù)gradle中現(xiàn)有的簽名配置進行自動簽名打包
通常debug和dev環(huán)境是系統(tǒng)自行配置的debug-sing簽名,不需要手動進行配置,但是release環(huán)境是對外發(fā)布的環(huán)境,必須要求手動在gradle中進行簽名配置才可以打包(后邊說)
所以在gradle配置好了簽名的情況下,直接點擊 Build APK(s) 就可以進行打包
一句話概括:通過手動選擇簽名文件進行簽名打包
這種方式則不需要在gradle中進行配置,直接選擇你已經創(chuàng)建好的簽名文件,輸入對應的密碼等信息,就可以進行打包
然后就可以進行打包了
debug 和 dev 等測試/開發(fā)環(huán)境 因為系統(tǒng)自動配置了debug-sing 可以直接使用 Build APK(s) 進行打包。
但是release環(huán)境需要對外發(fā)布,所以需要手動在gradle中進行簽名配置才可以使用 Build APK(s) ,或著自己選擇 Generate Signed Bundle or APK 通過簽名文件進行打包(效果和gradle中配置好了簽名文件完全相同)
那么就有以下兩個問題:
在 Generate Signed Bundle or APK 中選擇 Create new ...
在module的gradle.android中輸入:
然后在配置環(huán)境的buildTypes中,想使用 signingConfigs 簽名配置的環(huán)境加上一句話: signingConfig signingConfigs.release
這樣,就在gradle中配置好了簽名,可以直接使用 Build APK(s) 進行打包
注意這里的 minifyEnabled true 也就是要使用混淆文件(一般測試環(huán)境為false 編譯更快)。如果release環(huán)境打包,沒有配置好混淆文件的話,會導致apk安裝之后,秒退。(如果沒有簽名強行打包,則無法安裝)
打包后的apk是一個壓縮包,解壓之后,內容如下:
詳細可參考 apk簽名原理
無論我們怎么配置gradle文件去自定義打包,但是都是要走上圖所畫的七個流程。七個深綠色的橢圓代表了七個不可或缺的打包步驟,并且每一個步驟都一個打包工具
所用到的工具:
zipalign 字節(jié)對齊:
為什么要以4字節(jié)整數(shù)倍為起始偏移?
在文件對齊后, 就可以使用mmap來直接讀寫apk文件
mmap映射
上面涉及到的Android打包流程是以gradle task鏈的形式串聯(lián)起來的。
下面看一下常見的task
件
我可以想到的:
Transform API
App 打包
aapt是android中的資源打包工具,打包資源就用它。
打包大致流程:
aapt把resources目錄下的資源生成R.java文件,并為AndroidManifest.xml生成Manifest.java類。
aidl把項目中自定義的aidl文件生成對應的java類。
JavaCompiler把所有的Java源文件編譯成class文件,包括:aapt生成的、aidl生成的、項目中自有的java源文件
使用proguard混淆,并生成一個proguardMapping.xml文件(可選項:可以混淆也可以不混淆)
使用dex工具把所有的class文件生成.dex文件
使用aapt資源打包工具把resources、assets目錄下的資源打包成一個_ap文件
使用apkbuilder把所有的dex、_ap文件、AndroidManifest.xml文件打包成一個未簽名的apk
使用jarsinger生成一個簽名過的apk包
使用zipalign工具對要發(fā)布的apk文件進行對齊操作,以便在運行時節(jié)約內存。
下圖的是官網對于Android編譯打包流程的介紹。
官方的介紹非?;\統(tǒng),簡而言之,其大致流程就是:
編譯--DEX--打包--簽名和對齊
(好像什么都沒Get到,有一種意猶未盡的感覺……)
來一張外國大神的圖片(注:這張圖少了簽名的步驟)
用文字解釋一下上圖的流程:
首先,我們整理一下編譯的輸入部分是什么(圖中黃色部分):
接下來的步驟:
好了,編譯打包的詳細流程說完了,接下來我們看看是否能回答開篇的那些問題。
答:aapt工具對于每個資源文件生成了唯一的ID,這些ID保存在R.java文件中。如下是R.java文件的內容:
資源ID是一個4字節(jié)的無符號整數(shù),在R.java文件中用16進制表示。其中,最高的1字節(jié)表示Package ID,次高1個字節(jié)表示Type ID,最低2字節(jié)表示Entry ID。
只有一個ID如何能引用到實際資源呢?實際上aapt工具還生成了一個文件resources.arsc,相當于一個資源索引表,或者你理解成一個map也行,map的key是資源ID,value是資源在apk文件中的路徑。resources.arsc里面還有其他信息,這個就不多說了。
通過R.java文件和resources.arsc配合,就能引用到實際的資源文件。
答:第7步已經闡述了對齊所做的工作,為什么要進行對齊,這是為了加快資源的訪問速度。如果每個資源的開始位置都是上一個資源之后的 4*n字節(jié),那么訪問下一個資源就不用遍歷,直接跳到4*n字節(jié)處判斷是不是一個新的資源即可。
如果舉例子,那么對齊有點類似于資源數(shù)組化,數(shù)組的訪問速度當然比鏈表快。
答:xml里面都是各種字符,不利于快速遍歷。編譯成二進制文件,用數(shù)字替換各種符號,一方面能快速訪問,另一方面也能減少大小。