我们有一个大型的Xamarin.Android项目,有两个依赖项目和一堆第三方dll.在Hax-x86仿真器或Nexus 5设备上进行调试部署(无需任何更改)非常缓慢(> 80秒).为了比较,App的Xamarin.iOS版本在7秒内部署到真实设备上.
为了测试部署时间,我还创建了一个新的Xamarin.Android项目,该项目在大约四秒钟内部署.当我添加依赖项目时,部署时间最多为7秒.当我将布局文件添加到依赖项目时,部署时间增加到大约十秒.
是否可以使用Xamarin Studio加速Android构建和部署?相比之下,大型Eclipse Android项目的部署速度相当快.
只运行安装构建步骤大约需要40秒:
time xbuild /t:Install BigApp.csproj
...
...
...
Time Elapsed 00:00:42.8526970
Run Code Online (Sandbox Code Playgroud)
大约一半的时间花在上面的命令打印到控制台的地方:
Target _CompileDex:
JavaSourceFiles:
JavaLibraries:
ExternalJavaLibraries:
Tool /usr//bin/java execution started with arguments: -Xmx512M -jar
/Users/myname/Library/Developer/Xamarin/android-sdk-mac_x86/build-tools/17.0.0//lib/dx.jar
--no-strict --dex --output=obj/Debug/android/bin/classes.dex obj/Debug/android/bin/classes
/Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/mandroid/platforms/android-15/mono.android.jar
/Users/myname/Projects/BigApp/obj/Debug/__library_projects__/TestFlightBindings.Jars.TestFlightLib_1_2.jar
/Users/myname/Projects/BigApp/obj/Debug/__library_projects__/android-support-v4.jar
/Users/myname/Projects/BigApp/obj/Debug/__library_projects__/classes.jar
/Users/myname/Library/Developer/Xamarin/android-sdk-mac_x86/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
Run Code Online (Sandbox Code Playgroud)
当我从Xamarin Studio运行解决方案时,此步骤发生两次.一次用于依赖项目,一次用于主项目.我尝试在控制台上重现此行为
"/Applications/Xamarin Studio.app/Contents/MacOS/mdtool" -v build "--configuration:Debug -t Install" "BigApp.sln"
Run Code Online (Sandbox Code Playgroud)
但这只会构建主项目.
我创建了一个部署时间非常慢的小型演示项目:https: //github.com/perpetual-mobile/SlowAndroidDeploymentWithXamarin
这些天我的Xamarin.Android应用程序的构建/部署非常缓慢.我不记得以前这么慢.
我启用了:
启用或禁用这些设置没有任何区别.在这两种情况下,构建/部署我的应用程序大约需要2分20秒(最多3分钟!).使用真实设备或Android版Visual Studio模拟器也没有任何区别.
为什么这会非常慢?我没有使用正确的设置吗?
更新2
昨天(11月14日)我将Xamarin.VS更新为4.2.1.58.构建持续时间没有改善.
我们正在使用TeamCity构建我们的应用程序的发布版本,TeamCity统计数据完全显示了我正在谈论的内容.
在下图中,我选择了上一季度作为日期范围.查看构建持续时间的主要增加.现在,我不介意等待3分钟发布版本,但是在调试时它是不可接受的.
更新3
乔恩,谢谢你的帮助.
与此同时,我在构建日志中自己做了一些研究,并找到了每个构建任务的持续时间.我发现不知何故GetAdditionalResourcesFromAssemblies需要花费很多时间.
我在应用程序中拥有的资源量没有显着变化,所以这让我想到:它可能是我正在使用的另一个程序集.
然后,我检查了修订版1029(这是最后一次修改需要花费一分钟时间),并尝试在更新的环境中对其进行调试.它仍然在1分30秒内建成......
所以:
So what was changed between revision 1029 and 1030 of my app?
Compile using Android version to Android 7.0 in project properties我有这个警告永远不会消失,我不知道如何修复它:
警告名称不能以'$'字符开头,十六进制值0x24.
.Android C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Community\MSBuild\Xamarin\Android
C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Community\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets 1668 Build
在启用详细的详细程度后,它指向Xamarin.Android.Common.targets文件的这一部分:
<Target Name="_GenerateJavaStubs" DependsOnTargets="_SetLatestTargetFrameworkVersion;_PrepareAssemblies;$(_AfterPrepareAssemblies)" Inputs="$(MSBuildAllProjects);@(_ResolvedAssemblies);$(_AndroidManifestAbs);$(_AndroidBuildPropertiesCache)" Outputs="$(IntermediateOutputPath)android\AndroidManifest.xml;$(_AcwMapFile);$(_AndroidTypeMappingJavaToManaged);$(_AndroidTypeMappingManagedToJava)">
<GenerateJavaStubs ResolvedAssemblies="@(_ResolvedAssemblies)" ResolvedUserAssemblies="@(_ResolvedUserAssemblies)" ManifestTemplate="$(_AndroidManifestAbs)" MergedManifestDocuments="@(ExtractedManifestDocuments)" Debug="$(AndroidIncludeDebugSymbols)"
NeedsInternet="$(AndroidNeedsInternetPermission)" AndroidSdkPlatform="$(_AndroidApiLevel)" AndroidSdkDir="$(_AndroidSdkDirectory)" PackageName="$(_AndroidPackage)" ManifestPlaceholders="$(AndroidManifestPlaceholders)" OutputDirectory="$(IntermediateOutputPath)android"
MergedAndroidManifestOutput="$(IntermediateOutputPath)android\AndroidManifest.xml" UseSharedRuntime="$(AndroidUseSharedRuntime)" EmbedAssemblies="$(EmbedAssembliesIntoApk)" ResourceDirectory="$(MonoAndroidResDirIntermediate)" BundledWearApplicationName="$(BundledWearApplicationPackageName)"
PackageNamingPolicy="$(AndroidPackageNamingPolicy)" ApplicationJavaClass="$(AndroidApplicationJavaClass)" AcwMapFile="$(_AcwMapFile)">
</GenerateJavaStubs>
<ConvertResourcesCases ResourceDirectories="$(MonoAndroidResDirIntermediate)" AcwMapFile="$(_AcwMapFile)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
我不知道是否需要修改此文件或者我的某个文件是否导致该问题.我仔细检查过,我的文件实际上都没有以$开头.
有任何想法吗?
谢谢.
我正在尝试调试我的 Xamarin 项目。框架和所有包都是最新的。在 iOS 中它有效,但在 Android 中无效。我怎么解决这个问题:
Mono.Linker.MarkException: Error processing method: 'System.Void AndroidX.RecyclerView.Widget.RecyclerView/LayoutManager::n_OnInitializeAccessibilityNodeInfo_Landroidx_recyclerview_widget_RecyclerView_Recycler_Landroidx_recyclerview_widget_RecyclerView_State_Landroidx_core_view_accessibility_AccessibilityNodeInfoCompat_(System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr,System.IntPtr)' in assembly: 'Xamarin.AndroidX.RecyclerView.dll' ---> Mono.Cecil.ResolutionException: Failed to resolve AndroidX.Core.View.Accessibiity.AccessibilityNodeInfoCompat
at Mono.Linker.Steps.MarkStep.HandleUnresolvedType(TypeReference reference)
at Mono.Linker.Steps.MarkStep.MarkType(TypeReference reference)
at MonoDroid.Tuner.MonoDroidMarkStep.MarkType(TypeReference reference)
at Mono.Linker.Steps.MarkStep.MarkMethodBody(MethodBody body)
at Mono.Linker.Steps.MarkStep.ProcessMethod(MethodDefinition method)
at Mono.Linker.Steps.MarkStep.ProcessQueue()
--- End of inner exception stack trace ---
at Mono.Linker.Steps.MarkStep.ProcessQueue()
at Mono.Linker.Steps.MarkStep.ProcessPrimaryQueue()
at Mono.Linker.Steps.MarkStep.Process()
at Mono.Linker.Steps.MarkStep.Process(LinkContext context)
at MonoDroid.Tuner.MonoDroidMarkStep.Process(LinkContext context)
at Mono.Linker.Pipeline.ProcessStep(LinkContext context, IStep step)
at Mono.Linker.Pipeline.Process(LinkContext context)
at MonoDroid.Tuner.Linker.Process(LinkerOptions options, ILogger logger, LinkContext& context)
at Xamarin.Android.Tasks.LinkAssemblies.Execute(DirectoryAssemblyResolver res)
at Xamarin.Android.Tasks.LinkAssemblies.RunTask()
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试生成我的指纹,它应该在这里:~/.android/debug.keystore,但我没有任何东西,虽然我也可以正常运行我的monodroid项目,所以我怎样才能找到debug.keystore文件?
是否可以防止Android应用程序的方向发生变化?我有一个预览手机摄像头的应用程序,我希望方向不要改变.
我已经尝试将其添加到清单中,但它没有任何区别
<application android:label="TextureViewCameraStream" android:hardwareAccelerated="true">
</application>
<activity
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden">
</activity>
Run Code Online (Sandbox Code Playgroud)
我正在使用Xamarin for Android和C#
谢谢
我在Visual Studio 2017上开发时遇到了一个奇怪的错误,我已经能够忽略一段时间,但现在开始真的让我感到烦恼.
我将此问题称为错误而不是错误,因为我仍然可以在Visual Studio中构建我的项目并将它们部署到我的开发设备,而不会出现构建输出中的错误或警告.这似乎可以忽略一点,但随着时间的推移它已成为一个问题,因为我的intellisense用红色强调它作为一个错误
每次我引用Resource类的属性.正如你可能猜到的那样,我引用了很多这个类,Visual Studio编辑器最终变得混乱了这些"错误",它们(a)阻碍了我在代码中发现实际错误的能力,并且(b)让我无法理解......
.
该.csproj的配置文件包含的标签:
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<AndroidResgenClass>Resource</AndroidResgenClass>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v7.1</TargetFrameworkVersion>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
Run Code Online (Sandbox Code Playgroud)当应用程序通过A2DP或Hands Free Profile启动时,我们需要我们的应用程序能够自动连接到配对的蓝牙设备.
我们正在使用Xamarin(monodroid),用于Android平台.
我发现了这个stackoverflow问题:以编程方式连接到配对的蓝牙设备
但它与本土方法有关(见kcoppock的回答).我想知道是否有办法通过Xamarin实现这一目标.我们可以连接到SPP端点,因为它是基于RFCOMM的连接,但我们需要它和音频连接,所以我们想要一种连接到A2DP的方法.
更新1:
我们尝试使用如下CreateInsecureRfcommSocketToServiceRecord方法连接:
mmSocket = device.CreateInsecureRfcommSocketToServiceRecord(0000110A-0000-1000-8000-00805F9B34FB);
mmSocket.Connect();
在致电Connect时,我们收到错误消息:
read failed, socket might closed or timeout, read ret: -1
堆栈跟踪始于:
Java.IO.IOException at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod) [0x00062] in /Users/buil…
更新2:
顺便说一句,当我们尝试使用kcoppock的方法通过本机java测试应用程序连接时,连接代码似乎没有错误,但设备没有作为A2DP耳机连接.
我们看到能够做到的唯一编程方式是Google Play应用,它证明了这是可能的.
我在使用依赖服务时收到此错误Xamarin.Forms PCL.我已经看到了答案,这个错误涉及iOS和Linker.但是,我正在运行此功能Android并且Linker已关闭.调试模式也是如此.
它告诉我的构造函数无法在PCL中找到接口的默认构造函数.
我认为这可能是我做过的一些重命名问题(我使用了重构工具并确保所有必要的更改都已完成)所以我删除了那些文件夹/文件并重新制作它们.依然没有 :(
我一直在搜索和调试这几个小时.有什么东西可能导致这个错误?我很确定我的DependencyService实现是正确的,所以我觉得它是不同的东西.
这是我的相关代码.
namespace Enchantum.Functions
{
public interface PaymentProcessor
{
void setUpCard(String cardNumber,
int expirationMonth,
int expirationYear,
String CVC);
Task cardTokenizer();
void backendCardCharge();
}
Run Code Online (Sandbox Code Playgroud)
[assembly: Xamarin.Forms.Dependency(typeof(PaymentProcessor_Android))]
namespace Enchantum.Droid.Functions_Android
{
class PaymentProcessor_Android : PaymentProcessor
{
public PaymentProcessor_Android() { }
private Card mCard;
private Token mToken;
public void setUpCard(String cardNumber, int expirationMonth,
int expirationYear, String cvcCode)
{
Card card = new Card
{
Number …Run Code Online (Sandbox Code Playgroud) c# dependency-injection xamarin.android stripe.net xamarin.forms
我在Visual Studio中将apk存档并部署到了Google Play商店,但它不允许我继续进行Beta版发布,并且Beta版发布页面上的唯一消息是以下警告:
单击错误后,出现下一条消息:
消息中提供的链接仅适用于Android Studio,不适用于Visual Studio,因此我不知道如何解决此问题。
xamarin.android ×10
xamarin ×7
android ×5
c# ×3
bluetooth ×1
build ×1
google-maps ×1
google-play ×1
macos ×1
mono ×1
stripe.net ×1