VContainer+Obfuscator まとめ(と言いつつ難読化のトラブルまとめかも

Unity2020.3.5 VContainer1.8.0 Obfuscator3.8.2

Obfuscator | ユーティリティ ツール | Unity Asset Store
Use the Obfuscator from Beebyte on your next project. Find this utility tool & more on the Unity Asset Store.

AddressableでシーンロードしてそのタイミングでDIします

ADFフル活用してます

クラッシュ対策

  • LifetimeScopeを継承したクラスに[Skip]をつける(とにかく難読化しちゃダメ
  • クラス内クラスは使わない(おまじない
  • デストラクタは使わない
  • オリジナルジェネリックの継承は死にやすい( Hogehoge : FugaFuga<Hello>
  • 基底クラスの関数を使用してる派生クラスに対し、フェイクコード有効状態でリフレクションのmethodInfo.IsDefinedを呼ぶと死ぬ(obfuscatorのバグ? バグレポ中
  • VContainerをSkip Namespacesに登録(そもそも自分の書いたコード以外は守る必要ない
  • MagicaCloth設定したprefabがエラーになってるなら直す(そもそもMagicaClothを守る必要はない
  • CustomPass継承したクラスは[Skip] (とにかく難読化しちゃダメ
  • SROptionsは[Skip](難読化しても大丈夫にできたけど、エディタごと落ちる原因にもなる
x00007FFFC9ABDF43 (GameAssembly) [C:\Program Files\Unity\Hub\Editor\2020.3.5f1\Editor\Data\il2cpp\libil2cpp\vm\Reflection.cpp:662] il2cpp::vm::Reflection::HasAttribute 
 0x00007FFFCA1C14F7 (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\mscorlib10.cpp:33022] MonoCustomAttrs_IsDefined_m73373570DE523E9AA18D5EFFD242365C87F5D8CD 
 0x00007FFFCA57B3AB (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\VContainer.cpp:23075] TypeAnalyzer_Analyze_mAAAF83842B8C623E03128F6A639558D56997CE23 
 0x00007FFFCA7EE042 (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\Generics8.cpp:60171] CreateValueCallback_Invoke_m8F9CDF06C2C0B6B3AAEDB925A983CE4B29B42883_gshared 
 0x00007FFFCA7E2029 (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\Generics8.cpp:55127] ConcurrentDictionary_2_GetOrAdd_m5FC29BA5754171259F8C3EC34320534B79CE5B03_gshared 
 0x00007FFFCA57C4A9 (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\VContainer.cpp:24416] U3CU3Ec__DisplayClass1_0_U3CGetOrBuildU3Eb__0_m44A8B20A9465107ECA81B7ACF79E6134993A3B33 
 0x00007FFFCA7EDEA4 (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\Generics8.cpp:60171] CreateValueCallback_Invoke_m8F9CDF06C2C0B6B3AAEDB925A983CE4B29B42883_gshared 
 0x00007FFFCA7E2029 (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\Generics8.cpp:55127] ConcurrentDictionary_2_GetOrAdd_m5FC29BA5754171259F8C3EC34320534B79CE5B03_gshared 
 0x00007FFFCA579505 (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\VContainer.cpp:21105] RegistrationBuilder_Build_m7D09C460E938560621EF2ECEFF18A2A2E972743C 
 0x00007FFFCA56EEE4 (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\VContainer.cpp:11447] ContainerBuilder_BuildRegistrations_m76CF2F23CD7B6EE1D05B04BE327526B38229F093 
 0x00007FFFCA579D05 (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\VContainer.cpp:22261] ScopedContainerBuilder_BuildScope_m5D43E28105DE794957B8BE7B3D6D00D753F1DE3F 
 0x00007FFFCA5729EF (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\VContainer.cpp:16005] LifetimeScope_Build_m00B659860F4421C9BE9751643BEE1F7F7676C9B8 
 0x00007FFFCA57277B (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\VContainer.cpp:15788] LifetimeScope_Awake_mA7C663E7E5E8DA1436A2237B15F86CF04E18D156 
 0x00007FFFC9B170AC (GameAssembly) [D:\unity\034_hotel\hotel_project\Library\Il2cppBuildCache\Windows\x64\il2cppOutput\Il2CppInvokerTable.cpp:148678] RuntimeInvoker_TrueVoid_t700C6383A2A510C2CF4DD86DABD5CA9FF70ADAC5 
 0x00007FFFC9AC1ED0 (GameAssembly) [C:\Program Files\Unity\Hub\Editor\2020.3.5f1\Editor\Data\il2cpp\libil2cpp\vm\Runtime.cpp:568] il2cpp::vm::Runtime::Invoke

クラッシュするとこんな感じのエラー、意味は分かりません…

Obi Fluidいれてからburstあたりでエラーが発生しまくる

Unity2021.2.x Obi fluid 6.4

↓のコードキャッシュの影響かもしれませんが…

原因を突き止められなかったので、このときはObfuscate all assembly definitionsのチェックを外し、Assembliesに守りたいdllを直接書きました

namespaceやclassのignore設定が効かないケースがあるのではと疑っています

Unity2021でエディタが無言で落ちる、windowsのエラーの後エディタが落ちる、謎のリンクエラーが消えない

コードのキャッシュがおかしくなっている可能性があります

Libary直下のファイルを削除したところ直りました。これらのうちどれがクリティカルなのかは絞り込めてません(直感ではSourceAssetDB

ビルドAPIにビルドキャッシュを消すオプションありました

BuildOptions options |= BuildOptions.CleanBuildCache;

別プロジェクトからADFとソースコードをコピペしたせいかも

なぜかこれやると壊れてリンクエラーが発生することあります。該当ADFフォルダを削除し、新規命名でADFを1から作り直しソースコードもコピペでなくvisual studioから1個ずつ生成、ビルドを繰り返して直しました

Obfuscate Assembliesに該当ADFを登録するのを忘れてる

登録忘れても死ぬことあります。なんで??


Editor用のADFなのにAnyPlatformでビルドに含めていた。今まで正常。そこに特定のAssemblyDefinitionReferenceを追加したら突然リンクエラー

Building Library\Bee\artifacts\WinPlayerBuildProgram\ManagedStripped failed with output:
C:\Program Files\Unity\Hub\Editor\2021.3.2f1\Editor\Data\il2cpp\build\deploy\UnityLinker.exe @Library\Bee\artifacts\rsp\16461770786374037127.rsp
Fatal error in Unity CIL Linker
Mono.Linker.LinkerFatalErrorException: ILLink: error IL1011: Failed to write 'C:\unity\036_milk\milk_project\Library\Bee\artifacts\WinPlayerBuildProgram\ManagedStripped\Game.Script.Domain.dll
 ---> System.ArgumentException: Member 'Assets.MKFW.Common.Task.IServiceTaskAccessible' is declared in another module and needs to be imported

Domain.dllは無関係。無関係なdllでリンクエラーが出るようになる。IserviceTaskAccessibleは今回追加した参照、これが原因。外したら直った。そもそもEditor向けにしなくてはダメだった

ビルド時間増大

1回目 2回目 
難読化なし2:301:30
難読化あり3:002:59
(2:30=2分30秒

unity 2020はコードに変更が無い場合はキャッシュしたものを使うので高速にビルドできます

ところが難読化すると毎回変更ありとみなされるのか高速化されません…

小さいテストコードでもだいぶ影響あります。製品コードだとかなりつらいかもです