Skip to content

Instantly share code, notes, and snippets.

@joonjoonjoon
Last active May 10, 2022 13:58
Show Gist options
  • Save joonjoonjoon/93f4a1c90267545e6258b8d7e2ce57bd to your computer and use it in GitHub Desktop.
Save joonjoonjoon/93f4a1c90267545e6258b8d7e2ce57bd to your computer and use it in GitHub Desktop.
Some scirpts that were helpful in building for Android
#!/bin/bash
PROJPATH=~/git/inua/_Mirror/inua_android
#PROJPATH=~/git/inua/
ANDROIDFILESPATH=~/git/inua/Automation/android
UNITYVERSION=$(grep "m_EditorVersion: " "$PROJPATH/ProjectSettings/ProjectVersion.txt" | cut -d " " -f2)
UNITYPATH="/Applications/Unity/Hub/Editor/$UNITYVERSION/Unity.app/Contents/MacOS/Unity"
BUILDPATH=$PROJPATH/Build/inua_android
ASSETBUNDLEPATH=$PROJPATH/AssetBundles
INUA_KEYSTORE_PATH=$ANDROIDFILESPATH/inua_arte_keystore.keystore
INUA_KEYALIAS_NAME="keyalias"
SECONDS=0
prep() {
echo -e "😌 \033[1;38;5;214m PREP \033[0m"
# just to keep track of the version :)
echo "Unity version: $UNITYVERSION"
# exit when any command fails
set -e
# load passwords
source $ANDROIDFILESPATH/credentials.pass
# This is a good place to force-exclude files from compilation by adding ~ at the end.
# You just need to make sure to undo it, or to not commit it to GIT :)
# make sure steam files are excluded
# mv "$PROJPATH/Assets/Plugins/SteamWorks.NET" "$PROJPATH/Assets/Plugins/SteamWorks.NET~"
# mv "$PROJPATH/Assets/Plugins/SteamWorks.NET.meta" "$PROJPATH/Assets/Plugins/SteamWorks.NET.meta~"
# mv "$PROJPATH/Assets/Plugins/x86" "$PROJPATH/Assets/Plugins/x86~"
# mv "$PROJPATH/Assets/Plugins/x86.meta" "$PROJPATH/Assets/Plugins/x86.meta~"
# mv "$PROJPATH/Assets/Plugins/x86_64" "$PROJPATH/Assets/Plugins/x86_64~"
# mv "$PROJPATH/Assets/Plugins/x86_64.meta" "$PROJPATH/Assets/Plugins/x86_64.meta~"
}
clear_folder() {
echo -e "😧 \033[1;38;5;214m CLEAR BUILD FOLDER \033[0m"
rm -rf $BUILDPATH/*
}
build_unity_assetbundles() {
echo -e "😨 \033[1;38;5;214m BUILD UNITY ASSET BUNDLES \033[0m"
# clear out the AssetBundles folder
rm -rf $PROJPATH/AssetBundles/*
# If we use sym links, this file could get lost...
rm -rf $PROJPATH/Library/PlayAssetPackConfig.json
touch $PROJPATH/Library/PlayAssetPackConfig.json
cat $ANDROIDFILESPATH/PlayAssetPackConfig.json | sed -r 's|ASSETBUNDLEPATH|'$ASSETBUNDLEPATH'|g' >> $PROJPATH/Library/PlayAssetPackConfig.json
cat $PROJPATH/Library/PlayAssetPackConfig.json
mkdir -p $ASSETBUNDLEPATH
$UNITYPATH \
-quit \
-batchmode \
-projectPath $PROJPATH \
-executeMethod BuildScripts.BuildAndroidAssetBundle \
-logfile "output/build_assetbundles_android.log" \
-buildTarget Android \
-assetbundlePath=$ASSETBUNDLEPATH
echo "(done)"
}
build_unity() {
echo -e "😰 \033[1;38;5;214m BUILD UNITY ANDROID \033[0m"
#empty cache
rm -rf $PROJPATH/Library/il2cpp_android_armeabi-v7a/*
rm -rf $PROJPATH/Library/il2cpp_android_arm64-v8a/*
rm -rf $PROJPATH/Library/Il2cppBuildCache/*
#rm -rf $PROJPATH/Library/il2cpp_android_armeabi-v7a/il2cpp_cache/libil2cpp/*
#empty build folder
rm -rf $BUILDPATH/*
mkdir -p $BUILDPATH
$UNITYPATH \
-quit \
-batchmode \
-projectPath $PROJPATH \
-executeMethod BuildScripts.BuildAndroid \
-logfile "output/build_android.log" \
-buildTarget Android \
-outputPath=$BUILDPATH \
-assetbundlePath=$ASSETBUNDLEPATH \
-keystorePath=$INUA_KEYSTORE_PATH \
-keystoreAliasPass=$INUA_KEYALIAS_PASS \
-keystoreAliasName=$INUA_KEYALIAS_NAME \
-keystorePass=$INUA_KEYSTORE_PASS
grep -i "buildscript" "output/build_android.log" || true
grep -i "Complete build size" "output/build_android.log" || true
grep -i "unable" "output/build_android.log" || true
grep -i "failed" "output/build_android.log" || true
grep -i "error" "output/build_android.log" || true
grep -i "Exception" "output/build_android.log" || true
grep -i "Build Succeeded" "output/build_android.log" || true
}
extract_apks() {
echo -e "😳 \033[1;38;5;214m EXTRACT APK \033[0m"
# this will generate an .apks file, for local installs
rm -f "output/inua.apks"
java -jar "$PROJPATH/Assets/GooglePlayPlugins/com.google.android.appbundle/Editor/Tools/bundletool-all.jar" build-apks --bundle="$PROJPATH/Build/inua_android/inua.aab" --output="output/inua.apks" --local-testing
}
install_apks_locally() {
echo -e "😵‍💫 \033[1;38;5;214m INSTALL APK ON DEVICE \033[0m"
# this will actually install it on device
java -jar "$PROJPATH/Assets/GooglePlayPlugins/com.google.android.appbundle/Editor/Tools/bundletool-all.jar" install-apks --apks="output/inua.apks"
}
open_manual_upload_windows() {
# you need to drag this file ...
open $BUILDPATH
# into this window...
open "https://play.google.com/console/u/0/developers/[URL]/tracks/internal-testing"
}
beep() {
duration=$SECONDS
echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."
osascript -e "beep beep beep"
osascript -e 'display notification "Finished completely" with title "Building android"'
echo -e "✅ \033[1;38;5;76m DONE \033[0m"
}
prep
clear_folder
# build_unity_assetbundles
build_unity
# extract_apks
# install_apks_locally
open_manual_upload_windows
beep
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Google.Android.AppBundle.Editor;
using UnityEditor;
using UnityEngine;
public class BuildScripts
{
public const string APPID = "appid";
static void BuildAndroid()
{
Debug.Log("[buildscripts] Started Building Android");
PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, APPID);
PlayerSettings.stripEngineCode = false; // might be necessary?
PlayerSettings.Android.keystoreName = GetArgumentValue("keystorePath");
// Get Keystore credentials from file...
var keystorePass = GetArgumentValue("keystorePass");
var keyaliasPass = GetArgumentValue("keystoreAliasPass");
var keyaliasName = GetArgumentValue("keystoreAliasName");
var assetBundlePath = GetArgumentValue("assetbundlePath");
var outputPath = GetArgumentValue("outputPath");
Debug.Log("[BuildScripts] Found keys! KSP:" + keystorePass + " KAP:" + keyaliasPass);
Debug.Log("[BuildScripts] Paths! " + assetBundlePath + " --- " + outputPath);
PlayerSettings.Android.useCustomKeystore = true;
PlayerSettings.Android.keystorePass = keystorePass;
PlayerSettings.Android.keyaliasName = keyaliasName;
PlayerSettings.Android.keyaliasPass = keyaliasPass;
// Build Android App Bundle!
var assetPackConfig = new AssetPackConfig();
foreach(var bundleName in AssetDatabase.GetAllAssetBundleNames())
{
Debug.Log("[BuildAndroid] Adding Asset Bundle to Config: " + bundleName);
assetPackConfig.AddAssetBundle(assetBundlePath + "/" + bundleName, AssetPackDeliveryMode.InstallTime);
}
var buildPlayerOptions = AndroidBuildHelper.CreateBuildPlayerOptions(outputPath + "/inua.aab");
buildPlayerOptions.scenes = new string[]{
"Assets/_Scenes/Android_preload.unity",
"Assets/_Scenes/Android_loading.unity",
"Assets/_Scenes/MainMenu.unity"
};
if (!Bundletool.BuildBundle(buildPlayerOptions, assetPackConfig))
{
Debug.LogError("[BuildScript] Asset Delivery build failed");
return;
}
Debug.Log("[buildscripts] Finished Building Android");
PlayerSettings.stripEngineCode = true; // might be necessary?
}
static string[] GetScenes()
{
return EditorBuildSettings.scenes.Where(s=>s.enabled).Select(s=> s.path).ToArray();
}
static void Build(BuildPlayerOptions options)
{
var report = BuildPipeline.BuildPlayer(options);
if(report.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded)
{
Debug.Log("[buildscripts] Build succeeded");
EditorApplication.Exit( 0 );
}
else
{
Debug.Log("[buildscripts] Build failed");
EditorApplication.Exit( 1 );
}
}
static string GetArgumentValue(string argument)
{
// gets values from the command line unity call
// inside build_ios.sh for example
var result = "[ARGUMENT NOT SET]";
var args = Environment.GetCommandLineArgs().ToList();
foreach(var arg in args)
{
if(arg.Contains(argument))
{
result = arg.Split('=')[1];
}
}
return result;
}
}
#!/bin/bash
export INUA_KEYSTORE_PASS='password'
export INUA_KEYALIAS_PASS='password'
{"assetPacks":[],"targetedAssetPacks":[],"assetBundles":[{"name":"scene1","assetBundles":[{"path":"/Users/gib/git/inua/_Mirror/inua_android/AssetBundles/scene1","textureCompressionFormat":"Default"}],"deliveryMode":"InstallTime"},{"name":"scene2","assetBundles":[{"path":"/Users/gib/git/inua/_Mirror/inua_android/AssetBundles/scene2","textureCompressionFormat":"Default"}],"deliveryMode":"InstallTime"},{"name":"scene3","assetBundles":[{"path":"/Users/gib/git/inua/_Mirror/inua_android/AssetBundles/scene3","textureCompressionFormat":"Default"}],"deliveryMode":"InstallTime"},{"name":"scene4","assetBundles":[{"path":"/Users/gib/git/inua/_Mirror/inua_android/AssetBundles/scene4","textureCompressionFormat":"Default"}],"deliveryMode":"InstallTime"},{"name":"scene5","assetBundles":[{"path":"/Users/gib/git/inua/_Mirror/inua_android/AssetBundles/scene5","textureCompressionFormat":"Default"}],"deliveryMode":"InstallTime"},{"name":"scene6","assetBundles":[{"path":"/Users/gib/git/inua/_Mirror/inua_android/AssetBundles/scene6","textureCompressionFormat":"Default"}],"deliveryMode":"InstallTime"},{"name":"shared","assetBundles":[{"path":"/Users/gib/git/inua/_Mirror/inua_android/AssetBundles/shared","textureCompressionFormat":"Default"}],"deliveryMode":"InstallTime"}],"defaultTextureCompressionFormat":"Default"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment