7

Ich möchte einige Funktionen in Browser-App hinzufügen, indem Sie eine Aktivität aus einer anderen Android-Anwendung starten. Es gibt mir package does not exist während ich das Hauptprojekt mache. Beachten Sie, dass ich die AndroidLib sehen gebaut erfolgreich in eine out/target/product/generic/data/app/AndroidLib.apkHinzufügen eines Android-Projekts als Bibliothek in AOSP App

Hier sind zwei android.mk Dateien: AndroidLib (eine normale 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)) 

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

ich dann tun:

make -j Browser 

Es gibt mir:

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

Haben Sie alle Aktivitäten der Bibliotheksprojekt in den Hauptprojekt erklärt Manifest mit dort Paket name.And auch die pac überprüfen Kage-Name im Manifest Ihres Bibliotheksprojektes. – Meenal

+0

@MeenalSharma: Ich denke, es sollte das gleiche sein wie wenn Sie Eclipse verwenden und A als Bibliothek definieren, dann fügen Sie die Bibliothek zu Hauptprojekt hinzu. Muss ich die Erklärung von A Lib in das Hauptprojekt kopieren? –

+0

Ja, Sie müssen kopieren, weil Sie Ihr Hauptprojekt und nicht die Bibliothek ausführen, und wenn die Aktivität des Bibliotheksprojekts aufgerufen wird, wird es vom Hauptprojekt verarbeitet. – Meenal

Antwort

13

aktualisiert

Im Wesentlichen ist das Problem, dass die Zeile:

LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib 

Teilt der Android bauen, dass Ihr Browser auf AndroidLib hängt in erster Linie gebaut, aber es wird nicht zu verknüpfen AndroidLib in irgendeiner Weise. Um dies zu tun benötigen Sie:

LOCAL_JAVA_LIBRARIES := AndroidLib 

Abgesehen davon, dass die AndroidLib erfordert ein Java-Bibliothek-Projekt zu sein, mit dem Buildtyp:

include $(BUILD_JAVA_LIBRARY) 

und Java-Bibliotheken können keine Ressourcen enthalten, leider. Und es gibt keine Möglichkeit, eine App im Android-Build-System mit einer anderen App zu verknüpfen.

Wir arbeiten dieses Problem häufig, und es ist offen gesagt ein bisschen ein Chaos, dies zu tun. Die einzige Problemumgehung, die wir gefunden haben, besteht darin, alle Ressourcen direkt in die Apps zu integrieren, die diese Ressourcen verwenden. Es tut uns leid.


Wie Sie Ihre AndroidLib eine Java-Bibliothek und Link, um es sollte

Ihr Android-lib wahrscheinlich als Java-Bibliothek gebaut werden, um zu machen, und nicht als App-Paket. Also statt:

include $(BUILD_PACKAGE) 

Sie sollten wahrscheinlich tun:

include $(BUILD_JAVA_LIBRARY) 

Sie dann lib zusammen mit den anderen System Libs in out/target/product/generic/system/framework/AndroidLib.jar gestellt werden.

Auch brauchen Sie keine LOCAL_MODULE_NAME für eine lib, es gilt nur für eine App. Also strippe das aus.

Und Sie sollten wahrscheinlich betrachten, wenn Sie Ihre LOCAL_MODULE_TAGS zu:

LOCAL_MODULE_TAGS := user 

tests zeigt an, dass Sie lib nur zum Testen gebaut werden sollte, user sagt Ihnen aufzubauen lib für alle Benutzer erstellt (und implizit auch für Engineering baut

)

In Sie Android.mk App sollten Sie dann eine Zeile hinzu:

LOCAL_JAVA_LIBRARIES := AndroidLib 

So wird Ihre App mit AndroidLib im Klassenpfad erstellt.


In Ihrem Apps AndroidManifest.xml Sie auch verwendet Bibliothek im application Tag setzen müssen:

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

Und halten Sie eine Berechtigungs XML-Datei erstellen müssen, mit folgendem Inhalt:

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

Und aktualisieren Sie Ihre Produktkonfigurationsdatei, so dass die XML-Datei sein wird Ziel eingesetzt:

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

device/XXX/libs/ Ersetzen mit dem Pfad zu der XML-Datei Berechtigungen.


So fügen wir eine Android-Bibliothek in unsere Android-Builds ein und verwenden sie. Ich hoffe, es hilft. :)

+0

Ich glaube, ich habe es nicht klar für dich gemacht. Die Android-Bibliothek ist eigentlich ein Android-Projekt mit eigenen Ressourcen. Ich folgte Ihrer Anweisung und ich habe viele R Ressourcen nicht gefunden. Ich habe in externe/[Bibliotheken] geschaut und ich sehe, dass sie ziemlich ähnlich zu dem sind, was Sie sagen, aber sie sind alle reine Java Lib, was hier nicht wirklich der Fall ist. –

+2

Es gibt zwei verwandte Arten von Android-Bibliotheken. Es gibt den Bibliotheksprojekttyp, den Sie erstellen können (z. B. in Eclipse), wenn Sie Anwendungen von Drittanbietern erstellen. Diese werden in allen Apps kompiliert, die sie verwenden. Aber wenn Sie das Android-Betriebssystem aus der Quelle erstellen, gibt es kein solches Konzept eines Android-Bibliotheksprojekts. Es gibt jedoch Java-Bibliotheken, die auf dem Ziel als JAR-Dateien installiert werden. Aber sie können leider keine Ressourcen enthalten. Sie müssen die Ressourcen, die Sie benötigen, direkt in die App einbinden, nicht in die lib, das ist derzeit die einzige Möglichkeit. Es tut uns leid. –

+0

@CuongThai: Siehe meine aktualisierte Antwort. –

4

Ich weiß, ich graben diese aus dem Grab ein wenig, aber es gab nie wirklich eine Antwort dafür, wie man ein Android Library Project (oder andere apk mit Ressourcen) innerhalb einer AOSP gebaut Anwendung.

Hier ist, was ich mit zwei Projekten gemacht habe. "Haupt" ist die Hauptanwendung, für die ich die Apk baue. "util" ist eine Utility-Bibliothek mit Ressourcen, die ich verlinke. Beide Projekte befinden sich in externen/seabold/{Paket}:

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

Seien Sie hier vorsichtig zu machen sicher, dass Sie mit den Dateinamen richtig herumspielen. Für mich sind die in UTIL_JAVA_SRC definierten Dateien in Form von util/src/com/seabold/util/*.java. Da das Build-Skript für die Hauptanwendung Java-Dateien als relative Pfade zum Speicherort Android.mk erwartet, füge ich einen ../ hinzu, um den Pfad der util-Bibliothek richtig zu erreichen.

Der Schlüssel für Ressourcen ist der LOCAL_AAPT_FLAGS. Dies teilt dem Resource Packager mit, dass er eine R.java für das Paket in der Utility-Bibliothek generiert.Ohne dies werden alle Ressourcen des Dienstprogramms in die Hauptanwendungen R.java eingefügt, und die Dienstprogrammklassen können nicht kompiliert werden, da ihre R.java fehlen wird.

0

Um eine Pre-Build-JAR-Datei Rahmen hinzufügen Das habe ich:

  1. mit dem Glas einen Ordner lokalisieren und den Android.mk Datei unter

    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 machen auf der Android.mk Datei: make prebuilds/misc/common/Android.mk

  2. Fügen Sie die JAR-Datei auf den Rahmen/base/services/Android.mk:

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

Verwandte Themen