Створіть бібліотеку Android Jar для розповсюдження


160

Мені відомі проекти бібліотеки Android, які дозволяють створювати проект із спільним джерелом, який можна втягувати в додатки Android за потреби. Однак для цього потрібне джерело.

Я шукаю спосіб побудови та розповсюдження бібліотеки із закритим кодом, який можна використовувати в інших Android-проектах, як-от традиційний JAR. Для цього знадобиться використання компілятора Android, тому це не файл JAR ванілі-Java. FWIW, мені не потрібно вбудовувати ресурси / макети в JAR.

Я бачив http://andparcel.com/, але це здається вирішенням проблеми, і я скоріше використовую щось, що "офіційно підтримується" Google. Крім того, мені потрібно переконатися, що JAR, який я будую, сумісний зі старою / новою версією Android SDK (тобто мені потрібен спосіб встановити цільову версію платформи тощо).

Чи дозволяють останні набори інструментів Android створювати / споживати бінарні файли JAR? Чи можете ви вказати на якусь документацію про те, як я можу це зробити?


Ви отримали відповідь на своє запитання? У мене є аналогічна вимога .. Як ти займався створенням файлів jar?
Крішнабхадра

Для розповсюдження .jar для Android вам не потрібен компілятор Android dx, звичайний Java-компілятор працює. Якщо ви поширюєте банку, вона перетворюється в dx-байт-код під час створення програми.
ThomasW

Відповіді:


49

Якщо ви створили проект бібліотеки Android, не маючи жодних ресурсів, ADT (вперше помічено в r16) створить .jar з таким же ім'ям, як проект у папці 'bin'.


Pls побачити це питання stackoverflow.com/questions/12970802 / ...
vnshetty

1
Це отримує мені банку, але чи потрібно все-таки розподіляти папку ресурсів? Намагаючись підключити шерлок панелі дій, і мої проекти не збиратимуться, оскільки вони не можуть знайти ресурси панелі дій.
Натан Шверман

1
@schwiz це працює лише для нересурсних проектів (як я заявляю у відповіді). Інакше вам потрібно імпортувати його як стандартний проект бібліотеки Android.
Фреддройд

1
Це все-таки правда? Я не бачу myapp.jarв /binпапці. Є classes.jar, але це не все, правда?
смітникколектор

У мене запущений останній ADT, і я все одно отримую <ім'я проекту> .jar у папці / bin. Але якщо ваш проект залежить від ресурсів, це не добре, і проект потрібно включити як бібліотечний проект (ви все одно отримаєте .jar, хоча.
Freddroid

23

Android не передбачає особливого виду Android-JAR. Але ви можете зробити додавання build.xml до свого проекту та створення JAR з мурашкою.

Мій 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
З останніми пакетами SDK для Android файли Java збираються bin/classes, так і <jar destfile="MyAndroidLib.jar" basedir="bin/">має бути<jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
Theo

17

Ви можете створити "звичайний" проект Java та імпортувати звідти Android.jar. Тоді ви матимете доступ до кожного компонента SDK. Потім ви можете експортувати свій проект у вигляді баночки ... та завантажити його з додатка 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. Підказки про те, як змусити це працювати?
psychotik

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

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

10

В останній збірці Android Studio 1.2 створення бібліотеки JAR було зроблено так само просто, як наведення та натискання.

Кроки для виконання:

  • Файл переходу -> Новий -> Новий модуль введіть тут опис зображення
  • Виберіть "Бібліотека Java" в кінці списку параметрів введіть тут опис зображення
  • Введіть у нього назву бачки банку та назву класу та натисніть кнопку фінішу введіть тут опис зображення
  • Це воно !

Наступним кроком є ​​додавання вашої бібліотеки Jar як залежність у вашому додатку. Просто так просто

  • Файл goto -> Структура проекту -> Виберіть "додаток" -> Виберіть "Залежність"
  • Виберіть "+" внизу -> Виберіть "Залежність модуля" введіть тут опис зображення
  • Виберіть свій модуль "lib jar", який ви створили вище введіть тут опис зображення введіть тут опис зображення
  • Виберіть Ок, і це!

.... Або ви можете просто додати нижній рядок до файлу 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 (AAR), навіть незважаючи на те, що підтримка JAR повертається до студії Android. Щоб дізнатися різницю між AAR та JAR, перейдіть за цим посиланням


Я не розумію, як це створює новий файл jar. Схоже, ви створюєте новий модуль, який буде використовуватися як бібліотека у вашому проекті Android
Jejefcgb

Що?! ви створюєте нову банку з нічого?
Ewoks

@Ewoks: після створення модуля ви повинні додати до нього класи. Після цього ви додасте це як залежність
Нішант.

2
Питання було: є реалізована бібліотека з вихідним кодом. Як зробити банку з неї, щоб просто jar використовується в іншому проекті замість цілого вихідного коду бібліотеки .. Або я щось пропустив?
Ewoks

2
@Nishant. Працювали для мене! Дякую!
ramires.cabral

6

Спробуйте: Це працює

1) зробити ваш бібліотечний проект нормальним проектом, скасувавши вибір прапора IsLibrary.

2) Виконайте свій проект як додаток Android. (Помилка не відображатиметься)

3) Ви знайдете .jar файл у папці bin разом із .apk.

4) Дайте вам .jar, які хочуть користуватися вашою бібліотекою.

5) Скажіть їм просто імпортувати зовнішню банку в шлях збірки.

це буде добре працювати з усіма ресурсами. удачі.


1
Я повинен виправити цю посаду: JAR-файли можуть містити лише код, ніяких андроїд-ресурсів. Якщо будь-які ресурси включені / потрібні, ми повинні тримати проект бібліотеки відкритим і не можемо просто використовувати простий JAR-файл.
коді

@cody: Як ми можемо генерувати файл jar разом із ресурсами та використовувати його в іншому проекті?
Махантеш М Амбі

1

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


0

У нашому проекті ми створюємо apk (використовуючи apkbuilder), який встановлюється в / system / Framework і додаємо цей apk в клас за замовчуванням. Для компіляції програм за допомогою 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.