2012-05-18 40 views
2

我試圖將由多個Android「服務」使用的Java庫分隔成動態或共享庫,可以由這些獨立服務加載而無需庫包含在每項服務的APK中。動態鏈接到Android中的共享Java庫

我知道有這樣做有不同的方式,如創建一個Android服務或使用DexLoader和反射,但我試圖避免更改庫的來源。相反,我試圖構建它並將其安裝在我的設備上(實質上是擴展了提供的android API)。

下面是一個非常類似的問題是仍未得到解決: Create Android apps in Eclipse sharing common library

我知道這是什麼谷歌並不想透露這樣查找信息網上是非常困難的。

到目前爲止,我已經嘗試在框架目錄下放置一個簡單的「Hello World」程序,並構建它,它爲我的程序成功創建了一個jar。然後我說我的包在產品/ core.mk,另外加入我的包定義下的API/10.xml之後,我跑了「讓SDK」,這導致了以下錯誤消息:

****************************** 
You have tried to change the API from what has been previously released in 
an SDK. Please fix the errors listed above. 
****************************** 
make: *** [out/target/common/obj/PACKAGING/checkapi-last-timestamp] Error 38 

作爲一種變通方法我將我的軟件包添加到out目錄中的「public_api.xml」文件中,該目錄在構建過程中以某種方式動態創建。有了這個解決方法,SDK就沒有錯誤地構建了(儘管如果我再次執行清理,我將不得不再次修改public_api.xml,因爲它會因清理而被刪除)。但是,當我嘗試導入並在任何地方使用我的軟件包時,仍然會說我的軟件包「不存在」

任何幫助將不勝感激!謝謝!

+0

爲什麼不在應用程序中使用AIDL for RPC? –

+0

如果您的軟件包因​​爲不是官方API列表的一部分而被忽略,那麼您可能需要在構建配置中找到該列表並添加它。包含一些小事的名稱的遞歸grep可能會幫助您找到您尚未添加的位置。但是,你真的想這樣做嗎?框架修改只適用於運行您自定義的android版本的設備。 –

+0

@KristopherMicinski - 我試圖避免源代碼修改,並試圖調查這種特定的方法。克里斯 - 我的設備正在運行我自己定製的android版本,所以我很好。是的,正是我想要在構建配置中找到的,但Google正在讓它很難做到。 – HerpDerp

回答

2

終於明白了。解決方案變得非常簡單!

將您庫中框架/基文件夾,並確保您的所有源代碼裏面是java目錄下,像這樣:

../frameworks/base/HelloWorld/java/<source files and folders> 

編輯core.mk位於下編譯/目標文件/ product/將您的軟件包包含在列表中。這將HelloWorld的庫添加到框架:

PRODUCT_PACKAGES := \ 
    bouncycastle \ 
    : 
    : 
    DefaultContainerService \ 
    Bugreport \ 
    HelloWorld 

編輯pathmap.mk下的文件構建/核心/位於包括您在列表目錄。這會將HelloWorld庫添加到android.jar中

FRAMEWORKS_BASE_SUBDIRS := \ 
    $(addsuffix /java, \ 
     core \ 
     graphics \ 
     location \ 
     media \ 
     opengl \ 
     sax \ 
     telephony \ 
     wifi \ 
     vpn \ 
     keystore \ 
     voip \ 
     HelloWorld \ 
    ) 

完成。重建android,它不應該抱怨,並將您的庫添加到framework.jar

我希望這會有所幫助。