7

Tôi muốn thêm một số tính năng vào ứng dụng Trình duyệt bằng cách bắt đầu một hoạt động từ một ứng dụng Android khác. Nó mang lại cho tôi package does not exist trong khi tôi thực hiện Dự án Chính. Chú ý rằng tôi thấy AndroidLib được xây dựng thành công vào một out/target/product/generic/data/app/AndroidLib.apkThêm một dự án android làm thư viện trong AOSP App

Dưới đây là hai tập tin android.mk: AndroidLib (một Android App bình thường)

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)) 

Trình duyệt App

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)) 

Sau đó, tôi làm:

make -j Browser 

Nó mang lại cho tôi:

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

bạn đã tuyên bố tất cả các hoạt động của dự án Thư viện vào dự án chính của Manifest với có gói name.And cũng kiểm tra các pac tên kage decalred trong tệp kê khai của dự án thư viện của bạn. – Meenal

+0

@MeenalSharma: Tôi nghĩ rằng nó sẽ giống như khi bạn đang sử dụng Eclipse và định nghĩa A làm Thư viện, sau đó Thêm thư viện vào Dự án Chính. Tôi có cần phải sao chép tuyên bố của A Lib vào Dự án Chính không? –

+0

có bạn phải sao chép bởi vì bạn chạy dự án chính của bạn và không phải là thư viện, và khi acitivity của dự án thư viện được gọi là nó được acessed từ dự án chính. – Meenal

Trả lời

13

Cập nhật

Về cơ bản vấn đề của bạn là dòng:

LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib 

Cho Android xây dựng mà trình duyệt của bạn phụ thuộc vào AndroidLib được xây dựng đầu tiên, tuy nhiên nó sẽ không được liên kết với AndroidLib theo bất kỳ cách nào. Để làm điều đó bạn cần:

LOCAL_JAVA_LIBRARIES := AndroidLib 

Ngoại trừ việc đòi hỏi sự AndroidLib là một dự án thư viện java, sử dụng kiểu build:

include $(BUILD_JAVA_LIBRARY) 

Và thư viện java không thể bao gồm các nguồn lực, không may. Và không có cách nào để liên kết một ứng dụng với một ứng dụng khác trong hệ thống xây dựng Android.

Chúng tôi đang làm việc xung quanh vấn đề đó thường xuyên, và thực sự là một chút lộn xộn để làm như vậy. Nhưng giải pháp duy nhất mà chúng tôi đã tìm thấy là bao gồm tất cả các tài nguyên trực tiếp trong các ứng dụng sử dụng các tài nguyên đó. Lấy làm tiếc.


Làm thế nào để làm cho bạn AndroidLib một thư viện java và liên kết với nó

lib android của bạn có lẽ nên được xây dựng như một thư viện java, và không phải là một gói phần mềm ứng dụng. Vì vậy, thay vì:

include $(BUILD_PACKAGE) 

Bạn có lẽ nên làm:

include $(BUILD_JAVA_LIBRARY) 

Sau đó, bạn lib sẽ được đặt trong out/target/product/generic/system/framework/AndroidLib.jar cùng với libs hệ thống khác.

Ngoài ra, bạn không cần LOCAL_MODULE_NAME cho một thư viện, nó chỉ áp dụng cho một ứng dụng. Vì vậy, dải đó.

Và có lẽ bạn nên xem xét thay đổi của bạn LOCAL_MODULE_TAGS tới:

LOCAL_MODULE_TAGS := user 

tests chỉ ra rằng bạn lib chỉ nên được xây dựng để thử nghiệm, user nói để xây dựng bạn lib cho tất cả người sử dụng xây dựng (và ngầm cũng cho kỹ thuật xây dựng)


Trong bạn app Android.mk thì bạn nên thêm một dòng:

LOCAL_JAVA_LIBRARIES := AndroidLib 

Vì vậy, ứng dụng của bạn sẽ được xây dựng với AndroidLib trong đường dẫn lớp.


Trong bạn ứng dụng AndroidManifest.xml bạn cũng cần phải đặt một sử dụng thư viện trong application tag:

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

Và cuối cùng bạn cần phải tạo ra một tập tin cho phép xml, với các nội dung sau đây:

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

Và cập nhật tệp cấu hình sản phẩm của bạn sao cho tệp xml sẽ là được triển khai để nhắm mục tiêu:

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

Thay thế device/XXX/libs/ bằng đường dẫn đến tệp xml quyền.


Đây là cách chúng tôi thêm và sử dụng thư viện Android trong bản dựng Android của chúng tôi. Tôi hy vọng nó sẽ giúp. :)

+0

Tôi nghĩ rằng tôi đã không làm cho nó rất rõ ràng cho bạn. Lib android thực sự là một dự án Android có tài nguyên riêng. Tôi đã làm theo hướng dẫn của bạn và tôi không tìm thấy nhiều tài nguyên R. Tôi đã nhìn vào bên ngoài/[thư viện] và tôi thấy họ đang làm khá giống với những gì bạn đang nói nhưng họ là tất cả thuần Java Java mà không thực sự là trường hợp ở đây. –

+2

Có hai loại thư viện Android liên quan. Có loại dự án thư viện mà bạn có thể tạo (ví dụ: trong Eclipse) khi bạn đang tạo các ứng dụng của bên thứ ba. Chúng sẽ được biên dịch vào tất cả các ứng dụng sử dụng chúng. Nhưng khi bạn xây dựng hệ điều hành Android từ nguồn, không có khái niệm về dự án thư viện android. Tuy nhiên, có các thư viện java sẽ được cài đặt trên mục tiêu dưới dạng tệp jar. Nhưng họ không thể chứa tài nguyên, thật không may. Bạn sẽ phải bao gồm các tài nguyên bạn cần trực tiếp trong ứng dụng chứ không phải lib, đó là cách duy nhất nó sẽ hoạt động. Lấy làm tiếc. –

+0

@CuongThai: Xem câu trả lời cập nhật của tôi. –

4

Tôi biết tôi đang đào nó ra khỏi mộ một chút, nhưng chưa bao giờ thực sự là câu trả lời cho cách thực sự bao gồm Dự án thư viện Android (hoặc các gói ứng dụng khác với tài nguyên) trong AOSP ứng dụng.

Đây là những gì tôi đã làm với hai dự án. "main" là ứng dụng chính tôi đang xây dựng gói ứng dụng cho. "util" là một thư viện tiện ích với các tài nguyên mà tôi đang liên kết. Cả hai dự án cư trú ở bên ngoài/seabold/{gói}:

Android.mk trong seabold/

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) 



Android.mk trong seabold/main/

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) 

Hãy cẩn thận ở đây để làm chắc chắn bạn fiddle với tên tập tin một cách chính xác. Đối với tôi, các tệp được xác định trong UTIL_JAVA_SRC có dạng util/src/com/seabold/util/*.java. Kể từ khi, kịch bản xây dựng cho ứng dụng chính mong đợi các tệp java là các đường dẫn tương đối đến vị trí của Android.mk, tôi đang thêm một ../ để truy cập đúng vào đường dẫn của thư viện util.

Khóa cho tài nguyên là LOCAL_AAPT_FLAGS. Điều này nói với trình đóng gói tài nguyên để đảm bảo nó tạo ra một R.java cho gói trong thư viện tiện ích.Nếu không có điều này, tất cả các tài nguyên của tiện ích sẽ được đưa vào các ứng dụng chính R.java, và các lớp tiện ích sẽ không biên dịch được vì R.java của nó sẽ bị thiếu.

0

Để thêm một file jar pre-build để khuôn khổ tôi đã làm điều đó:

  1. Xác định vị trí một thư mục với jar và file Android.mk dưới

    prebuilds/misc/common/

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) 
  1. Run thực hiện trên file Android.mk: make prebuilds/misc/common/Android.mk

  2. Thêm file jar vào khung/cơ sở/dịch vụ/Android.mk:

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