Information on Xamarin.Android ============================== By Edward Brey and Ronan Burke This page shows how to automate Obfuscar for Xamarin.Android using MSBuild. Integration for other Xamarin platforms is similar. .. contents:: In this article: :local: :depth: 1 Nuget Package ---------------- Install the Obfuscar NuGet package into the Xamarin.Android project. .. code-block:: powershell Install-Package Obfuscar Project File ------------ In the Xamarin.Android project file (.csproj), add an ``AfterBuild`` target to run the obfuscator. The obfuscator runs from ``MonoAndroidIntermediateAssetsDir``, which is the assets directory that gets bundled into the APK. An example of this directory is ``obj\Release\90\android\assets``. The obfuscator outputs to the target directory (e.g. ``bin\Release``) so that the mapping file will go there. It then copies the obfuscated files to the assets directory. This is an example target for obfuscating a single assembly called ``MyAssembly.dll``: .. code-block:: xml It is a good idea to `place this near the bottom `_ of your project file after all other targets to ensure it is run. Obfuscar Configuration File --------------------------- Create ``obfuscar.xml`` in the Xamarin.Android project. Configure it to output to the target directory relative to the assets directory. .. code-block:: xml Troubleshooting --------------- To more effectively troubleshoot issues, you can use the following tools/methods: - Temporarily change the ``AfterBuild`` target mentioned above to be for the 'Debug' configuration. Add a debug message to the configuration so you can confirm the task is being run: .. code-block:: xml Update ``obfuscar.xml`` to output to the Debug folder: .. code-block:: xml - Run your application in Debug mode. In Visual Studio, go to ``Debug > Windows > Exception Settings``. Enable ``Common Language Runtime Exceptions``. When your app runs, this will allow you to see if you are getting any new exceptions when obfuscation is enabled. - If your app crashes on startup with no obvious exceptions, go to ``Tools > Android > Device Log...`` and use the messages from Logcat to diagnose/research the errors you get. Linking issues ************** With linking enabled, you may get this error message: :: XALNK7000: Java.Interop.Tools.Diagnostics.XamarinAndroidException: error XA2006: Could not resolve reference to ' . ' ... When the scope is different from the defining assembly, it usually means that the type is forwarded. ---> Mono.Cecil.ResolutionException: Failed to resolve . With linking disabled, you may get this error message: :: JAVAC0000: error: illegal character: '\u2006' xamarin forms The above two errors can be resolved by using this property in ``obfuscar.xml``: .. code-block:: xml AndroidX issues *************** Using Obfuscar can reveal issues with an improper AndroidX migration in Xamarin. If you get an error like this: :: System.InvalidCastException: Unable to convert instance of type 'Google.Android.Material.Internal.CheckableImageButton' to type 'AndroidX.AppCompat.Widget.Toolbar' You should update "android.support.v7.widget.Toolbar" to "androidx.appcompat.widget.Toolbar" in ``Toolbar.xml``. You should rename the file to ``Toolbar.axml``. You should update "android.support.design.widget.TabLayout" to "com.google.android.material.tabs.TabLayout" in ``Tabbar.xml``. You should rename the file to ``Tabbar.axml``. The `Xamarin.Forms team recommend removing these files altogether `_ , but you may encounter other issues when running your Android app after doing this. Dependency injection errors *************************** If you are using dependency injection and are getting dependency injection errors, ensure public items are kept in ``obfuscar.xml``: .. code-block:: xml Related Resources ----------------- - :doc:`/getting-started/basics` - :doc:`/getting-started/configuration` - :doc:`/tutorials/basics` - :doc:`/support/services`