2013-02-04 33 views
8

Tôi đã cố gắng thêm APK dựng sẵn vào bản dựng Android của mình. APK chứa một số thư viện được chia sẻ (* .so files). Nó biên dịch mà không có vấn đề, nhưng tôi vẫn nhận được một lỗi từ ứng dụng chỉ ra rằng các thư viện không thể được tìm thấy.Lỗi khi thêm gói dựng sẵn với thư viện được chia sẻ vào AOSP

Tại sao điều này có thể?

Đây là mã android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := apkwithso 
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk 
LOCAL_REQUIRED_MODULES := libx liby libz 
LOCAL_MODULE_CLASS := APPS 
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) 
LOCAL_CERTIFICATE := PRESIGNED 
include $(BUILD_PREBUILT) 

libx, y, z là libx.so tôi, liby.so, và libz.so

Tôi cũng đã cố gắng để sao chép các .so bằng tay từ APK vào các thư mục lib ra nhưng nó không hoạt động.

Tôi đang biên dịch bằng Android 4.1.2 cho Galaxy Nexus Maguro.

Trả lời

6

BUILD_PREBUILT gọi prebuild.mk tập lệnh. Mô tả của tập lệnh này là như sau:

Standard rules for copying files that are prebuilt

Nó không cho biết ứng dụng sẽ được cài đặt. Vì vậy, tôi nghĩ rằng đó là lý do tại sao ứng dụng của bạn không thể tìm thấy các thư viện.

Giải pháp là trích xuất các thư viện từ gói và sao chép chúng riêng biệt khỏi ứng dụng. Các chi tiết làm thế nào để làm điều này bạn có thể tìm thấy here.

+0

Cảm ơn, đó là những gì tôi đang tìm kiếm, – Cattivo

+0

Không hề! Tôi rất vui vì tôi có thể giúp bạn!) – Yury

+1

Khi bạn sử dụng 'BUILD_PREBUILT', bạn nên chỉ định rõ ràng' LOCAL_MODULE_CLASS' hoặc 'LOCAL_MODULE_PATH' (trích dẫn từ Embedded Android). – pevik

1

tập tin cũng có thể được được quy định trong định dạng aospSource:destinationOnImage như thế này trong device-partial.mk khi thêm một thư mục nhà cung cấp tùy chỉnh:

PRODUCT_COPY_FILES += \ 
    vendor/your-custom-vendor/your-device/proprietary/libx.so:system/lib/libx.so 

Bạn có thể thêm khá nhiều bất cứ điều gì bạn muốn ở đây (trừ các file .apk), và nó sẽ được sao chép vào hình ảnh của bạn.

15

Tôi đã có vấn đề này bản thân mình, lý do là khi các tập tin APK được bao gồm trong một xây dựng họ về cơ bản là bỏ qua quá trình cài đặt. Quá trình cài đặt này là điểm mà tại đó bất kỳ thư viện được chia sẻ nào được trích xuất từ ​​gói ứng dụng và đặt ở vị trí thích hợp, nếu điều đó không bao giờ xảy ra thì các thư viện sẽ không có sẵn. Điều này là do các gói được xây dựng từ nguồn trong quá trình xây dựng AOSP hoặc có sẵn các thư viện được dựng sẵn trong quá trình xây dựng hoặc thư viện của chúng cũng được xây dựng từ nguồn và trong trường hợp các thư viện đó được đặt ở vị trí thích hợp.

Vì lý do này, thêm vào các module apk bản thân bạn nên thêm như sau trong file .mk cùng:

include $(CLEAR_VARS) 
LOCAL_MODULE := libapkwithso 
LOCAL_SRC_FILES := lib/libapkwithso.so # or wherever your so is 
LOCAL_MODULE_TAGS := optional 
LOCAL_MODULE_SUFFIX := .so 
LOCAL_MODULE_CLASS := SHARED_LIBRARIES 
include $(BUILD_PREBUILT) 

Sau đó thêm:

LOCAL_REQUIRED_MODULES := libapkwithso 
+0

Xin chào Justin, Cách thêm nhiều tệp .so, nếu gói ứng dụng chứa nhiều thư viện. –

+0

@VikashKumar Bạn phải tạo một khối BUILD_PREBUILT giống như vậy cho mỗi .so. Chỉ cần nhớ gọi 'include $ (CLEAR_VARS)' ở đầu mỗi khối. –

+0

Bản dựng của chúng tôi sử dụng APK dựng sẵn với mô-đun gốc. Cho phép gọi foo.apk này bao gồm libbar.so mô-đun cục bộ. APK của chúng tôi được lấy từ thư mục "system_apps" trong cây nguồn. Chúng tôi kiểm tra mã nguồn thay vì mã nguồn của APK. Logic này yêu cầu tôi kiểm tra trong thư viện gốc và gói ứng dụng, nhưng gói ứng dụng đã có thư viện gốc. Vì vậy, giải pháp này đã không làm việc cho tôi. Hay tôi đang làm gì sai? Tôi muốn thư viện được kéo từ APK và đưa vào đúng vị trí tại thời điểm xây dựng. Nó dường như không làm điều đó. – Cookster

0

Quá thêm nhiều thư viện để một gói ứng dụng một phần bổ sung (như trong câu trả lời của Justin Buser) nên được thêm vào cho mỗi thư viện riêng biệt.

+0

Câu trả lời này cho câu hỏi về [Vikash Kumar] (http://stackoverflow.com/users/835757/vikash-kumar) – Michael

0

Hướng dẫn của tôi không phải về lỗi của bạn!Nhưng nó có thể hữu ích cho lỗi tương tự

Nếu bạn cố gắng sao chép apk dựng sẵn sử dụng:

PRODUCT_COPY_FILES += $(LOCAL_PATH)/prebuilt/filename.apk 

và bạn nhận được lỗi này:

Prebuilt apk found in PRODUCT_COPY_FILES: ... , use BUILD_PREBUILT instead!. Stop. 

Bạn có thể loại bỏ việc kiểm tra này my sửa đổi các tập tin build/core/MakeFile và nhận xét dòng này:

define check-product-copy-files 
$(if $(filter %.apk, $(call word-colon, 2, $(1))),$(error \ 
    Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!)) 
endef 

bằng cách chèn # trước mỗi dòng

Các vấn đề liên quan