在这个采访中,我们跟开源开发者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

中文原文:http://www.infoq.com/cn/news/2014/06/Keepass2Android

采访Philipp Crocoll:安卓平台上整合Java和C#的更多相关文章

  1. phongap开发中安卓平台上如何调用第三方播放器来播放HLS视频

    前文曾经讲了关于在安卓平台上利用phonegap开发播放HLS的解决方案,其实最好的方案就是自己针对HLS视频开发自己的播放器,但是开发播放器是一个浩大的工程,必须对原生安卓开发非常熟悉,并且对视频播 ...

  2. 如何在国产龙芯架构平台上运行c/c++、java、nodejs等编程语言

    高能预警:本文内容过于硬核,涉及编译器原理.cpu指令集.机器码.编程语言原理.跨平台原理等计算机专业基础知识,建议具有c.c++.java.nodejs等多种编程语言开发能力,且实战经验丰富的资深开 ...

  3. 关于使用jqmobi前端框架在phonegap平台上开发时的日期时间选择控件

    jqmobi(appframework)作为Intel的一款html5移动前端框架,以其自身轻量级和容易上手获得了很多移动HTML5开发者的喜爱,相对于jquerymobile,它可以说将jQuery ...

  4. 使用JavaScript调用手机平台上的原生API

    我之前曾经写过一篇文章使用Cordova将您的前端JavaScript应用打包成手机原生应用,介绍了如何使用Cordova框架将您的用JavaScript和HTML开发的前端应用打包成某个手机平台(比 ...

  5. 关于如何在Android、Java等非微软平台上建立高信任的SharePoint应用程序

    关于如何在非微软平台上建立高信任的SharePoint应用程序 原文 :http://blogs.msdn.com/b/kaevans/archive/2014/07/14/high-trust-sh ...

  6. JAVA平台上的网络爬虫脚本语言 CrawlScript

    JAVA平台上的网络爬虫脚本语言 CrawlScript 网络爬虫即自动获取网页信息的一种程序,有很多JAVA.C++的网络爬虫类库,但是在这些类库的基础上开发十分繁琐,需要大量的代码才可以完成一 个 ...

  7. JMS(Java平台上的专业技术规范)

    JMS(Java平台上的专业技术规范) 编辑   jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...

  8. phonegap与微信开放平台接口整合

    在开发phonegap应用的过程中有个需求需要将应用的消息推送到微信上.于是我自己写了一个微信的phonegap插件,并成功整合进了应用. 插件地址:https://github.com/ajccom ...

  9. 在Unity3D中实现安卓平台的本地通知推送

    [前言] 对于手游来说,什么时候需要推送呢?玩过一些带体力限制的游戏就会发现,我的体力在恢复满后,手机会收到一个通知告诉我体力已完全恢复了.这类通知通常是由本地的客户端发起的,没有经过服务端. 在安卓 ...

随机推荐

  1. 开发日志_Jan.6.2017

    Github Jan.2 接到了汤松岩的GUI框架,开始复习和学习C++的使用方法(之前的开发经历主要使用的Java,对C++和QT环境都需要一个再了解). Jan.3 正式开始工作.开始在Ubunt ...

  2. mysql的查询、子查询及连接查询

    >>>>>>>>>> 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组). ...

  3. Android Studio中获取SHA1或MD5的方法

    原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studi ...

  4. tomcat的安全配置(禁用http方法,部署多个应用,启用从安全cookie,指定错误页面和显示信息)

    配置版本:tomcat6 1,虚拟路径,可以配置多个host在一个tomcat中,docbase是web应用目录,此处在server.xml中添加应用配置,要让server.xml配置生效需要重启to ...

  5. 转:学习笔记: Delphi之线程类TThread

    学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...

  6. java MD5 32位加密

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 ...

  7. 工厂模式(Factory)

    一.分类 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式主要分为三个,简单工厂模式(Simple Factory)/ 工厂方法模式(Fac ...

  8. Git Commands Quick Notes

    Fetch This command is to make sure your local repository has the same knowledge of the remote-tracki ...

  9. linux菜鸟日记(3)

    Centos7利用shell编辑一串 一键完成一些基础配置的代码: 在这串shell代码中我实现了  IP地址的配置.光盘的挂载.本地yum源的搭建.一些服务的安装例如 httpd. php. ntp ...

  10. bzoj1051Tarjan裸题

    tarjan缩点+判断出度为0的点 所以不需要新建边 #include <cstdio> ,time=,T=,sum=,ans=; ],to[],nex[],fir[],dfn[],low ...