Unity post build process 提供客製化且 Scriptable 後製流程. 開發初期也許還不能感受它的好處, 但當專案開始分之或是需要串接各式各樣 SDK 插件, 它能有效幫助建置自動化的流程, 省去手動調整的時間.
這次稍微談談 Android 建構 APK 可以做到的後製工作. 首先要了解 Unity 是以 Gradle 建構 Andriod APK. Gradle 是種自動化建構工具, 廣泛用於 Android 開發中, 包含設定套件, 相容性. 因此, 建置過程中專案會被轉換成 gradle build project, 再以 gradle 建置 APK.
串接 SDK 文件中提供的通常是以 Android 專案為範例, 要求添加文件, 套件或設定. 有了 Unity IPostGenerateGradleAndroidProject 我們可以在 gradle build project 階段添加或修改, 這樣也不需要特地匯出成 gradle project 再手動修改.
以下示範串接 Google Firebase 因要使用 androidx 庫而在 gradle.properties 添加設定:
1. UnityEditor.Android namespace 下生成一個類別 AndroidPostBuildProcessor 並實作 IPostGenerateGradleAndroidProject 介面.
將該檔案置於 Editor 資料夾下. (不一定要叫做 AndroidPostBuildProcessor, 但一定要實作 IPostGenerateGradleAndroidProject)

namespace UnityEditor.Android
{
public class AndroidPostBuildProcessor : IPostGenerateGradleAndroidProject
{
}
}
2. 實作 IPostGenerateGradleAndroidProject 介面要求的 callbackOrder, OnPostGenerateGradleAndroidProject.
callbackOrder 原於 IPostGenerateGradleAndroidProject 要實作的 IOrderedCallback 介面.
callbackOrder 定義我們實作的後製功能的優先級, 數值越低越先執行. (這裡先定為999, 優先度較低)
namespace UnityEditor.Android
{
public class AndroidPostBuildProcessor : IPostGenerateGradleAndroidProject
{
public int callbackOrder
{
get
{
return 999;
}
}
void IPostGenerateGradleAndroidProject.OnPostGenerateGradleAndroidProject(string path)
{
Debug.Log("Bulid path : " + path);
}
}
}
3. 實作修改 gradle.properties. 這邊要複寫文件 gradle.properties, 刪除後再創建.
gradle.properties 文件位於 gradle project 跟目錄下.
void IPostGenerateGradleAndroidProject.OnPostGenerateGradleAndroidProject(string path)
{
Debug.Log("Bulid path : " + path);
string gradlePropertiesFile = path + "/gradle.properties";
if (File.Exists(gradlePropertiesFile))
{
File.Delete(gradlePropertiesFile);
}
StreamWriter writer = File.CreateText(gradlePropertiesFile);
writer.WriteLine("org.gradle.jvmargs=-Xmx4096M");
writer.WriteLine("android.useAndroidX=true");
writer.WriteLine("android.enableJetifier=true");
writer.Flush();
writer.Close();
}
最後, 來驗證上述的改是否成功, 能用 unity build android 設定, 勾選 “Export Project" 將專案匯出成 gradle project. 記事本打開檢查一下內容是否複寫成功.


上述示範只是簡單修改文件, 然而串接 SDK 插件也可能需要複製特定的設定檔到 assets 下. 如果之後有分包(渠道商)的需求也可以自行撰寫建置流程.
參考文檔
1. https://docs.unity3d.com/ScriptReference/Android.IPostGenerateGradleAndroidProject.html
2. https://docs.unity3d.com/ScriptReference/Build.IOrderedCallback.html