写点什么

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

评论

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

开发者有话说|我想给你讲一个故事

石云升

个人成长 9月月更

第56届世乒赛团体赛开幕!三思近900㎡ LED显示点燃赛事激情

电子信息发烧客

OptaPlanner场景和示例

积木编程

工业4.0时代IIoT存储面临哪些挑战

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

《MySQL入门很轻松》第5章:数据完整性及其分类

乌龟哥哥

9月月更

产品的帮助中心怎么建设?关于编辑帮助文档的几个小技巧~

Baklib

给你一本武林秘籍,和KeeWiDB一起登顶高性能

腾讯云数据库

redis 腾讯云 NoSQL 数据库 腾讯云数据库 KeeWiDB

无线网络安全技术中的王牌标准:WPA到底是个什么东东?解决了什么问题?

wljslmz

网络安全 无线技术 9月月更 WAP

数据价值平台化输出:数据服务平台

小鲸数据

数据中台 接口管理 API接口管理 数据服务 数据服务平台

2022-09-30:以下go语言代码输出什么?A: true true false true false; B: true false false true false; C: true true

福大大架构师每日一题

14个你必须要知道的ubuntu快捷键

乌龟哥哥

9月月更

字符串哈希

留白的艺术

新品速递|海泰边缘安全网关护航工控数据采集

电子信息发烧客

Java中的悲观锁和乐观锁是什么意思?其分类依据是啥?

wljslmz

Java 乐观锁 悲观锁 9月月更

「产品运营」研发效能之DevOps平台如何运营?

laofo

DevOps cicd 研发效能 持续交付 工程效率

Python之斐波那契数列的实现

芯动大师

Python 9月月更 斐波那契数列

《MySQL入门很轻松》第4章:数据表中存放的数据类型

乌龟哥哥

9月月更

Spring Security 在 Servlet 的作用区域

HoneyMoose

部署华为云DWS过程

乌龟哥哥

9月月更

面试官问我 JS 中 foreach 能不能跳出循环

茶无味的一天

JavaScript js foreach for

Databricks Data Science&Engineering模块介绍

Jackchang234987

大数据 数据产品经理 数据产品 大数据开发 Databricks

微信架构图

Johnny

#架构实战营

(WebFlux)004、WebFilter踩坑记录

编号94530

Spring Boot WebFlux Reactor3 WebFilter

Python之简易计算器的制作

芯动大师

Python 9月月更 简易计算器

Python之鸡兔同笼

芯动大师

9月月更 Python语法 鸡兔同笼

第1章:初识数据库与MySQL----数据库基本概念

乌龟哥哥

9月月更

《MySQL入门很轻松》第2章:MySQL管理工具介绍

乌龟哥哥

9月月更

打破线上社交“不可能三角”,语音社交可以做到既要、又要、还要

擎声科技

音视频 sdk 语音社交 实时互动 擎声Qtt

大数据开发应用场景解读

Jackchang234987

大数据 数据开发

leetcode 513. Find Bottom Left Tree Value 找树左下角的值 (简单)

okokabcd

LeetCode 数据结构与算法

极速体验SpringCloud Gateway

程序员欣宸

Java SpringCloud SpringCloud Gateway 9月月更

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