diff --git a/.github/workflows/il2cpp.yml b/.github/workflows/il2cpp.yml index a64be00..0ecdc28 100644 --- a/.github/workflows/il2cpp.yml +++ b/.github/workflows/il2cpp.yml @@ -72,6 +72,7 @@ jobs: unityVersion: ${{ matrix.unity }} targetPlatform: ${{ matrix.target }} buildsPath: build + androidSymbolType: ${{ matrix.target == 'Android' && 'debugging' || 'none' }} gitPrivateToken: ${{ secrets.GITHUB_TOKEN }} env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} @@ -102,6 +103,10 @@ jobs: apk=$(find "build/${{ matrix.target }}" -maxdepth 1 -name '*.apk' | head -n1) unzip -p "$apk" lib/arm64-v8a/libunity.so > "build/${{ matrix.target }}/libunity-unpatched.so" + symbols_zip=$(find "build/${{ matrix.target }}" -name '*.symbols.zip' | head -n1) + symbol_entry=$(unzip -Z1 "$symbols_zip" | grep -E '(^|/)arm64-v8a/libunity(\.so|\.(sym|dbg)\.so|\.so\.(sym|dbg))$') + unzip -p "$symbols_zip" "$symbol_entry" > "build/${{ matrix.target }}/libunity.sym.so" + curl -L -o patcher.zip "https://security-patches.unity.com/bc0977e0-21a9-4f6e-9414-4f44b242110a/unity-patcher/UnityApplicationPatcher-1.3.3-Linux.zip" mkdir -p unity-application-patcher unzip -q patcher.zip -d unity-application-patcher diff --git a/Assets/Editor/BuildLibunity.cs b/Assets/Editor/BuildLibunity.cs index f7f1aa3..82bd438 100644 --- a/Assets/Editor/BuildLibunity.cs +++ b/Assets/Editor/BuildLibunity.cs @@ -148,6 +148,8 @@ static async Task Build(BuildTarget target) options = BuildOptions.None, }; // Build the player for the requested target + if(target == BuildTarget.Android) EditorUserBuildSettings.androidCreateSymbols = AndroidCreateSymbols.Debugging; + if(target == BuildTarget.Android) EditorUserBuildSettings.androidCreateSymbolsZip = true; var build = BuildPipeline.BuildPlayer(options); if(build.summary.result != UnityEditor.Build.Reporting.BuildResult.Succeeded) { @@ -156,6 +158,28 @@ static async Task Build(BuildTarget target) if(target == BuildTarget.Android) { + var buildDirectory = Path.GetDirectoryName(outputFile)!; + var symbolsZip = Directory.EnumerateFiles(buildDirectory, "*.symbols.zip", SearchOption.TopDirectoryOnly) + .Where(path => File.GetLastWriteTimeUtc(path) >= build.summary.buildStartedAt.ToUniversalTime()) + .OrderByDescending(File.GetLastWriteTimeUtc) + .FirstOrDefault(); + if(symbolsZip == null) + { + throw new FileNotFoundException($"Could not find the symbols package generated for '{outputFile}'"); + } + + using (ZipArchive symbolsArchive = ZipFile.OpenRead(symbolsZip)) + { + var symbolsEntry = symbolsArchive.Entries.FirstOrDefault(entry => + entry.Name == "libunity.so" || entry.Name == "libunity.sym.so" || entry.Name == "libunity.dbg.so" || + entry.Name == "libunity.so.sym" || entry.Name == "libunity.so.dbg"); + if(symbolsEntry == null) + { + throw new FileNotFoundException($"Could not find libunity symbols in '{symbolsZip}'"); + } + symbolsEntry.ExtractToFile(Path.Join(Application.dataPath, "..", "libunity.sym.so"), overwrite: true); + } + // Android needs the extra patch-and-extract pass await PatchAndroidLibunity(outputFile); }