从命令行构建的 Xamarin.Forms android 应用程序不起作用

Fra*_*ron 5 msbuild keytool jarsigner visual-studio xamarin.forms

我有一个 Xamarin.Forms Android 应用程序,使用 Visual Studio 2017 开发。如果我​​从 Visual Studio 运行/调试应用程序,使用 USB 设备,它运行良好(调试和发布配置)。

然后我使用 Visual Studio 中的存档命令创建 .apk。为了测试它,我只需从我的开发人员上传它。计算机到谷歌驱动器,然后从同一设备下载并安装它。这也有效。

当我尝试从命令行创建 .apk 时,问题就出现了。以这种方式获得的文件被设备识别,并正确安装它,但是当我启动应用程序时,它似乎启动但一秒钟后突然关闭。我什至没有得到我在开发阶段出现异常时遇到的熟悉的弹出窗口“不幸的是应用程序停止了”。

这些是我使用的命令:

msbuild /t:Clean /p:Configuration=Release

msbuild /t:PackageForAndroid /p:Configuration=Release

keytool -genkey -v -keystore SymCheck.keystore -alias SimCheck -keyalg RSA -keysize 2048 -validity 10000

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore SymCheck.keystore my_application.apk SimCheck

根据https://docs.microsoft.com/en-gb/xamarin/android/deploy-test/signing/manually-signing-the-apk

我也试过这个序列

msbuild /t:Clean /p:Configuration=Release

msbuild /t:PackageForAndroid /p:Configuration=Release

keytool -genkey -v -keystore SymCheck.keystore -alias SimCheck -keyalg RSA -keysize 2048 -validity 10000

zipalign.exe -f -v 4 my_application.apk my_application_aligned.apk

apksigner.bat 符号 --ks SymCheck.keystore --ks-key-alias SimCheck my_application_aligned.apk

结果相同。

Fra*_*ron 7

我发现了这个问题。

由于某些原因,下面指出的项目选项也在发布配置中设置。

在调试时,visual studio 确实将所有需要的资源转移到设备上,所以在这种情况下一切正常。

但是,msbuild /t:PackageForAndroid被嵌入.apk到运行应用程序所需的唯一资源中。

删除该检查确实解决了问题;在.apk从去3.6MB16MB

在此处输入图片说明

所以,这里是完整的操作序列:

  • 确保为发布配置禁用快速部署
  • 在 所在的目录上打开Visual Studio 命令提示符.csproj,然后在其中运行以下命令:
# clean step
msbuild /t:Clean /p:Configuration=Release

# build step
msbuild /t:PackageForAndroid /p:Configuration=Release

# keytool step
"[c:\Program Files (x86)\Java\jdk1.8.0_161\bin\\]keytool.exe" -genkey -v -keystore <a filename for keystore> -alias {a string} -keyalg RSA -keysize 2048 -validity 10000

# jarsigner step
"[c:\Program Files (x86)\Android\android-sdk\build-tools\\{version e.g. 27.0.1}\\]zipalign.exe" -f -v 4 bin\Release\\{file apk created by msbuild in step build step} bin\Release\\{output apk filename}

# apksigner step
"[c:\Program Files (x86)\Android\android-sdk\build-tools\\{version e.g. 27.0.1}\\]apksigner.bat" sign --ks {filename for keystore chosen in step c.} --ks-key-alias {alias string chosen in keytool step.} bin\Release\\{output apk filename from zipalign step.}
Run Code Online (Sandbox Code Playgroud)

最后一步 ( apksigner step)生成的 apk是好的。

路径[]是特定于平台的,可以避免更改机器的PATH环境变量。

部分{}是由用户选择的名称。