写点什么

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

评论

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

手把手教你用爬虫抓取1688商品详情和店铺全量商品API接口——从零到实战

代码忍者

1688API接口

如何使用通义灵码辅助开发微信小程序

阿里云云效

微信小程序 云计算

私有化IM即时通讯,稳定安全的企业内部聊天软件BeeWorks

BeeWorks

即时通讯 IM 私有化部署 企业级应用

USDT支付系统开发,OTC承兑商支付系统开发

区块链软件开发推广运营

dapp 交易所开发 链游开发 公链开发 代币开发

如何使用通义灵码辅助开发微信小程序

阿里巴巴云原生

11Labs 发布 MCP 服务器,在 Claude 秒建语音智能体;通义开源 3D 数字人,集成实时互动对话全链路 SDK

RTE开发者社区

zk基础—zk实现分布式功能

不在线第一只蜗牛

分布式

Java AI智能编码助手:通义灵码安装和使用指南

阿里巴巴云原生

Java 人工智能 云计算

AI口语练习App的技术架构

北京木奇移动技术有限公司

AI技术 软件外包公司 AI口语练习

区块链智能合约的安全性

北京木奇移动技术有限公司

智能合约 区块链技术 软件外包公司

虚拟表 + 高效写入 + 流计算优化,时序数据库 TDengine 3.3.6.0 重构核心体验

TDengine

数据库 tdengine 时序数据库

腾讯Bugly:当AI大模型为鸿蒙应用体验注入「智慧基因」

新消费日报

Web3游戏全栈开发实战指南:智能合约与去中心化生态构建全解析

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

一键美化PPT的AI工具怎么用?PPT自动美化全攻略!

职场工具箱

人工智能 效率工具 PPT AIGC AI生成PPT

鸿蒙APP开发的技术架构

北京木奇移动技术有限公司

鸿蒙app 软件外包公司 APP外包公司

手把手教你用爬虫技术抓取1688商品详情与实现关键字搜索API——实战干货分享

代码忍者

1688API接口

CrossOver玩游戏兼容性怎么样?CrossOver无法运行游戏怎么办?

阿拉灯神丁

游戏 兼容性测试 M2芯片 CrossOver Mac下载 Mac电脑软件

TON生态游戏开发全攻略:Web3超级入口的实战指南

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

快速业务扩张下,App混合开发成必然选择

xuyinyin

为什么学习设计模式?

电子尖叫食人鱼

学习 设计模式

2025 中国人工智能教育大会召开,和鲸x智谱推出人工智能通识教育方案

ModelWhale

人工智能 高等教育 通识课 人工智能通识课

2025年最新盘点:国内外70家主流低代码/零代码开发平台

优秀

低代码 零代码

AI 编程时代的核心驱动力 ——iVX 平台的创新实践与未来展望

代码制造者

无代码

安全运营 | 第十期「纵深防护·极智运营」度安讲技术沙龙成功举办

百度安全

2025年GitHub Star增长最快的15个开源低代码项目

NocoBase

GitHub 开源 低代码 零代码 无代码

安全的企业局域网聊天工具哪个好用?

BeeWorks

即时通讯 IM 私有化部署 企业级应用

Java AI智能编码助手:通义灵码安装和使用指南

阿里云云效

Java AI

【双周会】就在今晚,Apache SeaTunnel Community Call 会议通知

Apache SeaTunnel

【解决方案】DistilQwen2.5-R1蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践

阿里云大数据AI技术

人工智能 深度思考 大模型 模型蒸馏 DistilQwen2.5

2025杭州国际机器人展览会

AIOTE智博会

机器人展 智能机器人展 人形机器人展

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