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

Xamarin.Forms android application built from command line doesn't work

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

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

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

这些是我使用的命令:

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 sign --ks SymCheck.keystore --ks-key-alias SimCheck my_application_aligned.apk

同样的结果。

我发现了问题。

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

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

但是,msbuild /t:PackageForAndroid 嵌入 .apk 的只是 运行 应用程序所需的部分资源。

删除该检查确实解决了问题; .apk3.6MB 变为 16MB

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

  • 确保为发布配置禁用快速部署
  • .csproj所在的目录打开Visual Studio命令提示符,然后运行在其中输入以下命令:
# 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.}

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

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

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