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;
Author: Cuong Thai, 2013-08-22

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

 13
Author: Bjarke Freund-Hansen,
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.

 4
Author: Matt Seabold,
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:

  1. 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) 
  1. Run make on the Android.mk plik: make prebuilds/misc/common/Android.mk

  2. Dodaj plik jar do Framework/base / services / Android. mk:

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

 0
Author: Yahavw,
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