Intereting Posts
Поиск номера версии приложения в коде Закрыть навигационный ящик при запуске приложения Как идентифицировать три пальца в андроиде Идентификатор проекта GCM GC, какой? Перезагрузка Bluetooth-соединения Когда вызывается метод onCreate () приложения? Значение RealEx Exception «значение» не является допустимым управляемым объектом RxJava: узнайте, было ли BehaviorSubject повторяющимся значением или нет Пользовательский вид Limit Line в MPAndroidChart Хорошая практика программирования вызывает invalidate () внутри onDraw ()? Android Google Analytics – подключение к службе не выполнено Конвертировать миллисекунду в Joda Date Time или для зоны 0000 Получить фотографии контактов, которые синхронизируются с facebook для Android Андроидальная камера: Ошибка выдачи результата ResultInfo {who = null, request = 0, result = -1, data = null} к активности Как выполняется обработка ошибок в Retrofit 2? Я не могу найти класс RetrofitError, который предлагает большинство решений?

Aspectj с андроидной библиотекой

У меня есть lib, который использует аспекты и доступен через maven, теперь я пытаюсь использовать эту lib в приложении Android.

Если я включу этот плагин в файл приложения gradle, все будет хорошо, но моя цель – извлечь classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+' И apply plugin: 'android-aspectj' (требуется плагином) в файл my.lib gradle вместо объявления в моем приложении.

Это возможно?

Файл приложения:

 classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+' apply plugin: 'android-aspectj' dependencies { compile 'my.lib:example:1.0.0' } 

ЦЕЛЬ:

Файл приложения:

 dependencies { compile 'my.lib:example:1.0.0' } 

Файл mylib gradle:

 classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+' apply plugin: 'android-aspectj' dependencies { compile 'org.aspectj:aspectjrt:1.7.3' } 

Solutions Collecting From Web of "Aspectj с андроидной библиотекой"

У меня такая же проблема. Это все, что я сделал для ее решения.

Проект Root / Main

В своем корневом проекте добавьте инструменты AspectJ, содержащие компилятор ajc, необходимый для плетения ваших классов. (Вы также можете добавить это в файл build.gradle вашей библиотеки, но лучше добавить его здесь, так как плагин gradle, который вы создадите для размещения в вашей библиотеке, будет использовать ajc.

 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' classpath 'org.aspectj:aspectjtools:1.8.5' } 

Проект библиотеки

В файле build.gradle вашей библиотеки убедитесь, что он похож на этот. Основными дополнениями являются операторы импорта вверху и код под свойствами сборки android.

 import com.android.build.gradle.LibraryPlugin import org.aspectj.bridge.IMessage import org.aspectj.bridge.MessageHandler import org.aspectj.tools.ajc.Main apply plugin: 'com.android.library' dependencies { compile 'org.aspectj:aspectjrt:1.8.5' } android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 14 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } android.libraryVariants.all { variant -> LibraryPlugin plugin = project.plugins.getPlugin(LibraryPlugin) JavaCompile javaCompile = variant.javaCompile javaCompile.doLast { String[] args = [ "-showWeaveInfo", "-1.5", "-inpath", javaCompile.destinationDir.toString(), "-aspectpath", javaCompile.classpath.asPath, "-d", javaCompile.destinationDir.toString(), "-classpath", javaCompile.classpath.asPath, "-bootclasspath", android.bootClasspath.join(File.pathSeparator) ] MessageHandler handler = new MessageHandler(true); new Main().run(args, handler) def log = project.logger for (IMessage message : handler.getMessages(null, true)) { switch (message.getKind()) { case IMessage.ABORT: case IMessage.ERROR: case IMessage.FAIL: log.error message.message, message.thrown break; case IMessage.WARNING: case IMessage.INFO: log.info message.message, message.thrown break; case IMessage.DEBUG: log.debug message.message, message.thrown break; } } } } 

Так что происходит, когда проект компилируется, команда ajc (AspectJ's weaver) компилирует и вставляет файлы AspectJ и Java source и .class, создавая файлы .class, совместимые с любой виртуальной машиной Java.

Для этого задача требует аргументов в отношении вашей библиотеки. В этом причина создания переменной args.

  String[] args = [ "-showWeaveInfo", "-1.5", "-inpath", javaCompile.destinationDir.toString(), "-aspectpath", javaCompile.classpath.asPath, "-d", javaCompile.destinationDir.toString(), "-classpath", javaCompile.classpath.asPath, "-bootclasspath", android.bootClasspath.join(File.pathSeparator) ] 

Затем созданный обработчик сообщения просто передается ajc для накопления сообщений о событиях, которые происходят, когда ajc компилирует / соткает классы. Затем он передается в регистратор проекта, который затем выводит любые важные ошибки или предупреждения, которые создавал ajc. Например, если pointcut не может ссылаться на совет, он будет обнаружен и показан в консоли gradle. Введите описание изображения здесь

Итак, все, что было описано выше, в основном происходит прямо здесь. Где аргументы и обработчик сообщений передаются на главную функцию ajc (компилятор AspectJ).

  MessageHandler handler = new MessageHandler(true); new Main().run(args, handler) def log = project.logger for (IMessage message : handler.getMessages(null, true)) { switch (message.getKind()) { case IMessage.ABORT: case IMessage.ERROR: case IMessage.FAIL: log.error message.message, message.thrown 

Плагин Gradle

Точки / советы вашей библиотеки не запускались, потому что вы com.uphyca.gradle:gradle-android-aspectj-plugin таргетинг на модуль приложения, в то время как аспекты были только вплетены в модуль вашей библиотеки с com.uphyca.gradle:gradle-android-aspectj-plugin AspectJ для com.uphyca.gradle:gradle-android-aspectj-plugin plugin. Поэтому для того, чтобы Аспекты вашей библиотеки были вплетены в модуль вашего приложения, вам нужно создать плагин градиента для вашего проекта. То, что вы определили в качестве своей цели, – ваш вопрос невозможен, это единственный способ сделать это.

Вот как должен выглядеть плагин. (Плагин выполнен в паре).

Плагин build.gradle

 apply plugin: 'groovy' targetCompatibility = JavaVersion.VERSION_1_7 sourceCompatibility = JavaVersion.VERSION_1_7 dependencies { compile gradleApi() compile localGroovy() compile 'com.android.tools.build:gradle:1.1.0-rc3' compile 'org.aspectj:aspectjtools:1.8.5' compile 'org.aspectj:aspectjrt:1.8.5' } 

Тогда фактический класс.

 import com.android.build.gradle.AppPlugin import com.android.build.gradle.LibraryPlugin import org.aspectj.bridge.IMessage import org.aspectj.bridge.MessageHandler import org.aspectj.tools.ajc.Main import org.gradle.api.Plugin import org.gradle.api.Project public class YourPlugin implements Plugin<Project> { @Override void apply(Project project) { def hasApp = project.plugins.withType(AppPlugin) def hasLib = project.plugins.withType(LibraryPlugin) if (!hasApp && !hasLib) { throw new IllegalStateException("'android' or 'android-library' plugin required.") } final def log = project.logger final def variants if (hasApp) { variants = project.android.applicationVariants } else { variants = project.android.libraryVariants } project.dependencies { compile 'com.name:example:1.0' // TODO this should come transitively compile 'org.aspectj:aspectjrt:1.8.5' } variants.all { variant -> variant.dex.doFirst { String[] args = [ "-showWeaveInfo", "-1.5", "-inpath", javaCompile.destinationDir.toString(), "-aspectpath", javaCompile.classpath.asPath, "-d", javaCompile.destinationDir.toString(), "-classpath", javaCompile.classpath.asPath, "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator) ] log.debug "ajc args: " + Arrays.toString(args) MessageHandler handler = new MessageHandler(true); new Main().run(args, handler); for (IMessage message : handler.getMessages(null, true)) { switch (message.getKind()) { case IMessage.ABORT: case IMessage.ERROR: case IMessage.FAIL: log.error message.message, message.thrown break; case IMessage.WARNING: log.warn message.message, message.thrown break; case IMessage.INFO: log.info message.message, message.thrown break; case IMessage.DEBUG: log.debug message.message, message.thrown break; } } } } } } 

Я знаю, это может показаться много, но это много копий и вставки, потому что решение остается тем же. Если вы внимательно посмотрите на класс, то те же самые вещи, которые выполняются в вашем библиотечном модуле, теперь применяются к модулю вашего приложения. Основная модификация, которую вы сделали бы с этим, – добавить свой библиотечный модуль к зависимостям проекта через плагин, который здесь делается.

  project.dependencies { compile 'com.letz:example-library:1.0' // TODO this should come transitively compile 'org.aspectj:aspectjrt:1.8.5' } 

Чтобы ваша библиотека была доступна вашему плагину во время разработки, вы должны убедиться, что она развернута в вашем локальном хранилище maven. Это можно сделать, применив этот плагин ( https://github.com/dcendents/android-maven-gradle-plugin ) к вашему библиотечному модулю и выполняя gradle install .

Заключительные шаги

Как только все это будет сделано, вы сможете применить его к образцу приложения для тестирования, добавив его в файл build.gradle

 buildscript { repositories { mavenCentral() //Only necessary when developing locally. mavenLocal() } dependencies { classpath 'com.letz:example-plugin:1.0' } } apply plugin: 'example-plugin' 

Как только это будет сделано, ваша библиотека будет доступна для приложения, потому что она добавляется в проект после применения плагина.

Если все еще запутывает, вам очень повезло, потому что проект, который я реализовал это решение, находится на Github, поэтому вы можете его разветвить, скопировать проект плагина и внести необходимые изменения.

Проект называется Flender, и он используется для аннотирования методов, требующих проверки подключения. Вот ссылка https://github.com/jd-alexander/flender

Надеюсь, этот ответ поможет.