如何从Xamarin.Android的最终APK文件中删除未使用的语言?

我已经添加了一些Android支持库到我的项目,现在我基本上面临着这个问题中描述的相同的问题: Android Studio导出string从支持库到APK

由于我不能使用Xamarin的Gradle设置,我不能使用StackOverflow答案中描述的解决scheme。

有没有人有一个想法,我怎么能只保留在我的最终APK文件的具体本地化?

Solutions Collecting From Web of "如何从Xamarin.Android的最终APK文件中删除未使用的语言?"

通常,在Xamarin中,AndroidManifest处理库的使用的特殊说明Android.App.UsesLibraryAttribute(string名称 ,bool required )设置将在生成的Manifest.XML中的特定包含和排除。

据我所知,只有三种方法来设置链接排除,第一个和第二个是由@sunseeker提到的,但是Xamarin文档和开发注释强烈build议不要使用Full,如上所述,一般来说使用下面的代码:

SdkOnly(默认)

上面提到的第二个是针对特定的排除,也build议不要使用这个,除非你确定一个特定的包没有被层次结构中的扩展类调用“幕后”。

最后第三种方法是将LinkMode设置为None,而使用AndroidManifest接口规定具体的链接。

其他一些提高效率的方法是:

  1. 至less在debugging时将AndroidUseSharedRuntime属性设置为true以减less包的大小。

  2. 将AotAssemblies属性设置为true,如果您有稳定的构build以预编译包含的库。

  3. 将EmbedAssembliesIntoApk设置为false,除非它是发布版本。

这与Xamarin的构build知识有关,希望它有所帮助。

现在无法真正检查它,但是您是否已经在解决scheme.csproj文件中查看了AndroidLinkSkipAndroidLinkMode ( reference )标记?

所以,它会是这样的

 <AndroidLinkMode>Full</AndroidLinkMode> <AndroidLinkSkip>Mono.Android.Export;I18N;I18N.West</AndroidLinkSkip> 

另外,看看MandroidI18n 。 从上面的同一个参考 :

指定包含在应用程序中的国际化支持,如sorting和sorting表。 该值是一个或多个不区分大小写的值的以逗号或分号分隔的列表

 <MandroidExtraArgs>-i18n=west</MandroidExtraArgs> 

要么

 <MandroidI18n>West</MandroidI18n> 

所以我终于设法以一种理智的方式做到这一点

  1. https://ibotpeaches.github.io/Apktool/下&#x8F7D;Apktool
  2. 用Xamarin创build你的最终的.apk,并用apktool d MyApp.apkapktool d MyApp.apk反编译它
  3. 进入Apktool创build的MyApp目录并查找res目录
  4. 删除所有以不需要的语言标识符结束的values目录,例如,如果您的应用程序只支持德语,则删除values-frvalues-es等等,但不包含values-de不要删除非语言目录,例如values-v11
  5. 使用apktool b MyApp编译您的应用程序
  6. 重新编译的应用程序包现在位于MyApp/dist/MyApp.apk 。 拿这个文件,并用signtool签名,然后zipalign它。
  7. 将apk上传到Google Play

我相信这个过程可以自动化,只要我有一个脚本,我会更新这个答案。