【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

采访 Philipp Crocoll:安卓平台上 Java 和 C#的整合

  • 2014-06-05
  • 本文字数:2453 字

    阅读完需:约 8 分钟

在这个采访中,我们跟开源开发者 Philipp Crocoll 讨论了关于 Keepass2Android 的相关话题。Keepass2Android 不仅具有强大的密码存储的功能,还是在一个单独的安卓应用同时使用 Java 和 C#的很好的案例。

InfoQ:能否介绍一下 Keepass2Android 设计初衷是为了解决什么问题?

Keepass 2 是一个强大的密码管理器,我已经使用了很长一段时间。它有一些很好的插件,比如可以集成到 Chrome 或者 Firefox 浏览器中的那些插件。我在手机上也使用 Keepassdroid 进行密码访问。不幸的是,它现在只能实现数据库的读访问(最初的 Keepass 1 还提供了写的功能,但对我却没多大帮助)。随着使用手机的频率越来越高,我就想要创建一个账户,来存储手机上的这些密码了。

于是,我开始思考自己去添加这些功能,我决定用 Mono 安卓版将这个应用移植为 C#版,并且基于 Keepass 2 的源代码来实现密码数据库的修改功能。

InfoQ:Keepass2Android 跟其他的密码管理器有什么不同?

当我的应用差不多快写完的时候,Keepassdroid 还加入了写支持的功能(至少已经处于 Beta 模式了)。我决定无论如何都要发布它,因为它已经有了一些新特性——包括完全兼容 Keepass 2、浏览器集成以及 QuickUnlock 等。QuickUnlock 是一种内存数据库技术(即从不在 SD 卡上存储主密码)。为了能够在用户丢失手机时保护用户数据库的安全,必须输入一个短密码才能解锁数据库。这比每次都要输出强安全的、过长的主密码要好得多。

自最初的版本以来,我已经添加了大量的新功能:用户可以使用键盘输入验证码(因为安卓中的剪贴板是不安全的);对 PC 版的用户而言,可以选择通过 WebDAV、FTP、 SFTP、 Dropbox、OneDrive 或者 GoogleDrive 等进行数据库同步。还有一些更多的“专家”功能,比如使用一次性密码 (通过 NFC 用 Yubikey NEO 输入, https://www.yubico.com/products/yubikey-hardware/yubikey-neo/ )或对 Keepass 2 占位符体系的支持(http://keepass.info/help/base/placeholders.html)

一方面,我尽力让没有太多使用经验的人也能够使用这个应用,同时,也希望为担心安全问题的用户提供选择。

InfoQ:在 Keepass2Android 中使用 C#代替 Java,你选择了什么语言?

写加密的文件必须非常小心:如果你写错了一点,文件就可能成为无用的或者不可读取的。用户必须确信他们的密码数据库是完整无缺的!为了确保不会损坏任何数据库,我决定基于 Keepass 2 的最初实现。由于 Keepass 2 是用 C#写的,我评估了在安卓上用此实现的可能性。这是我第一次接触 Xamarin 的安卓版 Mono。我早期的工作中曾经做过一些 C#开发,也有过一点安卓开发经验。将这两个东西放到一起似乎是一件很有趣的事情。我本人对新知识非常渴望,因此,这对我而言是一个很棒的选择。事实证明,安卓版 Mono 是一个很好的平台:你可以同时拥有.net 框架以及 Java 平台和安卓类库的强大威力。

另一个好处是,可以直接将 Java 库包含进来。事实上,我利用 Eclipse 对安卓更好的支持用 Java 完成了应用的一部分编写(云存储、自定义键盘)。

InfoQ:将 Java 和 C #代码整合到同一个应用中主要需要做哪些事情?这很顺利吗?还是遇到了一些重大的挑战?

Xamarin 团队已经围绕两种语言的融合做了很多工作,包括在.net 项目中创建一个绑定库,使得 Java 库可以被引用。这会生产一些 C#类和接口,这些接口可以用于调用 Java 代码。这些工作完美无暇,甚至可以自动转换常见的命名规则和模式。举一个简单的例子:“String getPackageName()”会转换成“string PackageName { get {……} }”。而事件的处理:“setOnClickListener(…)”会自动转换成 C#中的“Click += ……”。

对于一些简单的接口,我还没有发现任何问题。如果你想要绑定一些复杂的库,通常需要按以下网页中的描述手工做些工作:

http://docs.xamarin.com/guides/android/advanced_topics/java_integration_overview/binding_a_java_library_(.jar)/api_metadata_reference/

随着 Java 类绑定以及与 C#的对接,用起来感觉就跟用 C#库差不多。我所看到的极少的不同是,从 Java.Lang.Object 中派生出一个类时,需要添加这样一行代码:

catch (Java.Lang.Exception e)

这行代码是非常必要的,因为当实现一个起初在 Java 定义的接口时,需要将这个类的对象回传给 Java 代码。

在我实现的代码中,这是唯一一处“对象”处于两台虚拟机的地方,这两个世界都有着各自的垃圾收集机制。

InfoQ:你会考虑针对未来的安卓项目再次使用 C#吗?

我认为安卓版 Mono 是我的工具集中的一个工具。尽管它很强大,但是它不是必需的,或者说它不一定适合所有的项目。

在 Keepass2Android 中使用 C#的原因是,它让我能够在一个安卓 App 中用到一个非常强大的库(Keepass 2 code)。并且,对于每一个有 C#背景的朋友而言,使用 C#的一些好的特性 (LINQ、Lambdas、动态类型等等) 以及.net 框架,也是非常不错的。

另一个原因,是安卓版 Mono 的可移植性,借助它,代码可以运行在 Android、iOS(它们使用 Xamarin)上,当然还可以运行在 Windows 和 Linux(使用 Mono) 上。但不幸的是,它也有一个缺点——Mono 库添加了一些 MB 级大小的应用包(不同的框架具体大小也有所不同),导致构建过程相比纯 Java 要慢很多。

目前,我的 App 从 Visual Studio 上发布需要 2 分多钟的时间。为了缓解这个问题,我为那些应用功能少、构建时间快的开发者添加了构建选项,此外,我还尝试在外部项目中开发一些新的特性。

还有一点,IDE 对于一些安卓特定功能的支持比不上 Eclipse 或者是 Android Studio,这会减慢开发的速度。

出于这些原因,我可能会根据具体的项目来决定是不是要使用 Mono 安卓版。

Keepass2Android 可以在 CodePlex 中获取, GPLv3 license

查看英文原文: Interview with Philipp Crocoll on Java/C# Integration for Android


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-06-05 03:051953

评论

发布
暂无评论
发现更多内容

项目已成为组织发展的必要手段、企业成长的发动机

Seven的代码实验室

项目管理

架构实战营模块二作业

zhongwy

架构实战营 「架构实战营」

A 5G Odyssey :2021北京漫游

脑极体

语音信号处理 4:语音的声学特征

轻口味

AI 28天写作 12月日更

MQTT X v1.7.0 正式发布:MQTT 5.0 支持最为完整的客户端工具

EMQ映云科技

物联网 IoT mqtt

第二周作业

cqyanbo

49 K8S之Envoy代理程序

穿过生命散发芬芳

k8s 28天写作 12月日更

Volatile 初探和 Java 内存模型

悟空聊架构

SpringCloud 28天写作 passjava 悟空聊架构 12月日更

-exec rm 与 xargs rm -rf 深度剖析

liuzhen007

28天写作 12月日更

事业的智囊团,精神的后花园(19/28)

赵新龙

28天写作

Linux之cat命令

入门小站

Linux

如何把新用户转化为活跃用户

石云升

AARRR 产品思维 28天写作 产品增长 12月日更

=>符号使用场景

喵叔

28天写作 12月日更

架构实战模块二作业

青青子衿

模块7学习总结

Geek_1d37ea

架构实战营

在线JSON转BigQuery工具

入门小站

工具

架构实战模块2作业

holdzhu

「架构实战营」

服务端质量保证体系(四) 测试环境治理

homber

服务端 质量保证 测试环境 签约计划第二季

作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业作业业作业作业作业作业作业作业作业作业作业作业作业作业作业

AUV

「架构实战营」

ArgoCD 简明教程

Se7en

圣诞节快到了,何不送给Ta一份程序员的浪漫

海拥(haiyong.site)

前端 代码中的浪漫 圣诞节 28天写作 12月日更

模块7作业

Geek_1d37ea

架构实战营

微信朋友圈高性能架构

Only

架构实战营 「架构实战营」

别做消费主义的祭品

mtfelix

轻松容器化golang应用程序

xcbeyond

golang Docker 28天写作 12月日更

homework02

王欣欣

「架构实战营」

架构实战营模块二作业

lchx08

「架构实战营」

元宇宙

圣迪

区块链 数字孪生 元宇宙 进化的力量 扩展现实

学习总结 2021.12.19

mj4ever

学习笔记

模块三作业

Vincent

「架构实战营」

架构训练营第四期-作业2

supermenG

架构师训练营 4 期

采访Philipp Crocoll:安卓平台上Java和C#的整合_C#_Jonathan Allen_InfoQ精选文章