采访Philipp Crocoll:安卓平台上整合Java和C#
在这个采访中,我们跟开源开发者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 += ……”。
对于一些简单的接口,我还没有发现任何问题。如果你想要绑定一些复杂的库,通常需要按以下网页中的描述手工做些工作:
随着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
中文原文:http://www.infoq.com/cn/news/2014/06/Keepass2Android
采访Philipp Crocoll:安卓平台上整合Java和C#的更多相关文章
- phongap开发中安卓平台上如何调用第三方播放器来播放HLS视频
前文曾经讲了关于在安卓平台上利用phonegap开发播放HLS的解决方案,其实最好的方案就是自己针对HLS视频开发自己的播放器,但是开发播放器是一个浩大的工程,必须对原生安卓开发非常熟悉,并且对视频播 ...
- 如何在国产龙芯架构平台上运行c/c++、java、nodejs等编程语言
高能预警:本文内容过于硬核,涉及编译器原理.cpu指令集.机器码.编程语言原理.跨平台原理等计算机专业基础知识,建议具有c.c++.java.nodejs等多种编程语言开发能力,且实战经验丰富的资深开 ...
- 关于使用jqmobi前端框架在phonegap平台上开发时的日期时间选择控件
jqmobi(appframework)作为Intel的一款html5移动前端框架,以其自身轻量级和容易上手获得了很多移动HTML5开发者的喜爱,相对于jquerymobile,它可以说将jQuery ...
- 使用JavaScript调用手机平台上的原生API
我之前曾经写过一篇文章使用Cordova将您的前端JavaScript应用打包成手机原生应用,介绍了如何使用Cordova框架将您的用JavaScript和HTML开发的前端应用打包成某个手机平台(比 ...
- 关于如何在Android、Java等非微软平台上建立高信任的SharePoint应用程序
关于如何在非微软平台上建立高信任的SharePoint应用程序 原文 :http://blogs.msdn.com/b/kaevans/archive/2014/07/14/high-trust-sh ...
- JAVA平台上的网络爬虫脚本语言 CrawlScript
JAVA平台上的网络爬虫脚本语言 CrawlScript 网络爬虫即自动获取网页信息的一种程序,有很多JAVA.C++的网络爬虫类库,但是在这些类库的基础上开发十分繁琐,需要大量的代码才可以完成一 个 ...
- JMS(Java平台上的专业技术规范)
JMS(Java平台上的专业技术规范) 编辑 jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...
- phonegap与微信开放平台接口整合
在开发phonegap应用的过程中有个需求需要将应用的消息推送到微信上.于是我自己写了一个微信的phonegap插件,并成功整合进了应用. 插件地址:https://github.com/ajccom ...
- 在Unity3D中实现安卓平台的本地通知推送
[前言] 对于手游来说,什么时候需要推送呢?玩过一些带体力限制的游戏就会发现,我的体力在恢复满后,手机会收到一个通知告诉我体力已完全恢复了.这类通知通常是由本地的客户端发起的,没有经过服务端. 在安卓 ...
随机推荐
- html常用标签介绍
常用标签介绍 文本 最常用的标签可能是<font>了,它用于改变字体,字号,文字颜色. 点击查看效果 <font size="6">6</font&g ...
- SqlServer -- 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'T_FM_AMTFLOW'中的标识列指定显式值。
SET IDENTITY_INSERT TABLE_NAME ON; INSERT INTO TABLE_NAME(XXX, XXX,..., XXX) SELECT XXX, XXX,..., XX ...
- 闪回查询(SELECT AS OF)
使用Flashback Query的场景包括如下: 摘自官档 Recovering lost data or undoing incorrect, committed changes. For exa ...
- "Fatal error: Call to undefined function: file_put_contents()"
打开页面时提示这个错误: Fatal error: Call to undefined function: file_put_contents() 意思是请求未定义的函数,出现这个提示通常有两种情况: ...
- Express URL跳转(重定向)的实现
Express URL跳转(重定向)的实现 Express是一个基于Node.js实现的Web框架,其响应HTTP请求的response对象中有两个用于URL跳转方法res.location()和 ...
- 【CentOS】LAMP相关4
MySQL不支持TAB补全.mysql_history命令历史 用SOCKET形式登陆:mysql -uroot -p123456,mysql -uroot -p123456 -S /var/lib/ ...
- java中Class.forName("xxx")和ClassLoader().loadClass("xxx")的区别
一.首先,查看Class类中的forName方法,可以发现有如下三个方法,但是我们通常用的是只有一个参数的方法. 简单介绍一下这三个方法: 第一个方法Class.forName("xxx&q ...
- Http、Https请求工具类
最近在做微信开发,使用http调用第三方服务API,有些是需要https协议,通过资料和自己编码,写了个支持http和https的工具类,经验证可用,现贴出来保留,也供需要的人使用(有不足的地方,也请 ...
- tomcat的安全配置(禁用http方法,部署多个应用,启用从安全cookie,指定错误页面和显示信息)
配置版本:tomcat6 1,虚拟路径,可以配置多个host在一个tomcat中,docbase是web应用目录,此处在server.xml中添加应用配置,要让server.xml配置生效需要重启to ...
- ios 数据库存储json数据
NSData *data = [NSJSONSerialization dataWithJSONObject:info.bdata options:NSJSONWritingPrettyPrinted ...