Skip to content

Commit bb1168f

Browse files
committed
added addressables build reports
1 parent 8d345e2 commit bb1168f

7 files changed

Lines changed: 175 additions & 74 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@ UnityFileSystemTestData/**/*.sln
3434
UnityFileSystemTestData/ProjectSettings/
3535
UnityFileSystemTestData/UserSettings/
3636
UnityFileSystemTestData/Packages/
37+
*.db
38+
*.txt
39+
*.csv

Analyzer/AnalyzerTool.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public int Analyze(
4848
{
4949
if (Path.GetExtension(file) == ".json")
5050
{
51-
ProcessBuildLayout(file, writer, i, files.Length);
51+
ProcessAddressablesBuild(file, writer, i, files.Length);
5252
++i;
5353
continue;
5454
}
@@ -183,7 +183,7 @@ void ProcessFile(string file, string rootDirectory, SQLiteWriter writer, int fil
183183

184184

185185

186-
void ProcessBuildLayout(string file, SQLiteWriter writer, int fileIndex, int cntFiles)
186+
void ProcessAddressablesBuild(string file, SQLiteWriter writer, int fileIndex, int cntFiles)
187187
{
188188
try
189189
{
@@ -192,7 +192,7 @@ void ProcessBuildLayout(string file, SQLiteWriter writer, int fileIndex, int cnt
192192
{
193193
JsonSerializer serializer = new JsonSerializer();
194194
BuildLayout buildLayout = (BuildLayout)serializer.Deserialize(reader, typeof(BuildLayout));
195-
writer.WriteBuildLayout(file, buildLayout);
195+
writer.WriteAddressablesBuild(file, buildLayout);
196196
ReportProgress(file, fileIndex, cntFiles);
197197
}
198198
}

Analyzer/Resources/Init.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ WHERE m.type = "Material";
103103

104104
INSERT INTO types (id, name) VALUES (-1, 'Scene');
105105

106-
CREATE TABLE build_layouts
106+
CREATE TABLE addr_builds
107107
(
108108
id INTEGER,
109109
name TEXT,
@@ -120,7 +120,7 @@ CREATE TABLE build_layouts
120120
PRIMARY KEY (id)
121121
);
122122

123-
create table build_layout_explicit_assets
123+
create table addr_build_explicit_assets
124124
(
125125
id INTEGER,
126126
build_id INTEGER,
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using Microsoft.Data.Sqlite;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
8+
namespace Analyzer.SQLite.Commands
9+
{
10+
internal abstract class AbstractCommand
11+
{
12+
protected abstract string TableName { get; }
13+
protected abstract Dictionary<string, SqliteType> Fields { get; }
14+
15+
private SqliteCommand m_Command = new SqliteCommand();
16+
17+
public void CreateCommand(SqliteConnection database)
18+
{
19+
m_Command = database.CreateCommand();
20+
var commandText = new StringBuilder($"INSERT INTO {TableName} (");
21+
commandText.Append(string.Join(", ", Fields.Keys));
22+
commandText.Append(") VALUES (@");
23+
commandText.Append(string.Join(", @", Fields.Keys));
24+
commandText.Append(")");
25+
m_Command.CommandText = commandText.ToString();
26+
27+
foreach (var entry in Fields)
28+
{
29+
m_Command.Parameters.Add("@" + entry.Key, entry.Value);
30+
}
31+
}
32+
public void SetValue(string key, object value)
33+
{
34+
if (m_Command.Parameters.Contains(key))
35+
{
36+
m_Command.Parameters[key].Value = value ?? DBNull.Value;
37+
}
38+
else
39+
{
40+
throw new ArgumentException($"Parameter '{key}' does not exist in the command.");
41+
}
42+
}
43+
44+
public void SetTransaction(SqliteTransaction transaction)
45+
{
46+
m_Command.Transaction = transaction;
47+
}
48+
49+
public int ExecuteNonQuery()
50+
{
51+
return m_Command.ExecuteNonQuery();
52+
}
53+
}
54+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Microsoft.Data.Sqlite;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Runtime.InteropServices;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
9+
namespace Analyzer.SQLite.Commands
10+
{
11+
internal class AddressablesBuild : AbstractCommand
12+
{
13+
protected override string TableName { get => "addr_builds"; }
14+
protected override Dictionary<string, SqliteType> Fields { get => new Dictionary<string, SqliteType>
15+
{
16+
{ "name", SqliteType.Text },
17+
{ "build_target", SqliteType.Integer },
18+
{ "start_time", SqliteType.Integer },
19+
{ "duration", SqliteType.Real },
20+
{ "error", SqliteType.Text },
21+
{ "package_version", SqliteType.Text },
22+
{ "player_version", SqliteType.Text },
23+
{ "build_script", SqliteType.Text },
24+
{ "result_hash", SqliteType.Text },
25+
{ "type", SqliteType.Integer },
26+
{ "unity_version", SqliteType.Text }
27+
}; }
28+
public AddressablesBuild()
29+
{
30+
31+
}
32+
33+
34+
}
35+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using Microsoft.Data.Sqlite;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
8+
namespace Analyzer.SQLite.Commands
9+
{
10+
internal class AddressablesBuildExplicitAsset : AbstractCommand
11+
{
12+
protected override string TableName => "addr_build_explicit_assets";
13+
14+
protected override Dictionary<string, SqliteType> Fields => new Dictionary<string, SqliteType>
15+
{
16+
{ "id", SqliteType.Integer },
17+
{ "build_id", SqliteType.Integer},
18+
{ "bundle", SqliteType.Integer},
19+
{ "file", SqliteType.Integer },
20+
{ "asset_hash", SqliteType.Text },
21+
{ "asset_path", SqliteType.Text },
22+
{ "addressable_name", SqliteType.Text },
23+
{ "externally_referenced_assets", SqliteType.Text }, // JSONB type in SQLite uses TEXT
24+
{ "group_guid", SqliteType.Text },
25+
{ "guid", SqliteType.Text },
26+
{ "internal_id", SqliteType.Text },
27+
{ "internal_referenced_explicit_assets", SqliteType.Text }, // JSONB type in SQLite uses TEXT
28+
{ "internal_referenced_other_assets", SqliteType.Text }, // JSONB type in SQLite uses TEXT
29+
{ "labels", SqliteType.Text }, // JSONB type in SQLite uses TEXT
30+
{ "streamed_size", SqliteType.Integer },
31+
{ "serialized_size", SqliteType.Integer },
32+
{ "main_asset_type", SqliteType.Integer }
33+
};
34+
public AddressablesBuildExplicitAsset()
35+
{
36+
}
37+
}
38+
}

Analyzer/SQLite/SQLiteWriter.cs

Lines changed: 40 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using static System.Runtime.InteropServices.JavaScript.JSType;
1111
using System.Xml.Linq;
1212
using Newtonsoft.Json;
13+
using Analyzer.SQLite.Commands;
1314

1415
namespace UnityDataTools.Analyzer.SQLite;
1516

@@ -49,8 +50,8 @@ public class SQLiteWriter : IWriter
4950
private SqliteCommand m_AddObjectCommand = new SqliteCommand();
5051
private SqliteCommand m_AddTypeCommand = new SqliteCommand();
5152
private SqliteCommand m_InsertDepCommand = new SqliteCommand();
52-
private SqliteCommand m_InsertBuild = new SqliteCommand();
53-
private SqliteCommand m_ExplicitAsset = new SqliteCommand();
53+
private AddressablesBuild m_AddressablesBuild = new AddressablesBuild();
54+
private AddressablesBuildExplicitAsset m_AddressablesExplicitAsset = new AddressablesBuildExplicitAsset();
5455
private SqliteCommand m_LastId = new SqliteCommand();
5556
private SqliteTransaction m_CurrentTransaction = null;
5657
public SQLiteWriter(string databaseName, bool skipReferences)
@@ -154,40 +155,8 @@ private void CreateSQLiteCommands()
154155
m_InsertDepCommand.Parameters.Add("@object", SqliteType.Integer);
155156
m_InsertDepCommand.Parameters.Add("@dependency", SqliteType.Integer);
156157

157-
m_InsertBuild = m_Database.CreateCommand();
158-
m_InsertBuild.CommandText = "INSERT INTO build_layouts (name, build_target, start_time, duration, error, package_version, player_version, build_script, result_hash, type, unity_version) VALUES (@name, @build_target, @start_time, @duration, @error, @package_version, @player_version, @build_script, @result_hash, @type, @unity_version)";
159-
m_InsertBuild.Parameters.Add("@name", SqliteType.Text);
160-
m_InsertBuild.Parameters.Add("@build_target", SqliteType.Integer);
161-
m_InsertBuild.Parameters.Add("@start_time", SqliteType.Integer);
162-
m_InsertBuild.Parameters.Add("@duration", SqliteType.Real);
163-
m_InsertBuild.Parameters.Add("@error", SqliteType.Text);
164-
m_InsertBuild.Parameters.Add("@package_version", SqliteType.Text);
165-
m_InsertBuild.Parameters.Add("@player_version", SqliteType.Text);
166-
m_InsertBuild.Parameters.Add("@build_script", SqliteType.Text);
167-
m_InsertBuild.Parameters.Add("@result_hash", SqliteType.Text);
168-
m_InsertBuild.Parameters.Add("@type", SqliteType.Integer);
169-
m_InsertBuild.Parameters.Add("@unity_version", SqliteType.Text);
170-
171-
m_ExplicitAsset = m_Database.CreateCommand();
172-
m_ExplicitAsset.CommandText =
173-
"INSERT INTO build_layout_explicit_assets (id, build_id, bundle, file, asset_hash, asset_path, addressable_name, externally_referenced_assets, group_guid, guid, internal_id, internal_referenced_explicit_assets, internal_referenced_other_assets, labels, streamed_size, serialized_size, main_asset_type) VALUES (@id, @build_id, @bundle, @file, @asset_hash, @asset_path, @addressable_name, @externally_referenced_assets, @group_guid, @guid, @internal_id, @internal_referenced_explicit_assets, @internal_referenced_other_assets, @labels, @streamed_size, @serialized_size, @main_asset_type)";
174-
m_ExplicitAsset.Parameters.Add("@id", SqliteType.Integer);
175-
m_ExplicitAsset.Parameters.Add("@build_id", SqliteType.Integer);
176-
m_ExplicitAsset.Parameters.Add("@bundle", SqliteType.Integer);
177-
m_ExplicitAsset.Parameters.Add("@file", SqliteType.Integer);
178-
m_ExplicitAsset.Parameters.Add("@asset_hash", SqliteType.Text);
179-
m_ExplicitAsset.Parameters.Add("@asset_path", SqliteType.Text);
180-
m_ExplicitAsset.Parameters.Add("@addressable_name", SqliteType.Text);
181-
m_ExplicitAsset.Parameters.Add("@externally_referenced_assets", SqliteType.Text); // JSONB type in SQLite uses TEXT
182-
m_ExplicitAsset.Parameters.Add("@group_guid", SqliteType.Text);
183-
m_ExplicitAsset.Parameters.Add("@guid", SqliteType.Text);
184-
m_ExplicitAsset.Parameters.Add("@internal_id", SqliteType.Text);
185-
m_ExplicitAsset.Parameters.Add("@internal_referenced_explicit_assets", SqliteType.Text); // JSONB type in SQLite uses TEXT
186-
m_ExplicitAsset.Parameters.Add("@internal_referenced_other_assets", SqliteType.Text); // JSONB type in SQLite uses TEXT
187-
m_ExplicitAsset.Parameters.Add("@labels", SqliteType.Text); // JSONB type in SQLite uses TEXT
188-
m_ExplicitAsset.Parameters.Add("@streamed_size", SqliteType.Integer);
189-
m_ExplicitAsset.Parameters.Add("@serialized_size", SqliteType.Integer);
190-
m_ExplicitAsset.Parameters.Add("@main_asset_type", SqliteType.Integer);
158+
m_AddressablesBuild.CreateCommand(m_Database);
159+
m_AddressablesExplicitAsset.CreateCommand(m_Database);
191160

192161
m_LastId = m_Database.CreateCommand();
193162
m_LastId.CommandText = "SELECT last_insert_rowid()";
@@ -216,26 +185,26 @@ public void EndAssetBundle()
216185
m_CurrentAssetBundleId = -1;
217186
}
218187

219-
public void WriteBuildLayout(string filename, BuildLayout buildLayout)
188+
public void WriteAddressablesBuild(string filename, BuildLayout buildLayout)
220189
{
221190
using var transaction = m_Database.BeginTransaction();
222191
m_CurrentTransaction = transaction;
223192

224193
try
225194
{
226-
m_InsertBuild.Transaction = transaction;
227-
m_InsertBuild.Parameters["@name"].Value = Path.GetFileName(filename);
228-
m_InsertBuild.Parameters["@build_target"].Value = buildLayout.BuildTarget;
229-
m_InsertBuild.Parameters["@start_time"].Value = buildLayout.BuildStartTime;
230-
m_InsertBuild.Parameters["@duration"].Value = buildLayout.Duration;
231-
m_InsertBuild.Parameters["@error"].Value = buildLayout.BuildError;
232-
m_InsertBuild.Parameters["@package_version"].Value = buildLayout.PackageVersion;
233-
m_InsertBuild.Parameters["@player_version"].Value = buildLayout.PlayerBuildVersion;
234-
m_InsertBuild.Parameters["@build_script"].Value = buildLayout.BuildScript;
235-
m_InsertBuild.Parameters["@result_hash"].Value = buildLayout.BuildResultHash;
236-
m_InsertBuild.Parameters["@type"].Value = buildLayout.BuildType;
237-
m_InsertBuild.Parameters["@unity_version"].Value = buildLayout.UnityVersion;
238-
m_InsertBuild.ExecuteNonQuery();
195+
m_AddressablesBuild.SetTransaction(transaction);
196+
m_AddressablesBuild.SetValue("name", Path.GetFileName(filename));
197+
m_AddressablesBuild.SetValue("build_target", buildLayout.BuildTarget);
198+
m_AddressablesBuild.SetValue("start_time", buildLayout.BuildStartTime);
199+
m_AddressablesBuild.SetValue("duration", buildLayout.Duration);
200+
m_AddressablesBuild.SetValue("error", buildLayout.BuildError);
201+
m_AddressablesBuild.SetValue("package_version", buildLayout.PackageVersion);
202+
m_AddressablesBuild.SetValue("player_version", buildLayout.PlayerBuildVersion);
203+
m_AddressablesBuild.SetValue("build_script", buildLayout.BuildScript);
204+
m_AddressablesBuild.SetValue("result_hash", buildLayout.BuildResultHash);
205+
m_AddressablesBuild.SetValue("type", buildLayout.BuildType);
206+
m_AddressablesBuild.SetValue("unity_version", buildLayout.UnityVersion);
207+
m_AddressablesBuild.ExecuteNonQuery();
239208

240209
m_LastId.Transaction = transaction;
241210
long buildId = (long) m_LastId.ExecuteScalar();
@@ -246,25 +215,27 @@ public void WriteBuildLayout(string filename, BuildLayout buildLayout)
246215
switch(reference.type.Class)
247216
{
248217
case "BuildLayout/ExplicitAsset":
249-
m_ExplicitAsset.Transaction = transaction;
250-
m_ExplicitAsset.Parameters["@id"].Value = reference.rid;
251-
m_ExplicitAsset.Parameters["@build_id"].Value = buildId;
252-
m_ExplicitAsset.Parameters["@bundle"].Value = reference.data.Bundle.rid;
253-
m_ExplicitAsset.Parameters["@file"].Value = reference.data.File.rid;
254-
m_ExplicitAsset.Parameters["@asset_hash"].Value = reference.data.AssetHash.Hash;
255-
m_ExplicitAsset.Parameters["@asset_path"].Value = reference.data.AssetPath;
256-
m_ExplicitAsset.Parameters["@addressable_name"].Value = reference.data.AddressableName;
257-
m_ExplicitAsset.Parameters["@externally_referenced_assets"].Value = JsonConvert.SerializeObject(reference.data.ExternallyReferencedAssets) ?? "[]";
258-
m_ExplicitAsset.Parameters["@group_guid"].Value = reference.data.GroupGuid;
259-
m_ExplicitAsset.Parameters["@guid"].Value = reference.data.Guid;
260-
m_ExplicitAsset.Parameters["@internal_id"].Value = reference.data.InternalId;
261-
m_ExplicitAsset.Parameters["@internal_referenced_explicit_assets"].Value = JsonConvert.SerializeObject(reference.data.InternalReferencedExplicitAssets) ?? "[]";
262-
m_ExplicitAsset.Parameters["@internal_referenced_other_assets"].Value = JsonConvert.SerializeObject(reference.data.InternalReferencedOtherAssets) ?? "[]";
263-
m_ExplicitAsset.Parameters["@labels"].Value = JsonConvert.SerializeObject(reference.data.Labels) ?? "[]";
264-
m_ExplicitAsset.Parameters["@main_asset_type"].Value = reference.data.MainAssetType;
265-
m_ExplicitAsset.Parameters["@serialized_size"].Value = reference.data.SerializedSize;
266-
m_ExplicitAsset.Parameters["@streamed_size"].Value = reference.data.StreamedSize;
267-
m_ExplicitAsset.ExecuteNonQuery();
218+
m_AddressablesExplicitAsset.SetTransaction(transaction);
219+
m_AddressablesExplicitAsset.SetValue("id", reference.rid);
220+
m_AddressablesExplicitAsset.SetValue("build_id", buildId);
221+
m_AddressablesExplicitAsset.SetValue("bundle", reference.data.Bundle.rid);
222+
m_AddressablesExplicitAsset.SetValue("file", reference.data.File.rid);
223+
m_AddressablesExplicitAsset.SetValue("asset_hash", reference.data.AssetHash.Hash);
224+
m_AddressablesExplicitAsset.SetValue("asset_path", reference.data.AssetPath);
225+
m_AddressablesExplicitAsset.SetValue("addressable_name", reference.data.AddressableName);
226+
m_AddressablesExplicitAsset.SetValue("externally_referenced_assets",
227+
JsonConvert.SerializeObject(reference.data.ExternallyReferencedAssets) ?? "[]");
228+
m_AddressablesExplicitAsset.SetValue("group_guid", reference.data.GroupGuid);
229+
m_AddressablesExplicitAsset.SetValue("guid", reference.data.Guid);
230+
m_AddressablesExplicitAsset.SetValue("internal_id", reference.data.InternalId);
231+
m_AddressablesExplicitAsset.SetValue("internal_referenced_explicit_assets",
232+
JsonConvert.SerializeObject(reference.data.InternalReferencedExplicitAssets) ?? "[]");
233+
m_AddressablesExplicitAsset.SetValue("internal_referenced_other_assets",
234+
JsonConvert.SerializeObject(reference.data.InternalReferencedOtherAssets) ?? "[]");
235+
m_AddressablesExplicitAsset.SetValue("labels",
236+
JsonConvert.SerializeObject(reference.data.Labels) ?? "[]");
237+
m_AddressablesExplicitAsset.SetValue("main_asset_type", reference.data.MainAssetType);
238+
m_AddressablesExplicitAsset.ExecuteNonQuery();
268239
break;
269240
}
270241
}

0 commit comments

Comments
 (0)