在這個采訪中,我們跟開源開發者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
歡迎大家掃描下面二維碼成為我的客戶,為你服務和上雲
