50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

评论

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

CrossOver :在苹果mac上轻松地运行Windows软件和游戏

Rose

如何解决Paragon NTFS for Mac安装分卷失败

Rose

海量接入、毫秒响应:易易互联携手阿里云构筑高可用物联网消息中枢

阿里巴巴云原生

阿里云 RocketMQ 云原生

华为开发者空间:秒级搭建鲲鹏工程,玩转原生开发

华为云开发者联盟

鲲鹏DevKit 华为开发者空间

AI Compass前沿速览:IndexTTS2–B站、HuMo、Stand-In视觉生成框架、Youtu-GraphRAG、MobileLLM-R1–Meta、PP-OCRv5

汀丶人工智能

让中国企业飞向世界,金山办公+华为联手造了“AI协同直升机”

脑极体

AI

开发者空间云开发环境+Versatile Agent,轻松构建AI轻量级智能办公助手

华为云开发者联盟

云原生集成开发环境 华为开发者空间 Versatile Agent.

绕过亚马逊儿童版家长控制的技术漏洞分析

qife122

网络安全 家长控制

追踪定位 Java 进程的 Socket 创建

mazhen

Java Linux profiler ebpf crac

A Better Finder Rename 12 mac:批量重命名,提升效率!

Rose

鲲鹏 DevKit 实战!华为开发者空间体验MPI 应用并行调试与编译

华为云开发者联盟

鲲鹏 DevKit 华为开发者空间

构建“超级用户共创网络”:一种实时、结构化吸纳用户洞察的机制

lsycang

如何实现“倾听智能体”:从理念到功能

lsycang

华为开发者空间:Java 项目 Docker 容器化,云主机实操教程

华为云开发者联盟

Docker 华为开发者空间

东软@IAA MOBILITY:开放协作,共绘智慧出行未来图景

先锋IT

活动报名:Voice First!Demo Day@Voice Agent Camp,9.22,上海丨超音速计划 2025

声网

元图 CAD 看图:OCR 识别,让离散文字 “活” 起来

元图CAD

OCR识别 图像识别cad 文字替换 PDF转CAD

第二届航空航天、机械与材料工程国际学术会议 (AMME 2025)

搞科研的小刘

航空航天 国际学术会议 材料与机械

华为开发者空间:递归排序教学,搭建学生成绩管理系统

华为云开发者联盟

C++ 华为开发者空间

Qoder 正式开放订阅,Credits 耐用度提升1/3

阿里巴巴云原生

阿里云 AI

flyway报错Correct the classpath of your application so that it contains compatible versions of the

刘大猫

人工智能 机器学习 算法 数据分析 大模型

使用 NVIDIA Dynamo 部署 PD 分离推理服务

Se7en

数据分析与AI丨PLC 开发效率革命:AI 多智能体加速 ST 语言开发

Altair RapidMiner

人工智能 AI 数据分析 制造业 RapidMiner

第七届地球科学与遥感测绘国际学术会议(GRSM 2025)

搞科研的小刘

学术会议 遥感技术 乌鲁木齐

领百万Token福利!华为开发者空间 Versatile Agent自定义接入华为云MaaS全指导

华为云开发者联盟

MaaS 华为开发者空间 Versatile Agent.

互动LED地砖屏:沉浸式娱乐

Dylan

LED LED display 零售电商市场 舞台表演 LED屏幕

鲲鹏 DevKit 实战!华为开发者空间演示 C/C++ 源码迁移

华为云开发者联盟

鲲鹏 DevKit 华为开发者空间

CST软件如何用远场探针验证RCS探针结果

思茂信息

cst CST软件 CST Studio Suite

大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进

武子康

Java 大数据 flink spark 分布式

黑客劫持:周下载量超20+亿的NPM包被攻击

掘金安东尼

语音合成接口实战!华为开发者空间玩转 CodeArts 工具链

华为云开发者联盟

CodeArts 华为开发者空间

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