我們公司有個測試部門的同事, 希望在獲得了Android工程源碼的情況下, 打包出一個 Android apk .
很多在 github / gitee 上獲取到源碼的小伙伴可能也有此類需求.
我覺得可以從零開始介紹一下如何一步一步將一個 apk 打包出來, 那么就開始吧.
一、配置環(huán)境
如果你的電腦沒有一些必要的工具, 那么打包根本無從談起, 那么打包 apk 需要依賴于哪些工具呢?
- JDK
眾所周知, Android 可以用 Java / Kotlin 編寫代碼, 但是 Java / Kotlin 是一門高級語言, 編寫好的代碼需要進(jìn)一步轉(zhuǎn)化為一種二進(jìn)制格式的文件, 然后 Android 系統(tǒng)才能夠正確的執(zhí)行我們的邏輯.
這個轉(zhuǎn)化開始的過程依賴于 JDK , JDK 有很多不同的實(shí)現(xiàn), 對于打包者而言, 主要關(guān)注的是 JDK 的版本, 這個版本不是越高越好, 需要判斷項(xiàng)目依賴于那個版本.
Android 一般指定 JDK 1.8 , 如果你不確定, 可以查看源碼中的 build.gradle(build.gradle.kts) 文件, 里面會有一個配置項(xiàng): compileOptions
, 跟著這個配置來選擇 JDK 就行了.
至于發(fā)行 JDK 的有很多, 可以選擇 Oracle / Azul , 我一般選擇 Azul , 因?yàn)?Oracle 老是要注冊登錄.
下載安裝后, 需要配置一下環(huán)境變量, 需要配置兩個:
- 添加一項(xiàng)名為
JAVA_HOME
的環(huán)境變量, 值配置為 JDK 的安裝路徑 - 為
path
添加一個值%JAVA_HOME%\bin
配置完成后, 嘗試在終端中調(diào)用 java -- version
, 可以的話這一步就完成了.
- Android SDK
JDK 只能處理 Java / Kotlin 代碼的第一階段, 要運(yùn)行在 Android 系統(tǒng)中, 還需要用到 Android SDK 進(jìn)一步處理代碼.
下載之前, 先在自己電腦磁盤中找到一塊比較充裕的分區(qū), 然后創(chuàng)建一個文件夾(無空格純英文路徑!!)用來存放 Android SDK 數(shù)據(jù), 例如: D:\tools\Android\sdk
.
然后這個文件夾中再創(chuàng)建一個文件夾, 命名為 cmdline-tools , 完整路徑示例: D:\tools\Android\sdk\cmdline-tools
.
接下來開始下載 SdkManager 工具, 這個工具可以非常方便的管理 Android SDK , 請?jiān)谶@個 頁面 中獲取, 向下滾動頁面找到 僅限命令行工具(Command line tools only) 標(biāo)題, 下載自己操作系統(tǒng)的版本.
下載完成后, 將其解壓, 解壓后是一個名為 cmdline-tools 的目錄, 請將它改為 latest , 請注意, 必須為該名字!
然后將 latest 目錄整個剪切到之前創(chuàng)建的目錄中, 剪切完后路徑示例: D:\tools\Android\sdk\cmdline-tools\latest
.
完成后需要配置環(huán)境變量:
- 添加一項(xiàng)名為
ANDROID_HOME
的環(huán)境變量, 值配置為第一個目錄的完整路徑:D:\tools\Android\sdk
(請根據(jù)你實(shí)際情況配置) - 添加一項(xiàng)名為
ANDROID_CMDLINE_TOOLS
的環(huán)境變量, 值配置為:%ANDROID_HOME%\cmdline-tools\latest
- 為
path
列表添加一個值%ANDROID_CMDLINE_TOOLS%\bin
完成后, 可以嘗試在終端中調(diào)用 sdkmanager.bat
, 如果遇到一些許可請求, 輸入 Y
+ Enter(回車鍵) 同意即可.
下載完成后, 即可通過 SdkManager 加載需要用到的 Android SDK , 此頁面 是 SdkManager 的使用說明, 可以參考.
要完成打包, 我們依賴于以下工具:
- platforms
- build-tools
- platform-tools
- ndk(可選)
具體要下載哪些版本則一樣要參考你的項(xiàng)目源碼配置, 同樣查看源碼中的 build.gradle(build.gradle.kts) 文件, 里面會有一個配置項(xiàng): compileSdk
.
如果該配置為 34, 那么 platforms 即: platforms;android-34
, 而 build-tools 需要參考這個 頁面 , 找到 34 打頭的最新版本, 例如我現(xiàn)在看到的是 34.0.0 , 即: build-tools;34.0.0
, platform-tools 是固定的: platform-tools
.
我們在終端中執(zhí)行以下命令來加載需要的 Android SDK : sdkmanager.bat platform-tools platforms;android-34 build-tools;34.0.0
等待他加載完畢即可.
至此, 環(huán)境配置已經(jīng)完成.
二缎除、打包
現(xiàn)在主流的 Android 項(xiàng)目都是使用 Gradle 作為打包工具, 較老的版本會用到 Maven , 我們這里只介紹 Gradle .
一個項(xiàng)目中, 并不是所有的代碼都是內(nèi)部開發(fā)者自己寫的, 還依賴于很多第三方提供的 SDK , 例如: 網(wǎng)絡(luò), 圖片, 視頻...
Gradle 可以幫助開發(fā)者管理這些依賴, 總而言之, 就是一個工具搞定.
較大的開源軟件如果文檔寫得好, 則會提供一些命令說明, 只要上一步中的環(huán)境配置好了, 那么按照說明一步一步走即可打包出來, 如果沒有說明, 則需要查看源碼了.
我們的目的就是: 找到一個項(xiàng)目中我們需要的 應(yīng)用 module , 然后將這個 module 打包出來.
module 是 Gradle 的一個概念, 說白了就是一個文件夾, 包含了一些代碼, 配置文件之類的. 里面有個關(guān)鍵的配置文件是: build.gradle(build.gradle.kts) .
注意: 項(xiàng)目根目錄中也包含了一個 build.gradle(build.gradle.kts) 文件, 這個我們可以忽略它.
module 分類兩類, 應(yīng)用(application) 和 庫(library) .
應(yīng)用 module 的特點(diǎn)是在他的 build.gradle(build.gradle.kts) 中, 導(dǎo)入了一個名為 com.android.application 的插件(plugin) , 你只要找到 plugins 配置, 確認(rèn)是導(dǎo)入了 有名字包含 application 字樣的插件, 那么它就是 應(yīng)用 module . 與之相反的是 庫 module 一般是導(dǎo)入了 com.android.library 插件.
如果我們確定了 應(yīng)用 module 的名字, 就可以打包了, 假設(shè)這個 module 的名字為 app , 我們在終端中定位到項(xiàng)目目錄, 然后執(zhí)行 gradlew.bat clean app:assembleDebug
命令, Gradle 就會開始自動下載依賴, 并且開始執(zhí)行打包.
如果一切順利, 打包后的 apk 文件會存放在 ..\app\build\outputs\apk\debug
中.
總結(jié)
以上是一個常規(guī)的打包流程, 希望可以幫助到各位.