- Привязка JAR-файла
- Обзор
- Пошаговое руководство
- Создание библиотеки привязок
- Использование библиотеки привязок
- Сводка
- Связанные ссылки
- Создание standalone библиотеки под android
- Develop an Android Library — Part 1
- What is JAR:
- What is AAR:
- Build a library:
- Create a JAR in Android Studio:
- Create an AAR in Android Studio:
- Use AAR or JAR file in Android Studio:
- JAR :
- AAR :
Привязка JAR-файла
В настоящее время рассматривается возможность использования настраиваемых привязок на платформе Xamarin. Примите участие в этом опросе, чтобы помочь определить дальнейшие направления разработки.
Это пошаговое руководство содержит инструкции по созданию библиотеки привязок Java для Xamarin.Android из JAR-файла на платформе Android.
Обзор
Сообщество Android предлагает много библиотек Java, которые можно использовать в приложении. Эти библиотеки Java часто упаковываются в виде JAR-файла (архив Java), но вы можете создать для этого JAR-файла привязку в библиотеке привязок Java, чтобы его функции стали доступны для приложений Xamarin.Android. Библиотека привязок Java предназначена для того, чтобы сделать API-интерфейсы из JAR-файла доступными в коде C# через автоматически создаваемые оболочки кода.
Средства Xamarin могут создавать библиотеку привязок из одного или нескольких JAR-файлов. Библиотека привязок (сборка в виде DLL-файла) содержит следующие элементы.
- Содержимое исходных JAR-файлов.
- Управляемые вызываемые оболочки (MCW), которые представляют собой типы C#, которые упаковывают соответствующие типы Java в . JAR-файлы.
Созданный код MCW использует нативный интерфейс Java (JNI) для переадресации вызовов API в исходный JAR-файл. Вы можете создать библиотеки привязок для любого JAR-файла, который предназначен для использования с Android (обратите внимание, что в настоящее время средства Xamarin не поддерживают привязку библиотек Java для платформ, отличных от Android). Вы также можете выполнить сборку библиотеку привязок, не включая содержимое JAR-файла, и тогда библиотека DLL будет иметь зависимость от JAR-файла во время выполнения.
В этом руководстве мы рассмотрим основные концепции создания библиотеки привязок из одного JAR-файла. Мы проиллюстрируем пример, где все идет правильно, то есть там, где настройка или отладка привязок не требуются. В примере создания привязок на основе метаданных показан более сложный сценарий, в котором процесс привязки невозможно выполнить полностью автоматически и требуется вмешательство пользователя. Общие сведения (с простым примером кода) о создании библиотек привязок для Java см. в разделе Привязка библиотеки Java.
Пошаговое руководство
В следующем пошаговом руководстве мы создадим библиотеку привязок для популярного пакета Android Picasso, который предоставляет функции загрузки и кэширования изображений. Выполните следующие действия, чтобы привязать файл picasso-2.x.x.jar и создать новую сборку .NET, которую можно использовать в проекте Xamarin.Android:
- Создайте проект библиотеки привязок Java.
- Добавьте JAR-файл в этот проект.
- Задайте нужное действие сборки для этого JAR-файла.
- Выберите целевую платформу, которую поддерживает JAR-файл.
- Выполните сборку библиотеки привязок.
После создания библиотеки привязок мы создадим небольшое приложение Android, которое демонстрирует возможность вызова API через библиотеку привязок. В этом примере мы хотим получить доступ к методам из picasso-2.x.x.jar:
package com.squareup.picasso public class Picasso < . public static Picasso with (Context context) < . >; . public RequestCreator load (String path) < . >; . >
После создания библиотеки привязок для picasso-2.x.x.jar вы сможете вызывать эти методы в коде C#. Пример:
using Com.Squareup.Picasso; . Picasso.With (this) .Load ("https://mydomain.myimage.jpg") .Into (imageView);
Создание библиотеки привязок
Прежде чем переходить к следующим шагам, скачайте файл picasso-2.x.x.jar.
Для начала создайте проект библиотеки привязок. В Visual Studio для Mac или Visual Studio создайте новое решение и выберите шаблон Библиотека привязок (Android) . (Снимки экрана в этом пошаговом руководстве взяты из Visual Studio, но Visual Studio для Mac мало чем отличается.) Присвойте решению имя JarBinding.
Шаблон включает папку Jars, в которую вы добавите JAR-файлы для проекта библиотеки привязок. Щелкните правой кнопкой мыши папку JARS и выберите Добавить > существующий элемент:
Перейдите к ранее скачанному файлу picasso-2.x.x.jar, выберите его и щелкните Добавить.
Убедитесь, что файл picasso-2.x.x.jar успешно добавлен в проект.
При создании проекта библиотеки привязок Java необходимо указать, будет ли JAR-файл внедрен в библиотеку привязок или упакован отдельно. Для этого укажите одно из следующих действий сборки:
- EmbeddedJar — . JAR-файл будет внедрен в библиотеку привязок.
- InputJar — . JAR-файл будет храниться отдельно от библиотеки привязок.
Обычно используется действие сборки EmbeddedJar, чтобы JAR-файл автоматически добавлялся в библиотеку привязок. Это самый простой вариант — байт-код Java в . JAR-файл преобразуется в байт-код Dex и внедряется (вместе с управляемыми вызываемыми оболочками) в пакет APK. Если вы хотите, чтобы JAR-файл хранился отдельно от библиотеки привязок, можно использовать вариант InputJar, но при этом вам придется обеспечить наличие этого JAR-файла на устройстве, на котором выполняется приложение.
Выберите действие сборки EmbeddedJar.
Теперь в разделе «Свойства» для проекта задайте значение для параметра Целевая платформа. Если JAR-файл использует API-интерфейсы Android, для целевой платформы нужно указать тот уровень API который ожидает этот JAR-файл. Как правило, разработчик JAR-файла указывает один или несколько уровней API, с которыми совместим этот JAR-файл. (Дополнительную информацию о настройке целевой платформы и уровней API Android см. в этой статье.)
Настройте целевой уровень API для библиотеки привязок (в этом примере мы используем уровень API 19).
Наконец, выполните сборку библиотеки привязок. Возможно, отобразятся некоторые предупреждения, но проект библиотеки привязок должен успешно пройти сборку и создать готовый DLL-файл по следующему адресу: JarBinding/bin/Debug/JarBinding.dll
Использование библиотеки привязок
Чтобы использовать этот DLL-файл в приложении Xamarin.Android, выполните следующие действия:
- Добавьте ссылку на библиотеку привязок.
- Выполните вызовы к JAR-файлу через вызываемые оболочки управляемого кода.
На следующих шагах мы создадим простейшее приложение, которое использует библиотеку привязок для скачивания и отображения изображения из ImageView . Вся основная работа выполняется кодом, который находится в JAR-файле.
Для начала создайте приложение Xamarin.Android, которое использует библиотеку привязок. Щелкните «Решение» правой кнопкой мыши и выберите Добавить новый проект, затем присвойте проекту имя BindingTest. Мы создаем это приложение в том же решении, что и библиотеку привязок, чтобы упростить это пошаговое руководство. Но приложение, использующее библиотеку привязок, может находиться в другом решении:
Щелкните правой кнопкой мыши узел Ссылки для проекта BindingTest и выберите команду Добавить ссылку. .
Выберите ранее созданный проект JarBinding и щелкните ОК.
Откройте узел Ссылки для проекта BindingTest, чтобы убедиться в наличии ссылки на JarBinding.
Измените макет BindingTest (Main.axml), чтобы в нем был один ImageView :
Добавьте следующую using инструкцию в файл MainActivity.cs . Это позволяет легко получить доступ к методам класса на основе Picasso Java, который находится в библиотеке привязок:
Измените метод OnCreate , чтобы в нем использовался класс Picasso для загрузки изображение по URL-адресу и отображения в ImageView :
public class MainActivity : Activity < protected override void OnCreate(Bundle bundle) < base.OnCreate(bundle); SetContentView(Resource.Layout.Main); ImageView imageView = FindViewById(Resource.Id.imageView); // Use the Picasso jar library to load and display this image: Picasso.With (this) .Load ("https://i.imgur.com/DvpvklR.jpg") .Into (imageView); > >
Скомпилируйте и запустите проект BindingTest. Приложение откроется и после небольшой задержки (в зависимости от условий сети) скачает и отобразит изображение, примерно как на следующем снимке экрана:
Поздравляем! Вы успешно привязали библиотеку Java из JAR-файла и применили ее в приложении Xamarin.Android.
Сводка
Из этого пошагового руководства вы узнали, как создали библиотеку привязок для стороннего JAR-файла, добавить эту библиотеку привязок в простейшее тестовое приложение и запустили это приложение для проверки того, как наш код C# вызывает код Java из JAR-файла.
Связанные ссылки
Создание standalone библиотеки под android
В этой статье я расскажу как создать библиотеку, которая использует другие библиотеки и при этом уместить всё в одном jar.
Допустим мы пишем библиотеку, она использует другие библиотеки и, в частности, для примера, support library. Если бы мы использовали maven, то в pom файле просто прописали зависимости и не парились. Но что если нашу библиотеку будут использовать люди, которые не пользуются системами сборок или пользуются ant’ ом?
Мы можем положить зависимости рядом с нашим jar. Но тогда неизбежны конфликты библиотек разных версий, например, если мы используем одну версию support library, а в самом приложении другая. Тогда придется руками одну из них удалять.
Можно пойти другим путем, вспомним что jar это обычный zip файл. Мы распакуем все зависимости, получим байт-код в виде .class файлов, далее компилируем код нашей библиотеки, кладем все .class файлы в одно место и собираем из них jar. Но если в приложении используются те же библиотеки что и у нас, то получим ошибку что в проекте два одинаковых класса.
Для решения этой проблемы воспользуемся утилитой jarjar. Она переименовывает все классы в jar файле. На примере support library — все классы находятся в пакете android.support.v4
java -jar jarjar.jar process rulesFile - файл с правилами переименования inJar, outJar - тут все понятно
rule android.support.v4.** inner.android.support.v4.@1
и сохраним в файл rules.txt
java -jar jarjar.jar rules.txt android-support-v4.jar android-support-v4-renamed.jar
В итоге получили jar’ку с переименованными классами. Далее мы распаковываем все наши зависимости с переименованными классами и компилируем. Получаем библиотеку, которая содержит весь код нужный для выполнения.
Наша библиотека содержит код всех зависимостей, которые могут весить немало. Чтобы уменьшить размер применим proguard для удаления неиспользуемых классов и методов.
И в заключение небольшой скрипт на gradle который всё это делает
apply plugin: 'java' defaultTasks 'proguard' task unpackJars(dependsOn: compileJava) < //распаковываем классы из библиотек file('libs').listFiles().each < File file ->if (file.name.endsWith('.jar')) < copy < from(zipTree(file.path)) into('build/classes/main') >> > //собираем jar'ку tasks.jar.execute() > task proguard(type: proguard.gradle.ProGuardTask, dependsOn: unpackJars) < injars 'build/libs/library.jar' outjars 'build/libs/proguard_library.jar' libraryjars '/Applications/my/Android Studio.app/sdk/platforms/android-10/android.jar' //укажем что классы нашей библиотеки удалять не нужно keep 'class com.CasualSoftware.classloader.library.**' >dependencies
Вои и всё, после выполнения скрипта мы получим proguard_library.jar, который можно добавлять к приложению и использовать.
В моём случае библиотека использует support library и dropbox sdk, и весит 50 кБ.
Этим же способом можно уменьшать размер вашего apk, все зависимости можно подключать не как jar файлы, а распаковывать в .classes и применять proguard, тогда он удалит неиспользуемые классы из библиотек. Так можно подключать к проекту тяжелые фреймворки не боясь увеличения размера apk
Develop an Android Library — Part 1
What does a “library” mean in programming world?
“ A library is a precompiled code and resources that can be used in other projects easily “ In Android, mainly two types of libraries are used: JAR and AAR.
What is JAR:
Full form of JAR is Java Archived. A JAR file is a Zipped formatted file with .jar extension, containing Java Class files, metadata and other resources like text, images etc. JAR files may also contain one Manifest.MF file. This file contains information like which Java class is the entry point, classpaths etc.
What is AAR:
It may also include one or more of the following entries:
- /assets/
- /libs/lib_name.jar
- /jni/abi_name/bin_name.so
- /proguard.txt
- /lint.jar
Build a library:
Create a JAR in Android Studio:
Select File -> New -> New Module and select “Java Library” from the selection :
Click Next -> Finish
It will create a new java library project.
But you cannot add any android Framework dependency in this library.
How to create a library for android then? Simply select “Android Library” instead of “Java Library” in the last step above . done !!
But how to get the .jar file for both of these libraries?
For “Java Library”, use ./gradlew build to create .jar . Output file will be inside /build/libs/ folder.
For “Android Library”, we will have to use one custom Gradle task:
Copy-paste the following code snippet inside build.gradle file:
task deleteJar(type : Delete) < delete 'libs/myLib.jar' >task createJar(type : Copy) < from ('build/intermediates/bundles/release/') into ('libs') include ('classes.jar') rename ('classes.jar','myLib.jar') >createJar.dependsOn(deleteJar,build)
Now use the command ./gradlew createJar to build the jar. The output file will be inside /yourLibrary/libs/ folder.
Create an AAR in Android Studio:
Generating an AAR is easier than jar. Just use “./gradlew assembleRelease” and it will generate release AAR inside /yourLib/build/outputs/aar/ folder.
Use AAR or JAR file in Android Studio:
JAR :
add the following line inside dependencies <> tab of build.gradle
compile files(‘libs/myJarLib.jar’)
myJarLib.jar should be inside ‘libs’ folder.
AAR :
Add the following inside dependencies <> tab :
compile(name:”myAarLib” ,ext : ‘aar’)
and ( not inside dependencies<>)
Rebuild the project and it should work.