写点什么

采访 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:052493

评论

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

如何通过Python SDK创建一个新的Collection

DashVector

数据库 AI 向量检索 大模型

当 AI SaaS 的边际成本不再为零,Cursor 是如何设计定价策略的?

Baihai IDP

人工智能 AI SaaS cursor

新客户 | 上亿条油罐数据秒查,智慧加油站告别慢查询

TDengine

tdengine 时序数据库 tsdb

鼎捷数智新书创想会:“AI+”的未来已来,面对窗口期鼎捷只争朝夕

人称T客

从 VMware 到超融合:合规与性能双重变革下的必然选择

智驱前线

vmware 超融合

MyEMS:以开源智能为笔,绘就能源可持续发展新图景

开源能源管理系统

开源 能源管理系统

GPT-5时代,咕泡人工智能深度学习班重磅升级!

咕泡科技

人工智能 咕泡ai 咕泡科技 gpt-5

LED球形屏与传统LED显示屏5大区别

Dylan

LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家 户内led显示屏

Pole Star收购Clearwater

财见

1688商品评论API秘籍!轻松获取商品评论数据

tbapi

1688商品评论数据接口 1688商品评论API 1688API 1688评论API

MyEMS:数字化能源管理系统的技术架构与能效优化实践

开源能源管理系统

开源 能源管理系统

BeeWorks企业内部通讯,企业安全高效沟通

BeeWorks

即时通讯 IM 私有化部署

昆仑万维Mureka V7.5模型上线,AI音乐创作水平再迎新高度

新消费日报

GitHub 上 Star 数量前 18 的开源 AI Agent 项目

NocoBase

人工智能 GitHub 开源 AI AIAgent

AI 陪伴市场 2025 收入预计破 1.2 亿美元;语音助手 Commitify:AI 打电话追踪用户任务进度丨日报

声网

CST软件教程:CST如何设置电压监视器

思茂信息

电磁 仿真 CST软件

人工智能驱动下,海外舆情监测的技术革新与应用

沃观Wovision

人工智能、 沃观Wovision 舆情监测系统

从 VMware 到国产超融合:平滑迁移与效能跃迁的技术实践

智驱前线

大数据-68 Kafka 日志存储 与 LogSegment 机制全面详解 实机实测

武子康

Java 大数据 kafka 分布式 消息队列

德莎胶带闪耀DIC EXPO 2025,以创新粘接技术赋能显示产业进化

财见

kubectl logs 报错问题解决

天翼云开发者社区

容器

开发者必看!前端性能调优工具Performance面板实战

OpenTiny社区

性能优化 前端

BeeWorks 即时通讯全家桶:一站式办公的强大引擎

BeeWorks

即时通讯 IM 私有化部署

HR Path战略收购澳企RKM Consulting,以强化全球布局

财见

Infobip确立人工智能为亚太客户体验新标杆

财见

实战分析前端优化工具Performance面板!

OpenTiny社区

性能优化 前端 OpenTiny

MyEMS:企业低碳转型中的能效价值挖掘与数字化管控范式

开源能源管理系统

开源 能源管理系统

NocoBase 本周更新汇总:优化及缺陷修复

NocoBase

开源 低代码 零代码 无代码 版本更新

从TikTok到X:全球社交媒体平台上的危机预警机制

沃观Wovision

社交媒体 海外舆情监控 沃观Wovision

TiDB Grafana 3000 端口漏洞问题处理方案

TiDB 社区干货传送门

管理与运维

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