2010-04-07 41 views
2

在本地開發中,您可以生成其他庫和程序可以共享的庫 - .so,.dll等。Android上的libriaries

在Java中,您可以將代碼放在類路徑中的JAR中,其他程序和庫可以使用它。

那麼如何在Android中執行模塊化程序?我從文檔中得到了每個APK都是一個獨立島的印象。不同的APK可以共享代碼嗎?

當你有這些外部依賴關係時,安裝如何工作?你能否指定你依賴不在APK中的庫並安裝它?

如果你不能有'動態鏈接',你可以通過開發你的共享代碼來'靜態鏈接',並以某種方式將每個APK的相應部分放入需要它的每個APK中?

回答

2

關於靜態鏈接,您可以使用標準Java方式使用.jar文件在Android應用程序之間共享代碼。但是,您目前無法使用Android資源系統(「res」目錄下的內容和'R'類),這些內容在某種程度上扼殺了控制庫的想法。它還使得使用本地化的字符串變得不可能,並且你不能擁有應用程序或服務定義,或者在AndroidManifest.xml中聲明的任何東西。

關於動態鏈接,有一種庫作爲.apk本身在Market中分發,並在運行時動態包含。許多開發人員不願意問他們的用戶安裝兩個.apks。這種方法確實會導致用戶混淆。

+0

你能更多地解釋動態鏈接是如何工作的,或者給出一些可以用Google搜索的關鍵字? – Will 2010-04-07 10:17:23

+0

這是一個非常合理的問題,但我會說實話,我很難找到這種技術的資源。我知道這是可以做到的,因爲它是通過市場庫(如Text-To-Speech)完成的:http://code.google.com/p/eyes-free/ – 2010-04-07 10:51:19

+0

嗯,所以它有一個靜態庫存根可能通過APK公開的服務使用主APK中的功能。這是我目前使用的方法,這是我試圖找到替代方法;) – Will 2010-04-07 11:27:58

0

您可以像Jim Blackler所說的那樣在.jar文件中創建一個庫,而不是使用類的全名從類實例化。在java中,這非常簡單,可以用來使開發非常靈活。

這裏的示例:

Ç被包含在一個叫做com.test.utils包所以它的完整路徑是:com.test.utils.C。現在,如果你想從任何其他地方作出的Ç實例使用的Class.forName()方法至極的工作原理是這樣的:在帳戶

// Try to create an instance of class 'com.test.utils.C' 
try { 
    Object instance = Class.forName("com.test.utils.C").newInstance(); 
} catch (IllegalAccessException e) { 
    e.printStackTrace(); 
} catch (InstantiationException e) { 
    e.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

接受你的類需要至少一個空構造函數如果不是,你會發生異常。

+0

如果你這樣做,你如何調用方法等? – Will 2010-04-07 15:12:03

+0

您可以訪問該類並使用getMethods()遍歷它的方法。這裏是一個例子:http://groups.google.com/group/android-developers/browse_thread/thread/7a6bf77910ca31e0 – Moss 2010-04-07 21:32:21

0

下面是使用Class.forName()工作的完整示例:

try { 
    for (Method ele: Class.forName("<MyClassPath>").getMethods()) 
    { 
     try { 
      if (ele.getName().equals("<MyMethod>")) 
       ele.invoke(null, ArgumentList); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
    } 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

在這裏您可以找到有關invoke方法的詳細信息:http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#invoke(java.lang.Object,java.lang.Object中[])

+0

雙重答案,並在android-ouch上使用e.printStackTrace()。 – Will 2010-04-09 11:43:47

+0

我做了另一個答案,因爲有評論字符限制:D除了它只是示例代碼... – Moss 2010-04-09 12:35:12