7

我想通過從另一個Android應用程序啓動一個活動來將一些功能添加到瀏覽器應用程序中。它讓我package does not exist,而我做主項目。請注意,我看到AndroidLib成功建成一個out/target/product/generic/data/app/AndroidLib.apk在AOSP應用程序中添加一個Android項目作爲庫

這裏有兩個android.mk文件: AndroidLib(正常的Android應用程序)

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_STATIC_JAVA_LIBRARIES := \ 
     google-ps \ 
     android-support-v4 \ 

LOCAL_SRC_FILES := \ 
     $(call all-java-files-under, src) \ 
LOCAL_MODULE := AndroidLib 
LOCAL_PACKAGE_NAME := AndroidLib 

LOCAL_MODULE_TAGS := tests 

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := google-ps:libs/google-play-services.jar 

include $(BUILD_PACKAGE) 

# additionally, build tests in sub-folders in a separate .apk 
include $(call all-makefiles-under,$(LOCAL_PATH)) 

瀏覽應用程序

LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_MODULE_TAGS := optional 

LOCAL_STATIC_JAVA_LIBRARIES := \ 
     android-common \ 
     guava \ 
     android-support-v13 \ 
     android-support-v4 \ 

LOCAL_SRC_FILES := \ 
     $(call all-java-files-under, src) \ 
     src/com/android/browser/EventLogTags.logtags 

LOCAL_PACKAGE_NAME := Browser 

LOCAL_PROGUARD_FLAG_FILES := proguard.flags 

LOCAL_EMMA_COVERAGE_FILTER := *,-com.android.common.* 


# We need the sound recorder for the Media Capture API. 
LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib 

include $(BUILD_PACKAGE) 
# additionally, build tests in sub-folders in a separate .apk 
include $(call all-makefiles-under,$(LOCAL_PATH)) 

然後我做:

make -j Browser 

它給我︰

packages/apps/Browser/src/com/android/browser/BrowserActivity.java:36: package com.om.AndroidLib does not exist 
import com.om.AndroidLib.MainActivity; 
+0

有你聲明的庫項目到主項目清單與有包裝name.And所有活動也檢查PAC kage名稱在您的圖書館項目的清單中被剝奪。 – Meenal

+0

@MeenalSharma:我認爲它應該與使用Eclipse並將A定義爲庫時相同,然後將該庫添加到主項目中。我是否需要將A Lib的聲明覆制到主項目中? –

+0

是的,你必須複製,因爲你運行的是主項目而不是庫,當庫項目的活動被調用時,它是從主項目中獲取的。 – Meenal

回答

13

更新

本質的問題是該行:

LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib 

告訴了Android打造您的瀏覽器依賴於AndroidLib正在初建,但它不會被鏈接到AndroidLib以任何方式。要做到這一點,你需要:

LOCAL_JAVA_LIBRARIES := AndroidLib 

除了需要AndroidLib是一個Java庫項目,使用內建類型:

include $(BUILD_JAVA_LIBRARY) 

和Java庫不能包括資源,很遺憾。而且無法將一個應用程序鏈接到Android構建系統中的另一個應用程序。

我們經常在解決這個問題,坦白地說這樣做有點混亂。但是我們找到的唯一解決方法是將所有資源直接包含在使用這些資源的應用程序中。抱歉。


如何讓你的AndroidLib一個Java庫,並鏈接到它

你的Android LIB可能應該建成一個Java庫,而不是作爲一個應用程序包。 因此,而不是:

include $(BUILD_PACKAGE) 

你或許應該這樣做:

include $(BUILD_JAVA_LIBRARY) 

然後你LIB將與其他系統庫一起放入out/target/product/generic/system/framework/AndroidLib.jar

另外你不需要LOCAL_MODULE_NAME作爲一個庫,它只適用於一個應用程序。所以剝去它。

而且你或許應該考慮改變你的LOCAL_MODULE_TAGS到:

LOCAL_MODULE_TAGS := user 

tests表明您LIB應該僅用於測試將建成user說要建立你的LIB所有用戶構建(及隱含也爲工程構建)


在您應用程式Android.mk你應該再添加一行:

LOCAL_JAVA_LIBRARIES := AndroidLib 

這樣你的應用程序將在類路徑中使用AndroidLib構建。


在你的應用程序AndroidManifest.xml還需要放在application標籤的使用庫:

<uses-library android:name="AndroidLib" /> 

和最後你需要創建一個權限的XML文件,包含以下內容:

<?xml version="1.0" encoding="utf-8"?> 
<permissions> 
    <library name="AndroidLib" 
      file="/system/framework/AndroidLib.jar"/> 
</permissions> 

並更新您的產品配置文件,使xml文件將部署到目標:

PRODUCT_COPY_FILES += device/XXX/libs/AndroidLib.xml:system/etc/permissions/AndroidLib.xml 

device/XXX/libs/替換爲權限xml文件的路徑。


這就是我們在Android構建中添加和使用Android庫的方法。我希望它有幫助。 :)

+0

我想我沒有對你說得很清楚。 Android庫實際上是一個擁有自己資源的Android項目。我遵循你的指示,我找到了很多R資源。我研究過外部/ [庫],我發現它們與你所說的很相似,但它們都是純粹的Java Lib,在這裏並不是這樣。 –

+2

有兩種相關的Android庫。當您製作第三方應用程序時,您可以創建庫項目類型(例如在Eclipse中)。這些將被編譯到所有使用它們的應用程序中。但是當你從源代碼構建Android操作系統時,android庫項目沒有這樣的概念。但是,有一些java庫會以jar文件的形式安裝在目標上。但不幸的是,它們不能包含資源。您將不得不直接在應用程序中包含所需的資源,而不是lib,這是目前唯一可行的方法。抱歉。 –

+0

@CuongThai:看到我更新的答案。 –

4

我知道我從墳墓中挖掘了一點點,但從未真正回答過如何在構建的AOSP中實際包含Android Library項目(或其他apk 與資源)應用。

以下是我對兩個項目所做的工作。 「主」是我正在構建apk的主要應用程序。 「util」是一個實用程序庫,包含我正在鏈接的資源。這兩個項目的駐留在外部/ seabold/{包}:

在seabold Android.mk/

LOCAL_PATH := $(call my-dir) 

UTIL_PATH := $(LOCAL_PATH)/util 

UTIL_JAVA_SRC := $(call all-java-files-under, util/src) 

#Filter out if the util library isn't present 
UTIL_RES_DIR := $(wildcard $(UTIL_PATH)/res) 

include $(call all-subdir-makefiles) 



在seabold Android.mk /主/

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_PACKAGE_NAME := main 

LOCAL_MODULE_TAGS := optional 

LOCAL_SRC_FILES := $(call all-java-files-under, src) 

#Since the BUILD_PACKAGE makefile expects java files to be relative paths, 
#we need to add the ../ in front of each file (which is stored as relative 
#to seabold/ 
LOCAL_SRC_FILES += $(patsubst %.java,../%.java,$(UTIL_JAVA_SRC)) 

#Make sure both packages' resources are included 
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res $(UTIL_RES_DIR) 

#Since we are including resouces for two packages (This app and the util lib), 
#we need to tell aapt to generate an R.java for the util package as well 
LOCAL_AAPT_FLAGS := --generate-dependencies --extra-packages com.seabold.util --auto-add-overlay 

include $(BUILD_PACKAGE) 

這裏要小心,使確保你正確地擺弄文件名。對我而言,UTIL_JAVA_SRC中定義的文件格式爲util/src/com/seabold/util/*.java。因爲主應用程序的構建腳本需要Java文件作爲Android.mk位置的相對路徑,所以我添加了../以正確進入util庫的路徑。

資源的關鍵是LOCAL_AAPT_FLAGS。這會告訴資源包裝器確保它爲實用程序庫中的包生成R.java。如果沒有這個,所有的實用程序的資源將被放入主應用程序R.java中,並且實用程序類將無法編譯,因爲它的R.java將會丟失。

0

要構建預jar文件添加到框架我這樣做:

  1. 找到一個文件夾的罐子和下

    預構建/雜項/通用/

    的Android.mk文件

Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_MODULE := <jar name> 
LOCAL_MODULE_TAGS := optional 
LOCAL_SRC_FILES := <jar name>.jar 
LOCAL_MODULE_CLASS := JAVA_LIBRARIES 
LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX) 

include $(BUILD_PREBUILT) 
  • 運行使上Android.mk文件:make prebuilds/misc/common/Android.mk

  • 的jar文件添加到框架/鹼/服務/ Android.mk:

  • LOCAL_STATIC_JAVA_LIBRARIES := $(addprefix services.,$(services)) jar-name

    相關問題