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

问题描述 投票:15回答:4

我已将一些Android支持库添加到我的项目中,现在我基本上面临与此问题中描述的相同的问题:Android Studio exports strings from support library to APK

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

有没有人有一个想法,我如何才能在我的最终APK文件中保留特定的本地化?

android xamarin xamarin.android apk
4个回答
2
投票

通常,在Xamarin中,AndroidManifest处理使用库的特殊指令Android.App.UsesLibraryAttribute(字符串名称,需要bool)设置将在生成的Manifest.XML中的特定包含和排除。

另据我所知,只有三种方法可以设置链接排除,第一种和第二种方式都是@sunseeker提到的,但是Xamarin文档和开发人员注意强烈建议不要使用如上所述的Full,并且一般主张使用以下内容:

SdkOnly(默认)

上面提到的第二个也是针对特定的排除项,除非您确定特定的包不会被层次结构中的扩展类“幕后”调用,否则也建议不要使用它。

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

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

  1. 至少在调试时将AndroidUseSharedRuntime属性设置为true以减小包大小。
  2. 如果您有一个稳定的构建来预编译包含的库,则将AotAssemblies属性设置为true。
  3. 将EmbedAssembliesIntoApk设置为false,除非它是发布版本。

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


1
投票

现在无法真正检查它,但你有没有看过解决方案AndroidLinkSkip文件中的AndroidLinkModereference.csproj)标签?

所以,它就像是

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

另外,看看MandroidI18n。从上面的same reference

指定应用程序附带的国际化支持,例如排序规则和排序表。该值是一个或多个不区分大小写的值的逗号或分号分隔列表

<MandroidExtraArgs>-i18n=west</MandroidExtraArgs> 

要么

<MandroidI18n>West</MandroidI18n>

0
投票

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

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

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


0
投票

您是否尝试过Borris Spinner的解决方案:

您可以在项目文件中提供AndroidResgenExtraArgs并添加-c en,de等。

查看aapt文档:

-c  specify which configurations to include.  The default is all
       configurations.  The value of the parameter should be a comma
       separated list of configuration values.  Locales should be specified
       as either a language or language-region pair.  Some examples:
            en
            port,en
            port,land,en_US
© www.soinside.com 2019 - 2024. All rights reserved.