7

Chcę dodać niektóre funkcje do aplikacji przeglądarki, uruchamiając działanie z innej aplikacji na Androida. To daje mi package does not exist podczas gdy ja robię Główny Projekt. Zauważ, że widzę AndroidLib zbudowany jest z powodzeniem w out/target/product/generic/data/app/AndroidLib.apkDodaj jeden projekt android jako bibliotekę w aplikacji AOSP

Oto dwa android.mk pliki: AndroidLib (normalny Android app)

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

Przeglądarka aplikacji

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

Potem do:

make -j Browser 

To daje mi:

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

Czy zadeklarowane wszystkie działania Biblioteki projektu do głównego projektu Manifest z pakietu name.And tam również sprawdzić PAC Nazwa kage wymieniana w manifeście twojego projektu bibliotecznego. – Meenal

+0

@MeenalSharma: Myślę, że powinno to być takie samo, gdy korzystasz z Eclipse i zdefiniować A jako bibliotekę, a następnie Dodaj bibliotekę do głównego projektu. Czy muszę skopiować deklarację A Lib do głównego projektu? –

+0

Tak, musisz skopiować, ponieważ uruchamiasz główny projekt, a nie bibliotekę, a kiedy aktywna jest aktywność projektu biblioteki, jest ona pobierana z głównego projektu. – Meenal

Odpowiedz

13

Aktualizacja

Zasadniczo problem jest, że linia:

LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib 

opowiada Android zbudować że Twoja przeglądarka zależy AndroidLib buduje się pierwszy, jednak nie będzie ona związana AndroidLib w jakikolwiek sposób. Aby to zrobić trzeba:

LOCAL_JAVA_LIBRARIES := AndroidLib 

Tyle że wymaga AndroidLib za projekt biblioteki Java, przy użyciu typu build:

include $(BUILD_JAVA_LIBRARY) 

i biblioteki Java nie może zawierać zasoby, niestety. I nie ma możliwości połączenia jednej aplikacji z inną aplikacją w systemie kompilacji Androida.

Pracujemy nad tym problemem często i jest to po prostu trochę bałaganu, aby to zrobić. Ale jedynym rozwiązaniem, które znaleźliśmy, jest włączenie wszystkich zasobów bezpośrednio do aplikacji korzystających z tych zasobów. Przepraszam.


Jak zrobić AndroidLib biblioteki Java i link do niego

Android lib należy prawdopodobnie zbudowany jako biblioteki Java, a nie jako pakiet aplikacji. Więc zamiast:

include $(BUILD_PACKAGE) 

należy prawdopodobnie zrobić:

include $(BUILD_JAVA_LIBRARY) 

Wtedy lib zostaną umieszczone w out/target/product/generic/system/framework/AndroidLib.jar wraz z innymi bibliotekami systemowymi.

Nie potrzebujesz też LOCAL_MODULE_NAME dla biblioteki, dotyczy to tylko aplikacji. Więc rozbierz to.

I powinieneś rozważyć zmianę LOCAL_MODULE_TAGS do:

LOCAL_MODULE_TAGS := user 

tests oznacza, że ​​lib powinien być zbudowany tylko do testowania, user mówi budować ty lib dla buduje wszystko użytkownik (a pośrednio również dla technika buduje)


W ty app Android.mk należy następnie dodać linię:

Taka aplikacja będzie zbudowana z AndroidLib w ścieżce klas.


w tobie aplikacji AndroidManifest.xml trzeba także postawić wykorzystuje bibliotekę w application tagu:

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

i ostatni trzeba utworzyć plik uprawnienia xml, o następującej treści:

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

Zaktualizuj plik konfiguracyjny produktu tak, aby plik xml był wdrożony do celu:

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

Wymień device/XXX/libs/ ze ścieżką do pliku xml uprawnienia.


W ten sposób dodajemy i używamy biblioteki Androida w naszych kompilacjach Androida. Mam nadzieję, że to pomoże. :)

+0

Myślę, że nie wyjaśniłem tego zbyt dobrze. Biblioteka Androida to projekt Androida, który ma własne zasoby. Postępowałem zgodnie z twoją instrukcją i dostałem wiele zasobów R nie odnalezionych. Zajrzałem do zewnętrznych/[bibliotek] i widzę, że robią one całkiem podobne do tego, co mówisz, ale wszystkie są czystą Javą Lib, co nie ma tu miejsca. –

+2

Istnieją dwa powiązane rodzaje bibliotek Androida. Istnieje typ projektu biblioteki, który można utworzyć (np. W środowisku Eclipse) podczas tworzenia aplikacji innych producentów. Zostaną one skompilowane do wszystkich aplikacji, które ich używają. Ale kiedy budujesz system operacyjny Android ze źródła, nie ma takiej koncepcji projektu biblioteki Android. Istnieją jednak biblioteki java, które zostaną zainstalowane na komputerze docelowym jako pliki jar. Ale niestety nie mogą one zawierać zasobów. Będziesz musiał uwzględnić potrzebne zasoby bezpośrednio w aplikacji, a nie w bibliotece, która jest obecnie jedynym sposobem, w jaki będzie działać. Przepraszam. –

+0

@CuongThai: Zobacz moją zaktualizowaną odpowiedź. –

4

Wiem, że wykopię to trochę z grobu, ale nigdy nie było odpowiedzi na pytanie, jak właściwie uwzględnić projekt biblioteki Androida (lub inny apk z zasobami) w ramach zbudowanego AOSP podanie.

Oto, co zrobiłem z dwoma projektami. "main" to główna aplikacja, dla której buduję apk. "util" to biblioteka narzędziowa z zasobami, z którymi się łączę. Oba projekty znajdują się w zewnętrznej/seabold/{pakiet}:

Android.mk w 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 w 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) 

Należy tu uważać, aby pewnie poprawnie skrzypisz z nazwami plików. Dla mnie pliki zdefiniowane w UTIL_JAVA_SRC mają postać util/src/com/seabold/util/*.java. Ponieważ skrypt budujący dla głównej aplikacji oczekuje, że pliki java będą względnymi ścieżkami do lokalizacji Android.mk, dodaję ../, aby poprawnie przejść do ścieżki biblioteki użytkowej.

Kluczem do zasobów jest LOCAL_AAPT_FLAGS. To mówi pakowaczowi zasobów, aby upewnić się, że generuje R.java dla pakietu w bibliotece narzędzi.Bez tego wszystkie zasoby narzędzia zostaną umieszczone w głównych aplikacjach R.java, a klasy narzędziowe nie będą mogły się skompilować, ponieważ brakuje ich R.java.

0

Aby dodać plik jar Gotowy do ram zrobiłem, że:

  1. Zlokalizuj folder ze słoika i pliku Android.mk pod

    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 zrobić plik Android.mk: make prebuilds/misc/common/Android.mk

  2. dodać plik jar do ram/base/usług/Android.mk:

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

Powiązane problemy