Мені цікаво, чи хтось намагався використовувати нові функції Java 7 з Android? Я знаю, що Android читає байт-код, який виплює Java, і перетворює його в dex. Тож я гадаю, що моє запитання: чи може він зрозуміти байт-код Java 7?
Мені цікаво, чи хтось намагався використовувати нові функції Java 7 з Android? Я знаю, що Android читає байт-код, який виплює Java, і перетворює його в dex. Тож я гадаю, що моє запитання: чи може він зрозуміти байт-код Java 7?
Відповіді:
Якщо ви використовуєте Android Studio , мова Java 7 повинна бути включена автоматично, без патчів. Для випробування ресурсу потрібен рівень API 19+, а матеріали NIO 2.0 відсутні.
Якщо ви не можете використовувати функції Java 7, перегляньте відповідь @Nuno про те, як редагувати свої build.gradle
.
Далі наведено лише для історичного інтересу.
Невелику частину Java 7, безумовно, можна використовувати з Android (зауважте: я протестував лише на 4.1).
Перш за все, ви не можете використовувати ADT Eclipse, оскільки жорстко закодовано, що лише компілятори Java 1.5 і 1.6 відповідають. Ви можете перекомпілювати ADT, але я вважаю, що немає простого способу зробити це окрім перекомпіляції всього Android разом.
Але вам не потрібно використовувати Eclipse. Наприклад, Android Studio 0.3.2 , IntelliJ IDEA CE та інші IDE на базі javac підтримує компіляцію на Android, і ви можете встановити відповідність навіть до Java 8 за допомогою:
Це дозволяє лише мови мови 7 , і ви навряд чи зможете скористатися чим-небудь, оскільки половина удосконалень також надходить з бібліотеки. Ви можете скористатися функціями, які не залежать від бібліотеки:
<>
)catch (Exc1 | Exc2 e)
)1_234_567
)0b1110111
)І ці функції не можуть бути використані ще :
try
-with-Resources - тому що для цього потрібен неіснуючий інтерфейс "java.lang.AutoCloseable" (це може використовуватися публічно в 4.4+)... "поки" :) Виявляється, хоч бібліотека Android орієнтована на 1.6, джерело Android містить інтерфейси, такі як AutoCloseable, а традиційні інтерфейси, такі як Closeable , успадковуються від AutoCloseable (SafeVarargs насправді відсутній). Ми могли підтвердити його існування за допомогою роздумів. Вони приховані просто тому, що у Javadoc є @hide
тег, який змусив "android.jar" не включати їх.
Існує вже як існуюче питання Як створити Android SDK за допомогою прихованих та внутрішніх API? про те, як повернути ці методи. Вам потрібно просто замінити існуючу посилання на "android.jar" поточної Платформи на нашу індивідуальну, тоді багато API Java 7 стануть доступними (процедура схожа на процедуру Eclipse. Перевірте структуру проекту → SDK.)
Окрім функції автоматичного закриття, (лише) розкриваються також такі функції бібліотеки Java 7 :
Це в основному все. Зокрема, NIO 2.0 не існує, а Arrays.asList все ще не є @SafeVarargs.
nio2
а інші смаколики, безумовно, будуть хорошою новиною.
AutoCloseable
інтерфейс не існує в режимі виконання Android до ICS (або, можливо, до HoneyComb). Тож навіть якщо ви користуєтеся виправленим android.jar, ви отримаєте NoClassDefFoundError
в системі 2.x.
invokedynamic
яка не підтримується JVM, орієнтованою на Java 6.
EDIT: На момент написання цього запису останній реліз був Android 9 та Eclipse Indigo. З того часу все змінилося.
Так, я спробував. Але це не чудовий тест, оскільки сумісність була обмежена до рівня 6, оскільки жодним простим способом не можна використовувати Java 7:
Тоді я встановив останню версію Android SDK (EDIT: Honeycomb, API13, на момент написання цієї публікації). Він знайшов мій JDK 7 та встановлений належним чином. Те саме для ADT.
Але у мене був сюрприз, коли я намагався скласти та запустити програму Hello Word для Android. Сумісність була встановлена на Java 6, але ніяк не можна змусити її до Java 7:
Так що я був Hello World працює, а також інші додатки, більш складні і використовуючи SQLite
, Listview
, Sensor
іCamera
, але це тільки доводить , що звернення з Java 7 сумісність , здається, добре зроблено і працює з Android.
Отже, хтось намагався зі старим добрим Мурашком обійти обмеження затемнення, яке бачимо вище?
У будь-якому випадку, SDK розроблений для використання з Java 5 або 6, як пояснено тут .
У нас може щось працювати з Java 7, але це працюватиме «випадково». Будівля DEX може працювати належним чином чи ні, і коли DEX побудований, він може працювати чи ні. Це тому, що використання некваліфікованого JDK дає непередбачувані результати за визначенням.
Навіть якщо хтось успішно створив додаток для Android під простою Java 7, це не може відповідати JDK. Той самий процес, застосований до іншої програми, може бути невдалим, або в результаті цього додатка можуть бути помилки, пов'язані з використанням цього JDK. Не рекомендовано.
Для тих, хто бере участь у розробці веб-сайтів, це точно так само, як розгортання веб-програми, побудованої під Java 5 або 6 під сервером додатків, кваліфікованим лише для Java 4 (скажімо, наприклад, Weblogic 8). Це може спрацювати, але це не те, що можна рекомендувати для інших цілей, ніж намагатися.
Цитата від dalvikvm.com:
dx, що входить до Android SDK, перетворює файли класів Java класів Java, складені звичайним компілятором Java, у інший формат файлу класу (формат .dex)
Це означає, що вихідний файл .java не має значення, це лише байт-код .class.
Наскільки я знаю, до байт-коду JVM на Java 7 додано лише викликаний динамік , решта сумісна з Java 6. Сама мова Java не використовує анкідінамічну . Інші нові функції, такі як оператор перемикання за допомогою String s або multi- catch - це лише синтатичний цукор і не потребують змін байтового коду. Наприклад, multi- catch просто копіює блок- catch для кожного можливого винятку.
Єдина проблема повинна полягати в тому, що нові класи, представлені в Java 7, відсутні в Android, як-от AutoCloseable , тому я не впевнений, чи можете ви скористатися функцією try -with-ресурси (хтось спробував це?).
Будь-які коментарі до цього? Я щось пропускаю?
Що стосується Android SDK v15, поряд з Eclipse 3.7.1, Java 7 не підтримується для розробки Android. Встановлення сумісності джерела на 1,7 мандату, встановивши сумісність згенерованого файлу .class на 1,7, що призводить до наступної помилки компілятора Android:
Для Android потрібен рівень відповідності компілятора 5,0 або 6,0. Знайдено "1,7" замість цього. Скористайтеся інструментами Android> Виправити властивості проекту.
Щоб розгорнути вищевказану відповідь від @KennyTM, якщо ви орієнтуєтесь на версію 4.0.3 і вище ( minSdkVersion = 15 ), ви можете використовувати приховані API, додавши кілька класів до SDK android.jar вашої цілі.
Як тільки ви це зробите, ви можете користуватися пробними ресурсами на будь-якому Closeable, а також реалізовувати AutoCloseable у власних класах.
Я зробив zip, що містить джерела та бінарні файли всіх класів, які потрібно було змінити в android.jar, щоб зробити ці API доступними. Вам просто потрібно розпакувати його і додати бінарні файли до своїх
android-sdk / платформи / android-NN / android.jar
Завантажити його можна звідси: http://db.tt/kLxAYWbr
Також слід зазначити, що за останні пару місяців Елліотт Х'юз зробив кілька зобов’язань для дерева Android: завершив функцію автоматичного зачинення , додав SafeVarargs , відкрив різні API , виправив захищений конструктор Throwable та додав підтримку файлів класу версії 51 у dx . Тож, нарешті, деякий прогрес відбувається.
Редагувати (квітень 2014 р.):
З випуском SDK 19 більше не потрібно латувати android.jar додатковими API.
Кращий спосіб використання примірочних з-ресурсів в Android Studio для додатка , що цілі 4.0.3 і вище ( minSdkVersion = 15 ) буде додати наступне compileOptions
до вашого build.gradle
:
android {
compileSdkVersion 19
buildToolsVersion '19.0.3'
defaultConfig {
minSdkVersion 15
targetSdkVersion 19
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
Android Studio поскаржиться, що пробні ресурси не можна використовувати з цим рівнем API, але мій досвід полягає в тому, що він може. Проект буде створюватися і працювати без проблем на пристроях з версією 4.0.3 і вище. У мене не виникло жодних проблем із цим додатком, встановленим на пристрої 500k +.
Щоб ігнорувати це попередження, додайте до свого lint.xml
:
<issue id="NewApi">
<ignore regexp="Try-with-resources requires API level 19"/>
</issue>
Здається, що змусити це працювати з чистими мурахами - це чимось хитрощі.
Але це працювало для мене: http://www.informit.com/articles/article.aspx?p=1966024
custom_rules.xml
, дивіться мою відповідь тут: stackoverflow.com/a/24608415/194894
Для того, щоб використовувати функції Java 7 у створенні коду за допомогою системи збирання мурашок на базі Android, просто покладіть custom_rules.xml
у кореневому каталозі своїх проектів наступне :
custom_rules.xml:
<project name="custom_android_rules">
<property name="java.target" value="1.7" />
<property name="java.source" value="1.7" />
</project>
Деяких людей може зацікавити цей проект git, який я знайшов, і, здається, дозволяє запускати Java 7 на android. https://github.com/yareally/Java7-on-Android
Однак занадто великий ризик, якщо я додам це до поточного проекту, над яким я працюю. Тож я зачекаю, поки Google офіційно підтримає Java 7.