使用Xamarin,我想制作一个包含大量资产的android apk。我不想在 csproj 中单独添加每个,因为数量很大,而且资产的可变性。(通过先前的构建步骤生成)
这需要在单个 apk 模式下和每个 ABI 模式下一个 apk 都有效。
资产在磁盘上的位置
在项目目录中,创建以下目录:
ExtraAssetsassets
ExtraAssets-armeabi-v7a-23.0.0assets
ExtraAssets-x86_64-23.0.0assets
(一个平台少一个,每个必需的支持平台一个) 出自:
armeabi, armeabi-v7a, arm64-v8a, x86, x86_64
其中 23.0.0 是目标 Android API。
将所有必需的资产文件放入资产目录中。
修改 csproj
在Droid csproj(例如。MyApp.Droid.csproj
) 添加以下部分:
(每个必需的受支持平台的执行,加上一个平台减去一个)
<Target Name="DebugDeploy" BeforeTargets="_Sign">
<Exec Command=""$(JavaToolPath)jar.exe" -uMf "$(MonoAndroidIntermediate)androidbin$(_AndroidPackage).apk" -C "$(ProjectDir)ExtraAssets-x86-64-$(AndroidSdkBuildToolsVersion)" assets" Condition="Exists('$(OutDir)$(_AndroidPackage).apk') and '$(Configuration)|$(Platform)' == 'Debug|AnyCPU'" />
</Target>
<Target Name="BeforePublish" BeforeTargets="_Sign">
<Exec Command=""$(JavaToolPath)jar.exe" -uMf "$(MonoAndroidIntermediate)androidbin$(_AndroidPackage).apk" -C "$(ProjectDir)ExtraAssets" assets" Condition="Exists('$(OutDir)$(_AndroidPackage).apk')" />
<Exec Command=""$(JavaToolPath)jar.exe" -uMf "$(MonoAndroidIntermediate)androidbin$(_AndroidPackage)-armeabi-v7a.apk" -C "$(ProjectDir)ExtraAssets-armeabi-v7a-$(AndroidSdkBuildToolsVersion)" assets" Condition="Exists('$(OutDir)$(_AndroidPackage)-armeabi-v7a.apk')" />
<Exec Command=""$(JavaToolPath)jar.exe" -uMf "$(MonoAndroidIntermediate)androidbin$(_AndroidPackage)-x86_64.apk" -C "$(ProjectDir)ExtraAssets-x86_64-$(AndroidSdkBuildToolsVersion)" assets" Condition="Exists('$(OutDir)$(_AndroidPackage)-x86_64.apk')" />
</Target>
调试部署目标在使用模拟器进行调试时会有所帮助,您只想生成单个 apk。
这应该在 apk 的包创建后运行,并在 apk 签名发生之前将 ExtraAsserts\assets 中的所有文件插入(无平台)apk 中。
特定于平台的 ExtraAsserts入到特定于平台的 apk 中。
Xamarin 特定的 BuildVars 描述:
_BuildTargetAbis
- 部署目标 ABI 例如:"Armeabi-V7A;x86_64">
_AndroidPackage
- 不带平台和.apk分机的软件包名称
JavaToolPath
- Java 工具的位置 - jar 需要.exe
AndroidSdkBuildToolsVersion
- 安卓API版本。(例如:"23.0.0")
ApkFileIntermediate
- 在 obj dir 中路径 tp apk 文件 -这是签名的文件(而不是 OutDir 中的那个)
MonoAndroidIntermediate
- 包含 "android\bin\" 的 obj 目录,该文件引用的文件所在的位置ApkFileIntermedate
该目录。