Dodaj jeden projekt android jako bibliotekę w aplikacji AOSP
Chcę dodać kilka funkcji do aplikacji przeglądarki, uruchamiając aktywność z innej aplikacji na Androida. To daje mi package does not exist
podczas tworzenia głównego projektu. Zauważ, że widzę AndroidLib jest wbudowany pomyślnie w out/target/product/generic/data/app/AndroidLib.apk
Oto dwa android.mk pliki: AndroidLib (normalna aplikacja na Androida)
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))
Aplikacja Przeglądarki
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 robię:
make -j Browser
Daje mi:
packages/apps/Browser/src/com/android/browser/BrowserActivity.java:36: package com.om.AndroidLib does not exist
import com.om.AndroidLib.MainActivity;
3 answers
Update
Zasadniczo twój problem polega na tym, że linia:
LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib
Informuje kompilację Androida, że twoja przeglądarka zależy od tego, czy AndroidLib
zostanie zbudowana jako pierwsza, jednak nie będzie w żaden sposób połączona z AndroidLib
. Do tego potrzebujesz:
LOCAL_JAVA_LIBRARIES := AndroidLib
Poza tym, że wymaga AndroidLib
być projektem biblioteki java, używając typu build:
include $(BUILD_JAVA_LIBRARY)
I biblioteki Javy nie mogą zawierać zasobów, niestety. I nie ma sposobu, aby połączyć jedną aplikację do innej aplikacji w Android build system.
Pracujemy nad tym zagadnieniem często, i szczerze mówiąc jest to trochę bałagan, aby to zrobić. Ale jedynym obejściem, jakie znaleźliśmy, jest włączenie wszystkich zasobów bezpośrednio do aplikacji, które ich używają. Przepraszam.
Jak zrobić AndroidLib
bibliotekę Javy i link do niej
Twój Android lib powinien być prawdopodobnie zbudowany jako biblioteka java, a nie jako pakiet aplikacji. Więc zamiast:
include $(BUILD_PACKAGE)
Powinieneś do:
include $(BUILD_JAVA_LIBRARY)
Następnie lib zostanie umieszczony w out/target/product/generic/system/framework/AndroidLib.jar
wraz z innymi bibliotekami systemowymi.
Również nie potrzebujesz LOCAL_MODULE_NAME
dla lib, to ma zastosowanie tylko dla aplikacji. Więc rozbierz to.
I prawdopodobnie powinieneś rozważyć zmianę swojego LOCAL_MODULE_TAGS
na:
LOCAL_MODULE_TAGS := user
tests
oznacza to, że lib powinien być budowany tylko dla testów, user
mówi, aby budować lib dla wszystkich kompilacji użytkowników (i domyślnie także dla kompilacji inżynierskich)
W aplikacji Android.mk
powinieneś następnie dodaj wiersz:
LOCAL_JAVA_LIBRARIES := AndroidLib
Tak, że Twoja aplikacja będzie zbudowana z AndroidLib
w classpath.
W aplikacjach AndroidManifest.xml
należy również umieścić bibliotekę w tagu application
:
<uses-library android:name="AndroidLib" />
I na koniec musisz utworzyć plik XML z uprawnieniami o następującej treści:
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<library name="AndroidLib"
file="/system/framework/AndroidLib.jar"/>
</permissions>
I zaktualizuj plik konfiguracyjny produktu tak, aby plik xml został wdrożony do target:
PRODUCT_COPY_FILES += device/XXX/libs/AndroidLib.xml:system/etc/permissions/AndroidLib.xml
Zastąp {[23] } ścieżką do XML uprawnień plik.
W ten sposób dodajemy i używamy Biblioteki Androida w naszych kompilacjach Androida. Mam nadzieję, że to pomoże. :)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-03 11:20:24
Wiem, że wykopuję to trochę z grobu, ale nigdy nie było odpowiedzi na to, jak faktycznie dołączyć projekt biblioteki Androida (lub inny apk z zasobami) w aplikacji zbudowanej na AOSP.
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 linkuję. Oba projekty znajdują się w external / seabold / {package}:
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)
Bądź ostrożny, aby upewnić się, że poprawnie manipulujesz nazwami plików. Dla mnie pliki zdefiniowane w UTIL_JAVA_SRC
mają postać util/src/com/seabold/util/*.java
. Ponieważ skrypt kompilacji dla głównej aplikacji oczekuje, że pliki java będą względnymi ścieżkami do lokalizacji Android.mk
, dodaję ../ aby poprawnie dostać się do ścieżki biblioteki util.
Kluczem dla zasobów jest local_aapt_flags. To mówi menedżerowi zasobów, aby upewnił się, że generuje na R.java dla pakietu w bibliotece narzędzi. Bez tego wszystkie zasoby narzędzia zostaną umieszczone w głównych aplikacjach R.java, A klasy użytkowe nie będą kompilowane, ponieważ jego R.java zniknie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-08 22:06:28
Aby dodać wstępnie zbudowany plik jar do frameworka zrobiłem to:
-
Zlokalizuj folder ze słoikiem i Android.mk plik 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)
Run make on the Android.mk plik:
make prebuilds/misc/common/Android.mk
-
Dodaj plik jar do Framework/base / services / Android. mk:
LOCAL_STATIC_JAVA_LIBRARIES := $(addprefix services.,$(services)) jar-name
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-01 13:23:56