Utwórz bibliotekę Android Jar do dystrybucji

160

Wiem o projektach biblioteki systemu Android, które umożliwiają tworzenie projektów współdzielonych, które można w razie potrzeby pobrać do aplikacji na Androida. Jednak wymaga to dostępności tego źródła.

Szukam sposobu na zbudowanie i rozpowszechnianie biblioteki o zamkniętym kodzie źródłowym, której można by używać w innych projektach Androida, takich jak tradycyjny JAR. Będzie to wymagało użycia kompilatora Androida, więc nie jest to plik JAR vanilla-Java. FWIW, nie muszę osadzać zasobów / układów w JAR.

Widziałem http://andparcel.com/, ale wydaje mi się, że jest to obejście i wolałbym raczej użyć czegoś „oficjalnie obsługiwanego” przez Google. Muszę również upewnić się, że JAR, który buduję, jest kompatybilny ze starą / nową wersją Android SDK (tj. Potrzebuję sposobu na ustawienie docelowej wersji platformy itp.).

Czy najnowsze zestawy narzędzi dla Androida umożliwiają tworzenie / używanie plików binarnych JAR? Czy możesz wskazać jakąś dokumentację, jak mogę to zrobić?

psychotik
źródło
czy masz odpowiedź na swoje pytanie? Mam podobne wymaganie ... Jak poszedłeś do tworzenia plików jar?
Krishnabhadra
Aby rozpowszechniać plik .jar na Androida, nie potrzebujesz kompilatora Android dx, działa zwykły program do obsługi języka Java. Jeśli rozpowszechniasz jar, jest on konwertowany na kod bajtowy dx podczas budowania aplikacji.
Thomas W

Odpowiedzi:

49

Jeśli utworzysz projekt biblioteki systemu Android bez żadnych zasobów, narzędzie ADT (po raz pierwszy zauważone w r16) utworzy plik .jar o tej samej nazwie, co projekt w folderze „bin”.

Freddroid
źródło
proszę
1
To daje mi słoik, ale czy muszę nadal dystrybuować folder zasobów? Próba zerwania paska akcji sherlock i moje projekty nie będą się kompilować, ponieważ nie mogą znaleźć zasobów paska akcji.
Nathan Schwermann
1
@schwiz działa to tylko w przypadku projektów niezwiązanych z zasobami (jak stwierdzam w odpowiedzi). W przeciwnym razie musisz zaimportować go jako standardowy projekt biblioteki systemu Android.
Freddroid
1
Czy to nadal prawda? Nie widzę myapp.jarw /binfolderze. Jest classes.jar, ale to nie to, prawda?
garbagecollector
Korzystam z najnowszego narzędzia ADT i nadal otrzymuję plik <nazwa projektu> .jar w moim folderze / bin. Ale jeśli twój projekt zależy od zasobów, to nie jest dobry i projekt musi zostać uwzględniony jako projekt biblioteczny (chociaż nadal masz .jar.
Freddroid
23

Android nie zapewnia specjalnego rodzaju pliku Android-JAR. Ale co możesz zrobić, to dodać build.xml do swojego projektu i zbudować JAR za pomocą ant.

Mój plik build.xml wygląda następująco:

<project name="MyAndroidLib" default="dist" basedir=".">
  <description>
This is my Android lib
  </description>
  <!-- set global properties for this build -->
  <property name="src" location="src" />
  <property name="bin" location="bin" />

  <target name="jar">
    <jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
      <!-- replace 'com' by what ever you are using -->
      <!-- as first part of the package name -->
      <!-- e.g. de, org, ... -->
      <!-- the ** is important to include the directory recursively -->
      <include name="com/**" />
    </jar>
  </target>
</project>

Zbuduj JAR, uruchamiając ant jarw głównym folderze projektów.

white_gecko
źródło
Próbowałem tego i udało mi się zbudować plik JAR, ale rozmiar był dziwny (tylko 343 bajty) w porównaniu z eksportowaniem biblioteki do JAR. Masz jakiś pomysł, jakich flag brakuje?
Shane Oliver
Możesz sprawdzić zawartość JAR za pomocą programu do archiwizacji (JAR to ZIP) i zobaczyć, czego brakuje i dodać je. Więcej informacji można znaleźć tutaj: ant.apache.org/manual/Tasks/jar.html
white_gecko
5
W przypadku najnowszych zestawów SDK dla Androida pliki Java są kompilowane bin/classes, więc <jar destfile="MyAndroidLib.jar" basedir="bin/">powinno być<jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
Theo
17

Możesz utworzyć „zwykły” projekt Java i zaimportować stamtąd plik Android.jar. Wtedy będziesz mieć dostęp do każdego komponentu w SDK. Następnie możesz wyeksportować swój projekt jako jar ... i załadować go z aplikacji na Androida. To działa świetnie i wydaje się, że jest to całkiem prosty sposób.

ferostar
źródło
1
W takim przypadku, jak zadeklarować komponenty biblioteki, takie jak usługi, działania, nadawcy, filtry intencji. Czy aplikacja kliencka musi przechowywać wszystkie te deklaracje w postaci manifestu?
Ron
@ferostar Jak mogę zaimportować android.jar do projektu java?
Krishnabhadra
W przypadku, gdy biblioteka ma zasoby, jak wygenerować R.java i dodać go do JAR
15

po prostu przejdź do właściwości projektu, z którego chcesz zrobić jar i kliknij w zakładkę Android. i zaznacz w bibliotece Is. teraz możesz zobaczyć plik .jar w folderze bin. użyj go tam, gdzie chcesz.

Dhrupal
źródło
2
Wydaje się, że działa, jeśli LibraryProject nie ma zasobów. Masz pomysł, jak sprawić, by działało z zasobami?
Nathan Schwermann
Jest to jednak zła odpowiedź, jeśli projekt biblioteki zależy od innych projektów. Te referencje nie będą odbierane.
stevebot
10

Jedynym rozwiązaniem „oficjalnie wspieranym” przez Google jest projekt Library, który wymaga dystrybucji kodu źródłowego. Możesz utworzyć plik JAR w normalny sposób, ale nie możesz w nim umieszczać ani odwoływać się do zasobów.

Niestety myślę, że nie jest również możliwe włączenie spakowanego pliku JAR do projektu biblioteki, jako środka do obejścia wymagań dotyczących kodu źródłowego.

Jeff Gilfelt
źródło
„Można utworzyć plik JAR w normalny sposób, ale nie można w nim umieszczać ani odwoływać się do zasobów”. <- wydaje się nie działać poprawnie w Eclipse, jeśli odwołuję się do klas Androida lub używam kompilatora Androida. Wskazówki, jak to działa?
psychotik
5
Po prostu tworzę normalny projekt Java w Eclipse, dodaję android.jar do ścieżki kompilacji, a następnie wybieram Export - Java - Jar File.
Jeff Gilfelt,
@JeffGilfelt i jeśli na przykład uwzględnisz android.jar dla katalogu sdk android-13, czy będziesz mógł używać swojej biblioteki jar nadal w projektach dla wyższego poziomu API?
Fran Marzoa
10

W najnowszej wersji Android Studio 1.2 tworzenie biblioteki JAR było tak proste, jak wskaż i kliknij.

Kroki do naśladowania :

  • Idź do pliku -> Nowy -> Nowy moduł wprowadź opis obrazu tutaj
  • Wybierz „Java Library” na końcu listy opcji wprowadź opis obrazu tutaj
  • Wpisz nazwę biblioteki jar i nazwę klasy w niej i naciśnij przycisk Zakończ wprowadź opis obrazu tutaj
  • Otóż ​​to !

Następnym krokiem jest dodanie biblioteki Jar jako zależności w aplikacji. Proste

  • Idź do pliku -> Struktura projektu -> Wybierz „aplikacja” -> Wybierz „Zależność”
  • Wybierz „+” u dołu -> Wybierz „Zależność modułu” wprowadź opis obrazu tutaj
  • Wybierz swój moduł jar lib, który właśnie utworzyłeś powyżej wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj
  • Wybierz Ok i to wszystko!

.... Lub możesz po prostu dodać poniższy wiersz do pliku aplikacji gradle

dependencies {
      compile fileTree(dir: 'libs', include: ['*.jar']) // Default Gradle Task, should be already present
      compile 'com.android.support:appcompat-v7:21.0.3' // Default Gradle Task, should be already present

      compile project(':nameOfYourJarLibraryModule') // This is your jar library module
 }

Google promuje archiwum Androida (AAR), mimo że obsługiwany JAR jest przywracany do studia Android.Aby poznać różnicę między AAR a JAR, skorzystaj z tego linku

Nishant.
źródło
Nie rozumiem, jak to tworzy nowy plik jar. Wygląda na to, że właśnie tworzysz nowy moduł, który będzie używany jako biblioteka w Twoim projekcie na Androida
Jejefcgb
Co?! tworzysz nowy słoik z niczego?
Ewoks
@Ewoks: po utworzeniu modułu musisz dodać do niego klasy. Po zakończeniu dodajesz go jako zależność
Nishant.
2
Pytanie brzmiało: istnieje wbudowana biblioteka z kodem źródłowym. Jak zrobić z tego słoik, żeby w innym projekcie był używany tylko słoik zamiast całego kodu źródłowego biblioteki. A może coś mi umknęło?
Ewoks
2
@Nishant. Pracował dla mnie! Dzięki!
ramires.cabral
6

Spróbuj tego: to działa

1) Ustaw projekt biblioteki jako normalny projekt, odznaczając flagę IsLibrary.

2) Wykonaj projekt jako aplikację na Androida. (Nie pokaże żadnego błędu)

3) w folderze bin znajdziesz plik .jar wraz z .apk.

4) Daj ci .jar, który chce korzystać z twojej biblioteki.

5) Powiedz im, aby zaimportowali zewnętrzny plik jar do ścieżki kompilacji.

będzie to działać dobrze ze wszystkimi zasobami. powodzenia.

Aayush Rana
źródło
1
Muszę poprawić ten post: pliki JAR mogą zawierać tylko kod, bez zasobów Androida. Jeśli jakieś zasoby są włączone / potrzebne, musimy pozostawić projekt biblioteki otwarty i nie możemy po prostu użyć prostego pliku JAR.
cody
@cody: Jak wygenerujemy plik jar wraz z zasobami i wykorzystamy go w innym projekcie?
Mahantesh M Ambi
1

ADT tworzy folder bin, który zawiera wszystkie pliki klas dla wszystkich pasujących plików źródłowych i katalogów w twoim projekcie, możesz użyć polecenia jar, utworzyć archiwum jar zawierające te pliki klas i katalogi oraz prawdopodobnie twoją bibliotekę, ale oczywiście poziom platformy plików klas byłby przeznaczony tylko dla bieżącego poziomu kompilacji projektu - potrzebny byłby inny plik jar dla każdego poziomu platformy; Jednak wspaniałą rzeczą w tym jest to, że plik R.class jest zawarty w drzewie katalogów projektu i dzięki temu masz dostęp do jego zasobów. Nie wiem, czy to oficjalny sposób robienia rzeczy na Androidzie, ale zadziałał dla mnie.

David Evans
źródło
0

W naszym projekcie tworzymy apk (używając apkbuildera), który jest instalowany w / system / framework i dodaje ten apk w domyślnej ścieżce klas. W celu kompilacji aplikacji korzystających z jar, tworzymy plik jar (używając jar c).

Uwaga: nie mamy żadnych zasobów w bibliotece.

Karan
źródło
0

.jar to po prostu plik .zip, który zawiera plik .class (możesz spróbować zmienić rozszerzenie dowolnego pliku .jar na .zip i zobaczyć wynik). Możesz łatwo utworzyć dowolną bibliotekę .jar do dowolnego celu, spakując plik .class.

Renzokuken
źródło
Nie do końca prawda, zobacz en.wikipedia.org/wiki/JAR_(file_format), aby zobaczyć subtelne różnice (głównie kolejność wpisów w ZIP)
iddo
0

Kroki :

1) Otwórz plik project.properties

2) Dodaj wartość android.library=true

3) Zapisz plik

4) Z menu eclipse dla projektu wybierz opcję buduj automatycznie, a następnie wyczyść

Wynik: pod koszem zostanie utworzony nowy słoik .

Pana Technica
źródło