Intereting Posts

Как разместить мои библиотеки перед android.jar, отредактировав build.gradle в Android-Studio

Сначала Вот мой путь построения Java в Eclipse: Введите описание изображения здесь

Эти четыре jars 'common.jar, core.jar, framework.jar, layout.jar' упакованы из исходного кода Android, который содержит некоторые классы, которые не могут быть общедоступны разработчиком. Им не нужно экспортировать, потому что они Для чит-компилятора. В Eclipse все в порядке.

Теперь я пытаюсь импортировать свой проект в Android-Studio с помощью gradle. Я добавляю банки в зависимости от них, но я не могу изменить порядок компиляции своих банок и андроид-банок. Я не могу поставить эти банки перед андроидным jar. Я не знаком с градиентом, теперь компилятор не может найти классы в этих баночках. Любая помощь будет оценена! Вот мой build.gradle:

apply plugin: 'android' dependencies { compile files('jars/common.jar') compile files('jars/core.jar') compile files('jars/framework.jar') compile files('jars/layout.jar') compile fileTree(dir: 'libs', include: '*.jar') compile files('jars/animation_nineoldandroids_src.jar') compile files('jars/json_simple_src.jar') compile files('jars/jsoup-1.7.2-sources.jar') } android { compileSdkVersion 17 buildToolsVersion "21.1.1" sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } // Move the tests to tests/java, tests/res, etc... instrumentTest.setRoot('tests') // Move the build types to build-types/<type> // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... // This moves them out of them default location under src/<type>/... which would // conflict with src/ being used by the main source set. // Adding new build types or product flavors should be accompanied // by a similar customization. debug.setRoot('build-types/debug') release.setRoot('build-types/release') } } 

Solutions Collecting From Web of "Как разместить мои библиотеки перед android.jar, отредактировав build.gradle в Android-Studio"

Следующий сценарий работает для меня:

 allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:/mylib.jar') } } } 

Вы не можете делать то, что хотите в Gradle (*), по крайней мере, в обозримом будущем в то время, когда это написано. Несколько проблем мешают вам:

  • Gradle не упорядочивает зависимости в пути сборки, как это делает Eclipse, и это то, что вы делали, чтобы поставить свои классы впереди android.jar . У Gradle есть философия, что вы должны быть откровенными в отношении зависимостей в своей сборке, поэтому происходящее понятно и повторяемо; Системы, которые полагаются на порядок классов, имеют тенденцию быть тонкими и хрупкими. Итак, что вам нужно сделать, – сказать Gradle, что ваш проект зависит от ваших пользовательских классов, а не от android.jar , но DSL плагина не дает вам средств для этого. Есть несколько дискуссий на http://forums.gradle.org/gradle/topics/classpath_ordering_again и http://www.gradle.org/docs/current/userguide/dependency_management.html
  • Другой способ взглянуть на это – ссылка на android.jar жестко закодирована в плагин Android Gradle, поэтому вы не можете получить эту зависимость и заменить ее чем-то другим.

(*) Сказав все это, ничего невозможного – вы можете заставить его работать, но вам придется что-то взломать, так что это будет больше проблем, чем подход Eclipse, и более жестко поддерживать в Лицо SDK и обновления инструментальных средств. И когда что-то пойдет не так, вы будете сами.

  • Вы можете собрать свой собственный SDK со своим собственным android.jar .
  • Вы можете взломать плагин Android Gradle. Этот подход определенно будет жестким – кривая обучения там довольно крутая, и код находится в тяжелом развитии, что будет проблемой обслуживания, поскольку вы пытаетесь оставаться в курсе последних событий.

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

Я решил проблему с этой должности, чтобы создать приложение с системными библиотеками:

Предположим, вы добавили системные библиотеки, такие как libframework.jar и libcore.jar в app/libs :

  • Добавьте Xbootclasspath в свой верхний уровень build.gradle :

     allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:app/libs/libframework.jar:app/libs/libcore.jar') } } } 
  • В вашем приложении build.gradle , используйте:

     dependencies { provided fileTree(include: ['*.jar'], dir: 'libs') } 
  • В том же приложении build.gradle добавьте задачу, чтобы поставить <orderEntry> на Android API 25 Platform на последней позиции в app.iml , таким образом, град будет учитывать ваши системные библиотеки сначала и Android SDK в последнем случае:

     preBuild { doLast { def imlFile = file(project.name + ".iml") println 'Change ' + project.name + '.iml order' try { def parsedXml = (new XmlParser()).parse(imlFile) def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' } parsedXml.component[1].remove(jdkNode) def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform" new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK']) groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile)) } catch (FileNotFoundException e) { // nop, iml not found } } } 

Вы можете сделать это автоматически, как в Eclipse:

File > Project structure... > (select app in Modules) > (go to Dependencies tab) > reposition with arrows on the right

Другой способ – отредактировать файл [AppName] .iml в папке, в которой находится ваше приложение. То, что вы хотите изменить, это теги в конце файла. Тем не менее, Android Studio будет изменять их каждый раз при очистке или повторном открытии проекта.

  1. Сделать dir (ex: exlibs)
  2. Скопируйте файл jar в exlibs dir
  3. ..

     dependencies { provided files("$projectDir/exlibs/yourlib.jar") } 

Я использую следующий сценарий – идеальное решение!

  1. Добавьте свой XXX.jar в библиотеку
  2. Затем измените «Сфера» на «Предоставлено»
  3. Найдите это в своем проекте .gradle :

    allprojects { repositories { jcenter() } }

  4. Измените его на:

    allprojects { repositories { jcenter() } gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\XXX.jar') } } }

  5. В файле YourApplicationName.iml скорректируйте XXX.jar сверху, например

Так, это нормально!

Обновите приложение app / app.iml, как

 <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="library" exported="" name="common" level="project" /> <orderEntry type="library" exported="" name="framework" level="project" /> <orderEntry type="library" exported="" name="layout" level="project" /> <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" /> 

Самое простое решение для меня заключалось в замене android.jar на один со скрытым API. Получите android.jar из этой проектной библиотеки, которая обеспечивает доступ к скрытому API-интерфейсу Android и внутренним ресурсам и поместит его в папку плат ASDK на платформу, которую вы компилируете ( compileSdkVersion ).

Я уверен, что он работает и с Eclipse))