用Xamarin写Android的感受

我其实很早就有关注Xamarin了,当时MonoDroid那本书一出来我立马就买了一本。后来Xamarin有个推广活动,按照步骤完成Demo之后送一件印有Xamarin Logo的T恤,我是很想要的,但是最终没能寄过来……

最近工作上需要,硬着头皮接过一个安卓工程过来,装了一下午安卓环境都没跑起来,遂决定用Xamarin重写。

环境配置

相较于AS又是gradle又是各种xml,VS+Xamarin+Nuget的体验真的要好很多。AndroidManifest.xml都可以图形化地去改。Nuget虽然有时也慢,但比gradle还是强太多。

尽管你可能也需要一下午的时间去安装VS,但是随后的体验就像上了高速路,而AS一路都是有障碍物的,更别提啥Eclipse了,再劝一句各位还在用Eclipse的都赶紧卸了吧。

C# vs Java

对我稍有了解的人都知道我想说什么,还是不说了。

https://www.xamarin.com/platform

async/await真的是好用的飞起。看到Java异步写文件的操作我是很难受的。

而C#里是这样的:

private async void Save(string path, byte[] bytes)
        {
            try
            {
                using (FileStream fs = new FileStream(path, FileMode.Create))
                {
                    await fs.WriteAsync(bytes, 0, bytes.Length);
                }
            }
            catch (Exception ex)
            {
                 //该咋处理咋处理
            }
        }

 

三方库

Xamarin的三方库也已经越来越多了,而且最赞的是,大部分三方库都能跨好几个平台,而且有优良的异步接口。

Xamarin.Forms

名字叫“Forms”却是用XAML,不是应该叫XamarinLight或者XPF吗?

对于我来说最大的障碍果然还是没有一个可视化的设计器吧。自己写XAML还是没有那么熟练,WPF还凑合,因为大家也都对Windows下什么控件长什么样非常面熟了。但是一旦换到Web或是移动平台,就完全不知道会是什么效果了。

此外由于项目要用Android专用的Camera2 API(请让我再吐槽下,一个仅仅是拍照的Demo能有1k多行代码,这API设计真是……),也就没有必要用Xamarin.Forms给自己增加麻烦了。下次有机会再试吧。

调试

AS引以为豪的快速部署总是让我下载这下载那,而下载速度又很成问题。Xamarin的快速部署体验还是很不错的,不过还是会卸载掉旧的APK并重装,虽然速度还挺快,但是在MIUI上这意味着你要重新点一遍“允许安装”、“允许拍照”。

在抛异常方面,Xamarin调试时候抛出的异常有时候不能显示具体信息,只告诉你有异常了(这大概是Xamarin的BUG吧)。这时候还是要停止调试自己运行一遍,安卓系统自己会显示包含具体异常信息的错误报告。

打包

首先吐槽一下翻译,Archive给翻译成了“存档”,所以要打包你其实得点“存档”……找了半天。

Debug模式下是有装共享运行库的,体积方面当然不能以它为准。于是我找到bin\Release,一看Sign.apk只有5MB,喜出望外只想高呼Xamarin万岁。但是后来发现那是给真机调试时才会生成的,用一下打包功能打出来还是有10MB(可能是我大部分功能都是非常managed地使用了System.*而不是Java那一套的理论)。其实现在手机机身存储爆炸,10MB完全也是可以接受的对吧。不过如果用native编译的话,最终还是可以缩成5MB。

 

评论 (3) -

  • RMB
    我最近也接触了xamrin android 啊哈哈

    • Xamarin还算比较好用,Xamarin.Forms还需要个设计器以及更统一且简单易用的API。
      现在问题是Android和iOS原生的API都太繁琐了,一个拍照Demo都要1k行代码才能实现基本功能,在某些机型上还有兼容问题,而且代码里一堆硬编码常量,所以说Java……
      • RMB
        Xamarin.Forms 的设计器是比较坑啊..

        而且如果需要高度自定义UI是不是还是得写原生UI来着,总感觉有些地方用Xamarin.Forms还不好实现

        android和ios的api这个确实挺让人头大 。

添加评论

Loading