在這個采訪中,我們跟開源開發者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
文章列表