Создать библиотеку Android Jar для распространения


160

Мне известны проекты библиотеки Android, которые позволяют вам создавать проекты с общим исходным кодом, которые можно при необходимости включать в приложения Android. Однако для этого требуется, чтобы источник был доступен.

Я ищу способ создания и распространения библиотеки с закрытым исходным кодом, которая может быть использована в других проектах Android, таких как традиционный JAR. Это потребует использования компилятора Android, так что это не файл JAR vanilla-Java. FWIW, мне не нужно вставлять ресурсы / макеты в JAR.

Я видел http://andparcel.com/, но это похоже на обходной путь, и я бы предпочел использовать что-то «официально поддерживаемое» Google. Кроме того, мне нужно убедиться, что создаваемый JAR-файл совместим со старой / новой версией Android SDK (т. Е. Мне нужен способ установить версию целевой платформы и т. Д.).

Последние наборы инструментов Android позволяют создавать / использовать двоичные файлы JAR? Можете ли вы указать некоторые документы о том, как я могу это сделать?


у тебя есть ответ на твой вопрос? У меня есть подобное требование. Как вы пошли о создании файлов JAR?
Кришнабхадра

Для распространения .jar для Android вам не нужен компилятор Android dx, работает обычный компилятор Java. Если вы распространяете jar-файл, он преобразуется в байт-код dx при сборке приложения.
ThomasW

Ответы:


49

Если вы создаете проект библиотеки Android без каких-либо ресурсов, ADT (впервые замеченный в r16) создаст файл .jar с тем же именем, что и у проекта, в папке «bin».


Просьба посмотреть этот вопрос stackoverflow.com/questions/12970802/…
vnshetty

1
Это дает мне банку, но мне все равно нужно распространять папку ресурсов? Попытка вызвать jar-файл actionbar sherlock, и мои проекты не будут компилироваться, потому что они не могут найти ресурсы панели действий.
Натан Шверманн

1
@schwiz это работает только для нересурсных проектов (как я заявляю в ответе). В противном случае вам необходимо импортировать его как стандартный проект библиотеки Android.
Freddroid

1
Это все еще правда? Я не вижу myapp.jarв /binпапке. Есть classes.jar, но это не так, верно?
сборщик мусора

У меня установлена ​​последняя версия ADT, и я до сих пор получаю <имя проекта> .jar в своей папке / bin. Но если ваш проект зависит от ресурсов, это нехорошо, и проект нужно включить как библиотечный проект (хотя вы все равно получаете .jar.
Freddroid

23

Android не предоставляет специальный вид Android-JAR. Но то, что вы можете сделать, это добавить build.xml в ваш проект и собрать JAR с помощью ant.

Мой build.xml выглядит так:

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

Создайте JAR, запустив ant jarв главной папке ваших проектов.


Попробовал это и смог создать файл JAR, но размер был нечетным (всего 343 байта) по сравнению с экспортом библиотеки в JAR. Есть идеи о том, какие флаги отсутствуют?
Шейн Оливер

Вы можете проверить содержимое JAR с помощью архивной программы (JAR - это ZIP), посмотреть, чего не хватает, и добавить их. Вы можете найти больше информации здесь: ant.apache.org/manual/Tasks/jar.html
white_gecko

5
С последними Android SDK файлы Java скомпилированы bin/classes, так что <jar destfile="MyAndroidLib.jar" basedir="bin/">должно быть<jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
Тео

17

Вы можете создать «обычный» Java-проект и импортировать оттуда Android.jar. Затем у вас будет доступ ко всем компонентам в SDK. Затем вы можете экспортировать свой проект как jar ... и загрузить его из вашего приложения для Android. Это прекрасно работает, и кажется, что это довольно простой способ сделать это.


1
В таком случае, как объявить компоненты библиотеки, такие как сервисы, действия, широковещательные приемники, намеренные фильтры. Нужно ли клиентскому приложению хранить все эти декларации в манифесте?
Рон

@ferostar Как я могу импортировать android.jar в проект Java?
Кришнабхадра

Если у этой библиотеки есть ресурсы, как сгенерировать R.java и добавить его в JAR

15

Просто зайдите в свойства проекта, из которого вы хотите сделать jar. Нажмите на вкладку Android. и отметьте галочкой в ​​библиотеке Is. Теперь вы можете увидеть файл .jar в папке bin. Используйте его там, где вы хотите использовать.


2
Это похоже на работу, если LibraryProject не имеет ресурсов. Есть идеи, как заставить его работать с ресурсами?
Натан Шверманн

Это плохой ответ, если ваш библиотечный проект зависит от других проектов. Эти ссылки не будут приняты.
Stevebot

10

Единственное решение, «официально поддерживаемое» Google, - это проект библиотеки, который требует распространения исходного кода. Вы можете создать JAR обычным способом, но вы не можете включать или ссылаться на ресурсы внутри него.

К сожалению, я думаю, что также невозможно включить упакованный JAR в проект библиотеки, чтобы обойти требование исходного кода.


«Вы можете создать JAR обычным способом, но вы не можете включать или ссылаться на ресурсы внутри него». <- похоже, не работает правильно в Eclipse, если я ссылаюсь на классы Android или использую компилятор Android. Подсказки о том, как заставить это работать?
Психотик

5
Я просто создаю обычный проект Java в Eclipse, добавляю android.jar в путь сборки, затем выбираю Export - Java - Jar File.
Джефф Гилфелт

@JeffGilfelt, и если вы, например, включите android.jar для каталога android-13 sdk, сможете ли вы использовать библиотеку jar еще в проектах для более высокого уровня API?
Фран Марзоа

10

В последней сборке Android Studio 1.2 создание библиотеки JAR было сделано просто и просто.

Шаги, чтобы следовать:

  • Перейти к файлу -> Новый -> Новый модуль введите описание изображения здесь
  • Выберите «Библиотека Java» в конце списка опций введите описание изображения здесь
  • Введите имя jar lib и имя класса в нем и нажмите кнопку Готово введите описание изображения здесь
  • Это оно !

Следующий шаг - добавление библиотеки Jar в качестве зависимости в вашем приложении. Просто так просто

  • Перейти к файлу -> Структура проекта -> Выбрать «приложение» -> Выбрать «Зависимость»
  • Выберите «+» внизу -> выберите «Зависимость модуля» введите описание изображения здесь
  • Выберите модуль jar lib, который вы только что создали введите описание изображения здесь введите описание изображения здесь
  • Выберите Ok, и это все!

.... Или вы можете просто добавить приведенную ниже строку в файл приложения 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 продвигает Android Archive (AAR), даже несмотря на то, что поддерживаемый JAR возвращается в Android Studio. Чтобы узнать разницу между AAR и JAR, воспользуйтесь этой ссылкой


Я не понимаю, как это создает новый файл JAR. Похоже, вы просто создаете новый модуль, который будет использоваться в качестве библиотеки в вашем проекте Android
Jejefcgb

Какой?! Вы создаете новую банку из ничего?
Эвокс

@Ewoks: после того, как вы создали модуль, вы должны добавить к нему классы. Сделав это, вы добавляете его в качестве зависимости
Nishant.

2
Вопрос был: есть расширенная библиотека с исходным кодом. Как сделать jar из этого, чтобы просто jar использовался в другом проекте вместо целого исходного кода библиотеки ... Или я что-то пропустил?
Эвокс

2
@Nishant. Работал на меня! Спасибо!
ramires.cabral

6

Попробуйте это: это работает

1) Сделайте ваш проект библиотеки обычным, сняв флажок IsLibrary.

2) Выполните ваш проект как приложение для Android. (Это не покажет никакой ошибки)

3) вы найдете файл .jar в папке bin вместе с .apk.

4) Дайте вам .jar, кто хочет использовать вашу библиотеку.

5) Скажите им просто импортировать внешний jar-файл в путь сборки.

это будет хорошо работать со всеми ресурсами. удачи.


1
Я должен исправить этот пост: JAR-файлы могут содержать только код, без ресурсов Android. Если какие-либо ресурсы включены / необходимы, мы должны оставить проект библиотеки открытым и не можем просто использовать простой JAR-файл.
Коди

@cody: Как мы генерируем JAR-файл вместе с ресурсами и используем его в другом проекте?
Махантеш М Амби

1

ADT создает папку bin, которая содержит все файлы классов для всех соответствующих исходных файлов и каталогов в вашем проекте. Вы можете использовать команду jar, создать архив jar, содержащий эти файлы и каталоги классов и предположительно вашу библиотеку, но, конечно, файлы платформы уровня класса будут предназначены только для текущего уровня сборки проекта - вам понадобится отдельный файл jar для каждого уровня платформы; Однако самое замечательное в этом то, что файл R.class включен в дерево каталогов проекта, и поэтому у вас есть доступ к его ресурсам. Я не знаю, если это официальный способ сделать вещи в Android, но это сработало для меня.


0

В нашем проекте мы создаем apk (используя apkbuilder), который устанавливается в / system / framework и добавляем этот apk в classpath по умолчанию. Для компиляции приложений, использующих jar, мы создаем файл jar (используя jar c).

Примечание: у нас нет ресурсов в библиотеке.


0

.jar - это просто файл .zip, который содержит файл .class (вы можете попробовать изменить расширение любого файла .jar на .zip, а затем посмотреть результат). Вы можете легко создать любую библиотеку .jar для любых целей, заархивировав файл .class.


Не совсем верно, см. En.wikipedia.org/wiki/JAR_(file_format) для тонких различий (в основном, порядок записей в ZIP)
iddo

0

Шаги:

1) Открыть файл project.properties

2) Добавить ценность android.library=true

3) Сохранить файл

4) В меню затмения для проекта, выберите сборку автоматически, затем выберите очистить

Результат: новая корзина создана под мусорным баком .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.