Як створити jar для проекту бібліотеки Android


74

Мені потрібно створити бібліотеку, яку я збираюся експортувати клієнту у файлі jar. Чи є спосіб створити банку з ресурсами?

Google adMob має таку банку, яка включає в себе файл ресурсу, такий як R $ layout.class. Ця сторінка описує деякий спосіб зробити це, але я не можу зрозуміти, як саме я повинен імпортувати проект бібліотеки до програми, використовуючи метод вище.

Відповіді:


81

Це найближче, що ви можете отримати:

Крок No1: Створіть звичайний проект бібліотеки Android і приведіть його до роботи.

Крок 2. Скопіюйте цей проект бібліотеки Android в інший каталог.

Крок 3: Створіть JAR із складених класів Java з оригінального проекту бібліотеки Android і помістіть цей JAR в libs/каталог копії, яку ви зробили на кроці 2. Ви повинні мати можливість запускати ProGuard на цьому JAR вручну, хоча я цього не пробував.

Крок No4: Видаліть усе з src/каталогу скопійованого проекту бібліотеки, залишивши порожнімsrc/ каталог.

Крок 5: Зробіть ZIP-файл або розподіліть скопійований проект бібліотеки Android.

Це дасть вам проект бібліотеки Android, такий як проект Play Services, де ресурси доступні, а вихідний код - ні.

ОНОВЛЕННЯ : Сьогодні ще кращим підходом є упаковка проекту бібліотеки як AAR, що є рідним способом Android для створення багаторазового артефакту з вашого скомпільованого коду та необхідних ресурсів. На даний момент (липень 2014 р.) Gradle для Android, Android Studio та android-maven-pluginможе створювати та використовувати AAR.


5
Бібліотечний проект відрізняється від стандартного проекту програми Android тим, що ви не можете скомпілювати його безпосередньо у власний .apk та запустити на пристрої Android . Подібним чином ви не можете експортувати проект бібліотеки до самостійного файлу JAR, як це було б зроблено для справжньої бібліотеки. Натомість вам слід компілювати бібліотеку опосередковано, посилаючись на бібліотеку в залежному додатку та будуючи цей додаток. ця цитата з doc підтримує вашу відповідь, я здогадуюсь
Рагунандан

@CommonsWare Ваші схеми працюють дуже добре, якщо ProGuard не працює на JAR. Якщо ви застосуєте ProGuard (вручну) до JAR, тоді всі залежні проекти будуть скаржитися на всі позначені символи "неможливо вирішити". Я просто спробував, і ось що отримав. Мені чогось не вистачає?
тупнув

1
@stumpped: Вам потрібно налаштувати файл конфігурації ProGuard, щоб не заважати іменам загальнодоступних матеріалів, які потрібні залежним проектам.
CommonsWare

@CommonsWare цитуючи офіційне керівництво: Примітка. Вам потрібні інструменти SDK r14 або новіші, щоб використовувати функцію нового проекту бібліотеки, яка генерує кожен проект бібліотеки у власний файл JAR. developer.android.com/tools/projects/index.html#LibraryProjects
Махмуд Абу-Еїта

ще на тій самій сторінці: Ви не можете експортувати проект бібліотеки у файл JAR Бібліотека не може бути розподілена як двійковий файл (наприклад, файл JAR). Це буде додано до майбутньої версії інструментів SDK.
Махмуд Абу-Ейта

22

Це працює!

  1. Зробіть свій проект бібліотеки звичайним проектом, знявши прапорець IsLibrary.
  2. Виконайте свій проект як додаток для Android. (Помилка не відображатиметься)
  3. Ви знайдете файл .jar у папці bin разом із .apk.
  4. Дайте вам .jar, який хоче користуватися вашою бібліотекою.
  5. Попросіть їх просто імпортувати зовнішній jar у шлях побудови.

Це добре працюватиме з усіма ресурсами. Дякую вам усім. за вашу відповідь


Коли я це роблю, я не отримую файл .jar, згенерований у моєму каталозі bin /?
Девід Дорія,

Я отримую файл .jar лише тоді, коли в мене перевірено "Є бібліотека". Однак коли я додаю це до свого залежного проекту, ресурси не працюють.
Девід Дорія,

2
якщо ви хочете, щоб ресурси працювали, перевірте це: stackoverflow.com/a/17064024/1779907 . Метод, який я пояснив у відповіді, працює, якщо у вас є бібліотека, яка не має ресурсів. Якщо ви хочете також захистити свої ресурси, будь-ласка, кодуйте їх у Java (як я використовував кодування base64 для збереження моїх зображень безпосередньо в інтерфейсі Java), а потім ви можете використовувати метод, описаний у моїй відповіді (працювати краще, якщо у вас менше ресурсів) .
Aayush Rana,

Подивіться мою відповідь тут для більш простого шляху - до речі, ваша відповідь поставила мене на правильний шлях;)
Mr_and_Mrs_D

5
Це не спрацює з ресурсами! ця банка, навіть не має в ній бібліотеки res, ви, мабуть, пропустили властивості проекту, використовуючи бібліотеку !.
TacB0sS

14

Виконайте наведені нижче кроки, щоб отримати розподільну банку вашої бібліотеки (перевірено для проекту бібліотеки без зовнішніх залежностей):

  1. Створіть свій бібліотечний проект. Очистіть його. Ви отримаєте файл libraryProjectName.jar всередині папки bin. (Переконайтеся , що «це бібліотека» буде обраний в бібліотеці проекту.
  2. Скопіюйте файл .jar у папку libs вашого цільової програми
  3. Оновіть робочу область і натисніть Ctr+Shift+O(на Windwows / Linux) або Cmd+Shift+O(на Mac), щоб вирішити будь-які залежності від імпорту із доданої бібліотеки.

Коментуйте на випадок виникнення будь-якої проблеми.


6
Це, безумовно , самий простий спосіб створити JAR з проекту бібліотеки , але ... він не містить resі в assetsпапки. Мені чогось не вистачає?
ріпопенід

@ripopenid Ті не можуть бути в JAR. Для цього вам потрібно посилатися на бібліотечні проекти.
caw

. @MarcoW, тільки resможливо, навіть посилання не дозволяє нам використовувати assets, Див developer.android.com/tools/projects/index.html#LibraryProjects : «Будь-які ресурси , активи , які використовуються додатком , повинні зберігатися в активах / каталог самого проекту програми ".
Pacerier

Це правильно. JAR надає вам srcкаталог. Бібліотечний проект отримує вас resдодатково. Більше неможливо.
caw

3

Ви не можете упакувати файли ресурсів у jar. Ви можете експортувати свій проект як бібліотечний проект.

Ви експортуєте свої утилітні класи, які не посилаються на ресурси в android, тобто чисті класи Java, як jar-файл.

Перевірте посилання нижче

http://developer.android.com/tools/projects/index.html

Зробити свій проект бібліотечним проектом

Клацніть правою кнопкою миші на своєму проекті. Перейдіть до властивостей. Виберіть Android. Переконайтеся, що встановлено прапорець Бібліотека.

Щоб передати проект бібліотеки у свій проект Android

Клацніть правою кнопкою миші на своєму проекті. Перейдіть до властивостей. Виберіть Android. Натисніть Додати. Огляд і проект бібліотеки.

Цитування з документів

Бібліотечний проект відрізняється від стандартного проекту програми Android тим, що ви не можете скомпілювати його безпосередньо у власний .apk та запустити на пристрої Android. Подібним чином ви не можете експортувати проект бібліотеки до самостійного файлу JAR, як це було б зроблено для справжньої бібліотеки. Натомість вам слід компілювати бібліотеку опосередковано, посилаючись на бібліотеку в залежному додатку та будуючи цей додаток.


1
Бібліотека не може бути розподілена як двійковий файл (наприклад, файл JAR). Це буде додано до майбутньої версії інструментів SDK. Цитування з developer.android.com/tools/projects/index.html
Рагунандан,

8
Інт він новий системі побудови Gradle ви матимете можливість створити так званий aar-файл (Android Archive), це саме те, що ви хочете. Це в основному як APK (що містить ресурси, маніфест тощо) лише для бібліотек. Тож перейдіть на Gradle, якщо вам потрібна відповідна підтримка для цього.
Tim Roes

Я не проголосував проти (недостатньо балів), але я можу здогадатися, що замість відповіді Як створити jar для Android Library Project, ви відповіли, що це неможливо. Усі інші відповіді насправді показують (робочий) спосіб створити таку банку.
ріпопенід

3

Перевірено за допомогою adt 22.2.1

  1. Створіть свій бібліотечний проект
  2. Створити порожній проект
  3. Додайте проект бібліотеки до порожнього проекту
  4. Побудувати проект
  5. У папці / gen ви знайдете клас для вашого бібліотечного проекту, він міститиме ваші ресурси для lib-проекту.
  6. Експортувати JAR (вибрати лише цей клас ... із папки / gen)
  7. Експортуйте JAR зі свого проекту lib
  8. Перейменуйте експортовані файли на zip та об’єднайте вміст
  9. Перейменуйте остаточний файл як JAR та додайте його до проекту.

Ви намагалися застосувати Proguard до JAR? Якщо так, то як це працювало? Були труднощі чи ускладнення?
ріпопенід

Крок №6 зробив би ваш підхід кращою новою альтернативою підходу @ CommonsWare, за винятком того, що він насправді не працює, якщо користувач (тобто проект програми) цієї бібліотеки визначає власні ресурси. Тож схоже, що метод CommonsWare все-таки найкращий.
ріпопенід

Сюди не включатимуться ресурси, що, як правило, є суттю проекту бібліотеки Android.
CommonsWare

1

Ось простий спосіб зробити це за допомогою мурахи, знайдений у вихідному коді Volley. Додайте наведений нижче код до custom_rules.xml, а потім побудуйте за допомогоюant jar

<?xml version="1.0" encoding="UTF-8"?>
<project name="volley-rules" default="help">

  <!-- A rule to generate the JAR for inclusion in an Android
       application. Output file will be bin/volley.jar -->
  <target name="jar" depends="-compile">
    <jar destfile="bin/volley.jar"
         basedir="bin/classes" />
  </target>
</project>

Приємно, ідея використовувати мурашку, але було б складно, якщо додати .class по одному в xml
Subhanshuja

1

Відповідно до останньої версії Android Studio v1.2, це так само просто, як мати торт. Вже відповіли на повне рішення зі скріншотами за цим посиланням


0

За допомогою Eclipse ADT v22.6.2 ви можете просто експортувати jar, натиснувши File-> Export-> Java-> Jar File, вибрати каталоги та пункт призначення, куди зберегти.


3
Сюди не включатимуться ресурси, що, як правило, є суттю проекту бібліотеки Android.
CommonsWare

Використання eclipse лише для створення jar не є повним, я думаю, краще використовувати безпосередньо в андроїд-студії.
Субханшуджа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.