Android Activity 标签 android:name MD5 在 Manifest 文件中更改,无需更改任何代码

Dig*_*put 4 android xamarin.android xamarin xamarin.forms

我在 2018 年 3 月 10 日创建了一个 Android 版本(#1234),然后在 2018 年 5 月 15 日创建了相同版本的版本(#1245)。在这两个版本中,我都存在更改 android 清单文件中的类名的问题。我不知道 xamarin 改变了它的构建过程,所以我得到了不同的类名。

我正在向您展示确切的场景:

在 #1234 中,我得到了名称如下的活动字符串

<activity android:icon="@drawable/icon" android:label="@string/app_name" android:name="md5601603957bd95d32f86ccea34c18d6a7.SplashActivity" android:noHistory="true" android:screenOrientation="portrait" android:theme="@style/SplashTheme">
Run Code Online (Sandbox Code Playgroud)

在 #1245 中,我得到了名称如下的活动字符串

<activity android:icon="@drawable/icon" android:label="@string/app_name" android:name="md5b3a0d56d6e26694c48a179fb000dfbaa.SplashActivity" android:noHistory="true" android:screenOrientation="portrait" android:theme="@style/SplashTheme">
Run Code Online (Sandbox Code Playgroud)

所以区别在于activity的android:name标签。为什么会改变呢?

Sus*_*ver 5

Android Callable Wrapper 的 MD5 名称是使用完整程序集限定名称和命名空间名称的 MD5SUM 生成的(自Xamarin.Android5.1 起)。

使用完整程序集限定名称的巨大变量之一是,如果您使用AssemblyVersion包含通配符的名称,则 MD5SUM 在每次构建时都会发生变化。如果不使用版本通配符,而是手动更改版本,则完整程序集限定名称将更改,从而 MD5SUM 也会更改。

永远不应该在代码中手动引用基于 MD5 的字符串Java.Lang.Class.FromType,您应该使用它来获取字符串形式的 Java 类名:

Java.Lang.Class.FromType(typeof(SomeDotNetClassName)).Name
Run Code Online (Sandbox Code Playgroud)

如果您在应用程序外部“共享”Java 类名,则可以绕过 MD5 自动命名方案并使用Name各种属性类的参数硬编码 Java 类名:

[Activity(Name ="com.sushihangover.SatelliteLaunchWindows.MainList", Label = Consts.Label,  MainLauncher = true, Icon = "@mipmap/ic_launcher", RoundIcon = "@mipmap/ic_round_launcher", Theme = "@style/Theme.SushiHangover.Main")]
public class MainActivity : ReactiveAppCompatActivity<LaunchDatesRecyclerViewModel>
{
    ~~~
}
Run Code Online (Sandbox Code Playgroud)