在Xamarin Droid构建系统中,如果不单独指定每个资源,如何打包Android资产?

在Xamarin Droid构建系统中,如果不单独指定每个资源,如何打包Android资产?,android,xamarin,csproj,Android,Xamarin,Csproj,我想使用Xamarin生成一个android apk,它包含大量资产。我不想在csproj中单独添加每一个,因为数量很大,而且资产是可变的。(通过先前的构建步骤生成) 这需要在单个apk模式和每个ABI模式下都工作。磁盘上的资产位置 在项目目录中创建以下目录: ExtraAssets\assets ExtraAssets-armeabi-v7a-23.0.0\assets ExtraAssets-x86_64-23.0.0\assets (一个平台少一个,每个所需支撑平台一个) 其中:

我想使用Xamarin生成一个android apk,它包含大量资产。我不想在csproj中单独添加每一个,因为数量很大,而且资产是可变的。(通过先前的构建步骤生成)


这需要在单个apk模式和每个ABI模式下都工作。

磁盘上的资产位置

在项目目录中创建以下目录:

ExtraAssets\assets
ExtraAssets-armeabi-v7a-23.0.0\assets 
ExtraAssets-x86_64-23.0.0\assets  
(一个平台少一个,每个所需支撑平台一个) 其中:

其中23.0.0是目标Android API

将所有必需的资产文件放在资产目录中

修改csproj

在Droid csproj(例如
MyApp.Droid.csproj
)中添加以下部分:

(每个所需支持平台的Exec,加上一个无平台的Exec)


当使用模拟器进行调试时,DebugDeploy目标会有所帮助,您只需要生成一个apk

这应该在创建apk包之后运行,并在apk签名之前将ExtraAsserts\assets中的所有文件插入(无平台)apk

平台特定的外部断言被插入到平台特定的APK中

Xamarin特定构建变量说明:

\u BuildTargetAbis
-部署目标abi,例如:“armeabi-v7a;x86\u 64”

\u AndroidPackage
-不带平台和.apk ext的包名

JavaToolPath
-java工具的位置-jar.exe需要

AndroidSdkBuildToolsVersion
-android API版本。(例如:“23.0.0”)

ApkFileIntermediate
-Path tp obj dir中的apk文件-这是一个已签名的文件(而不是OutDir中的文件)

MonoAndroidIntermediate
-包含“android\bin\”的obj目录,其中包含
ApkFileIntermedate
文件引用的文件

armeabi, armeabi-v7a, arm64-v8a, x86, x86_64
<Target Name="DebugDeploy" BeforeTargets="_Sign">
  <Exec Command="&quot;$(JavaToolPath)\jar.exe&quot; -uMf &quot;$(MonoAndroidIntermediate)android\bin\$(_AndroidPackage).apk&quot; -C &quot;$(ProjectDir)\ExtraAssets-x86-64-$(AndroidSdkBuildToolsVersion)&quot; assets" Condition="Exists('$(OutDir)\$(_AndroidPackage).apk') and '$(Configuration)|$(Platform)' == 'Debug|AnyCPU'" />  
  </Target>
  <Target Name="BeforePublish" BeforeTargets="_Sign">  
    <Exec Command="&quot;$(JavaToolPath)\jar.exe&quot; -uMf  &quot;$(MonoAndroidIntermediate)android\bin\$(_AndroidPackage).apk&quot; -C &quot;$(ProjectDir)\ExtraAssets&quot; assets" Condition="Exists('$(OutDir)\$(_AndroidPackage).apk')" />
    <Exec Command="&quot;$(JavaToolPath)\jar.exe&quot; -uMf &quot;$(MonoAndroidIntermediate)android\bin\$(_AndroidPackage)-armeabi-v7a.apk&quot; -C &quot;$(ProjectDir)\ExtraAssets-armeabi-v7a-$(AndroidSdkBuildToolsVersion)&quot; assets" Condition="Exists('$(OutDir)\$(_AndroidPackage)-armeabi-v7a.apk')" />
    <Exec Command="&quot;$(JavaToolPath)\jar.exe&quot; -uMf &quot;$(MonoAndroidIntermediate)android\bin\$(_AndroidPackage)-x86_64.apk&quot; -C &quot;$(ProjectDir)\ExtraAssets-x86_64-$(AndroidSdkBuildToolsVersion)&quot; assets" Condition="Exists('$(OutDir)\$(_AndroidPackage)-x86_64.apk')" />     
  </Target>