7

Desidero aggiungere alcune funzionalità nell'app Browser avviando un'attività da un'altra applicazione Android. Mi dà package does not exist mentre faccio il Main Project. Si noti che vedo l'AndroidLib è costruito con successo in un out/target/product/generic/data/app/AndroidLib.apkAggiungere un progetto Android come libreria nell'app AOSP

Qui ci sono due file android.mk: AndroidLib (una normale app Android)

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

Poi ho fare:

make -j Browser 

Mi dà:

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

vi siete dichiarato tutte le attività della Biblioteca progetto in progetto principale manifesto con là pacchetto name.And controllare anche la pac kage name decalred nel manifest del tuo progetto di libreria. – Meenal

+0

@MeenalSharma: Penso che dovrebbe essere lo stesso come quando si utilizza Eclipse e definire A come libreria, quindi aggiungere la libreria nel progetto principale. Devo copiare la dichiarazione di A Lib nel Main Project? –

+0

sì, è necessario copiare perché si esegue il progetto principale e non la libreria, e quando viene chiamata l'acidità del progetto della libreria, viene eseguita dal progetto principale. – Meenal

risposta

13

Aggiornamento

Essenzialmente il problema è che la linea:

LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib 

Indica al Android costruire che il vostro Browser dipende AndroidLib in costruzione prima, tuttavia non sarà collegato a AndroidLib in alcun modo. Per fare questo è necessario:

LOCAL_JAVA_LIBRARIES := AndroidLib 

Solo che richiede l'AndroidLib essere un progetto libreria Java, utilizzando il tipo di costruzione:

include $(BUILD_JAVA_LIBRARY) 

E librerie Java non possono includere le risorse, purtroppo. E non c'è modo di collegare un'app a un'altra app nel sistema di build Android.

Stiamo lavorando frequentemente su questo problema, ed è francamente un po 'caotico farlo. Ma l'unica soluzione alternativa che abbiamo trovato è includere tutte le risorse direttamente nelle app che utilizzano tali risorse. Scusate.


Come rendere il vostro AndroidLib una libreria Java e link ad esso

vostro lib Android dovrebbe probabilmente essere costruito come una libreria Java, e non come un pacchetto app. Così, invece di:

include $(BUILD_PACKAGE) 

probabilmente si dovrebbe fare:

include $(BUILD_JAVA_LIBRARY) 

Poi si lib saranno inseriti in out/target/product/generic/system/framework/AndroidLib.jar insieme alle altre librerie di sistema.

Inoltre non è necessario un LOCAL_MODULE_NAME per una lib, è applicabile solo per un'app. Quindi spogliatelo.

E probabilmente si dovrebbe pensare di cambiare il vostro LOCAL_MODULE_TAGS a:

LOCAL_MODULE_TAGS := user 

tests indica che si lib dovrebbe essere costruito solo per i test, user dice di edificare Lib per tutti gli utenti costruisce (e implicitamente anche per l'ingegneria costruisce)


In te App Android.mk si dovrebbe quindi aggiungere una riga:

LOCAL_JAVA_LIBRARIES := AndroidLib 

In modo che l'app venga creata con AndroidLib nel classpath.


In te applicazioni AndroidManifest.xml È inoltre necessario mettere un utilizza la libreria nella application tag:

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

e ultimo è necessario creare un file di autorizzazioni XML, con il seguente contenuto:

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

E aggiornare il file di configurazione del prodotto in modo che il file xml sia schierato a bersaglio:

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

Sostituire device/XXX/libs/ con il percorso del file XML permessi.


Ecco come aggiungiamo e utilizziamo una libreria Android nei nostri build Android. Spero possa essere d'aiuto. :)

+0

Penso di non averlo reso molto chiaro per te. La lib Android è in realtà un progetto Android che ha risorse proprie. Ho seguito le tue istruzioni e ho trovato molte risorse R non trovate. Ho esaminato le librerie esterne/[] e vedo che stanno facendo abbastanza simili a quello che stai dicendo, ma sono tutte libere di Java Lib che non è proprio il caso. –

+2

Esistono due tipi di librerie Android correlate. Ci sono i tipi di progetti di libreria che puoi creare (ad es. In Eclipse) quando crei applicazioni di terze parti. Questi verranno compilati in tutte le app che li utilizzano. Ma quando si crea il SO Android dal sorgente, non esiste un concetto simile di un progetto di libreria Android. Esistono tuttavia librerie java che verranno installate sulla destinazione come file jar. Ma loro non possono contenere risorse, sfortunatamente. Dovrai includere le risorse di cui hai bisogno direttamente nell'app e non nella lib, che al momento è l'unico modo in cui funzionerà. Scusate. –

+0

@CuongThai: vedere la mia risposta aggiornata. –

4

So che sto scavando un po 'fuori dalla tomba un po', ma non c'è mai stata davvero una risposta su come includere effettivamente un progetto di libreria Android (o altro apk con risorse) all'interno di un AOSP costruito applicazione.

Ecco cosa ho fatto con due progetti. "main" è l'applicazione principale per cui sto costruendo l'apk. "util" è una libreria di utilità con risorse a cui sto collegando. Entrambi i progetti risiedono in esterno/seabold/{package}:

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) 

Fare attenzione qui per fare sicuro di armeggiare con i nomi dei file correttamente. Per me, i file definiti in UTIL_JAVA_SRC hanno la forma di util/src/com/seabold/util/*.java. Poiché, lo script di build per l'app principale prevede che i file java siano percorsi relativi alla posizione di Android.mk, sto aggiungendo un ../ per accedere correttamente al percorso della libreria di util.

La chiave per le risorse è LOCAL_AAPT_FLAGS. Ciò indica al resource packager di assicurarsi che generi un R.java per il pacchetto nella libreria delle utilità.Senza questo, tutte le risorse del programma di utilità verranno inserite nelle applicazioni principali R.java e le classi di utilità non riusciranno a compilare perché manca R.java.

0

Per aggiungere un file jar pre-build per il quadro che ho fatto:

  1. individuare una cartella con il vaso e il file Android.mk sotto

    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 fare sul file Android.mk: make prebuilds/misc/common/Android.mk

  2. aggiungere il file jar al quadro/base/servizi/Android.mk:

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