Android中aidl如何import檔案

來源:互聯網
上載者:User

 

如果你做Android開發,那就應該會知道aidl工具的,但是會使用aidl命令列工具的人有嗎有嗎有嗎,如果有的話你們為神馬不出來寫寫怎麼用!!!!

用aidl命令列的如果不出意外肯定會遇見類似這樣的錯誤

$ aidl IRemoteServiceCallback.aidl<br />IRemoteServiceCallback.aidl:19: couldn't find import for class android.location.Location 

 

 

遇到錯誤,自然要先看下aidl的協助是怎麼寫的

$ aidl<br />usage: aidl OPTIONS INPUT [OUTPUT]<br /> aidl --preprocess OUTPUT INPUT...<br />OPTIONS:<br /> -I<DIR> search path for import statements.<br /> -d<FILE> generate dependency file.<br /> -p<FILE> file created by --preprocess to import.<br /> -o<FOLDER> base output folder for generated files.<br /> -b fail when trying to compile a parcelable. 

 

 

看到如此簡潔不明了的介紹你有何感想?

多寫一句會死啊!!!我討厭這種假人,以為開發Android的人理解能力都很強嗎,不僅help此般不負責任,tutorial也是如此,只有一句

Add the .aidl file to your makefile - (the ADT Plugin for Eclipse manages this for you). Android includes the compiler, called AIDL, in the tools/ directory. 


讓我們來一步步解決這個豬血問題

當文檔不能幫你的時候,看Android代碼吧。如何擷取代碼,Google的文檔寫的很清楚,其實Google大部分的文檔都還是夠明了的TAT

以下ANDROID代表android代碼樹的根

ANDROID/frameworks/base/tools/aidl裡是aidl工具的C++代碼,我沒從中獲得有用資訊。或許很可能是我對C++代碼不太有感。。。

一炮打不響就換一個洞,既然Eclipse可以處理aidl檔案,我就來上Eclipse的Android外掛程式ADT吧。aidl相關的檔案是這個

ANDROID/sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/PreCompilerBuilder.java 

你問我如何找到的嗎?Linux上的經典工具要經常用才能算是經典

$ grep -ri aidl Android/android-source/sdk/eclipse/plugins/com.android.ide.eclipse.adt/ 

880行有一個private boolean handleAidl函數,看名字就是這地方了。一路摸下去,直到890行

command[index++] = "-p" + Sdk.getCurrent().getTarget(getProject()).getPath( //$NON-NLS-1$<br /> IAndroidTarget.ANDROID_AIDL); 

看到嗎,在這兒發現了-p參數,但還不知道它是什麼,順著此條代碼追蹤,我們找到了這樣一個檔案

ANDROID/sdk/sdkmanager/libs/sdklib/src/com/android/sdklib/IAndroidTarget.java 

現在找到30行,我們終於知道,原來這個-p所指的file created by --preprocess to import就是一個名叫framework.aidl的檔案

/** OS Path to the "framework.aidl" file. */<br /> public final static int ANDROID_AIDL = 2; 

哈哈,讓我來驗一驗你的真身!!!

$ find Android/android-sdk-linux_86/ -name framework.aidl<br />Android/android-sdk-linux_86/platforms/android-3/framework.aidl<br />Android/android-sdk-linux_86/platforms/android-4/framework.aidl<br />Android/android-sdk-linux_86/platforms/android-6/framework.aidl<br />... 

這個framework.aidl檔案也很腦殘,雖說注釋不是很重要,但是這個代碼根本就沒有半點鐘自我解釋能力,也不寫個注釋說明自己有什麼用途--

到此,-p參數確認

革命遠未結束,要想解決這個豬血問題,還要知道-I參數的寫法。

繼續看上面PreCompilerBuilder.java檔案的896行

for (IPath p : sourceFolders) {<br /> IFolder f = wsRoot.getFolder(p);<br /> command[index++] = "-I" + f.getLocation().toOSString(); //$NON-NLS-1$<br />} 

我想你能看出這是什麼意思來了,就是你項目的source目錄,一般來說是src那個目錄

至此,問題解決,最後總結下使用aidl命令列工具的方法就是

$ aidl -I/path/to/project/src -p/path/to/framework.aidl Interface.aidl 

謝謝國家,打完收工

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.