Hanya ingin tahu apakah ada yang sudah mencoba menggunakan fitur Java 7 baru dengan Android? Saya tahu bahwa Android membaca bytecode yang dimuntahkan Java dan mengubahnya menjadi dex. Jadi saya kira pertanyaan saya adalah dapatkah ia memahami bytecode Java 7?
188
Jawaban:
Jika Anda menggunakan Android Studio , Jawa 7 bahasa harus diaktifkan secara otomatis tanpa patch. Try-with-resource membutuhkan API Level 19+, dan NIO 2.0 tidak ada.
Jika Anda tidak dapat menggunakan fitur Java 7, lihat jawaban @Nuno tentang cara mengedit
build.gradle
.Berikut ini hanya untuk kepentingan historis.
Sebagian kecil Java 7 tentu dapat digunakan dengan Android (catatan: Saya baru menguji pada 4.1).
Pertama-tama, Anda tidak bisa menggunakan ADT Eclipse karena hard-coded yang hanya memenuhi kompiler Java 1.5 dan 1.6. Anda dapat mengkompilasi ulang ADT tetapi saya menemukan tidak ada cara sederhana untuk melakukannya selain mengkompilasi ulang seluruh Android bersama-sama.
Tetapi Anda tidak perlu menggunakan Eclipse. Misalnya, Android Studio 0.3.2 , IntelliJ IDEA CE dan IDE berbasis javac lainnya mendukung kompilasi ke Android dan Anda dapat mengatur kepatuhan bahkan hingga Java 8 dengan:
Ini hanya memungkinkan fitur bahasa Java 7 , dan Anda hampir tidak dapat mengambil manfaat dari apa pun karena setengah dari perbaikan juga berasal dari perpustakaan. Fitur yang dapat Anda gunakan adalah yang tidak bergantung pada perpustakaan:
<>
)catch (Exc1 | Exc2 e)
)1_234_567
)0b1110111
)Dan fitur-fitur ini tidak dapat digunakan lagi :
try
-dengan-sumber daya - karena memerlukan antarmuka yang tidak ada "java.lang.AutoCloseable" (ini dapat digunakan untuk umum di 4.4+)... "yet" :) Ternyata, meskipun perpustakaan Android menargetkan untuk 1.6, sumber Android memang mengandung antarmuka seperti AutoCloseable dan antarmuka tradisional seperti Closeable memang mewarisi dari AutoCloseable (SafeVarargs benar-benar hilang, meskipun). Kami bisa mengkonfirmasi keberadaannya melalui refleksi. Mereka disembunyikan hanya karena Javadoc memiliki
@hide
tag, yang menyebabkan "android.jar" tidak memasukkan mereka.Sudah ada pertanyaan yang sudah ada Bagaimana cara membangun Android SDK dengan API internal dan tersembunyi tersedia? tentang cara mendapatkan metode tersebut kembali. Anda hanya perlu mengganti referensi "android.jar" yang ada dari Platform saat ini dengan yang kami sesuaikan, maka banyak Java 7 API akan tersedia (prosedurnya mirip dengan yang ada di Eclipse. Periksa Struktur Proyek → SDK.)
Selain AutoCloseable, (hanya) fitur Java 7 library berikut juga terungkap:
Itu pada dasarnya semua. Secara khusus, NIO 2.0 tidak ada, dan Arrays.asList masih belum @SafeVarargs.
sumber
nio2
dan barang lainnya pasti akan menjadi kabar baik.AutoCloseable
antarmuka tidak ada di Android runtime sampai ICS (atau mungkin sampai HoneyComb). Jadi, bahkan jika Anda menggunakan tambalan android.jar Anda akan menerimaNoClassDefFoundError
pada sistem 2.x.invokedynamic
yang tidak didukung oleh JVM yang menargetkan Java 6.EDIT: Pada saat ini ditulis, rilis terbaru adalah Android 9 dan Eclipse Indigo. Hal telah berubah sejak saat itu.
Ya, saya sudah mencoba. Tapi ini bukan tes yang bagus karena kompatibilitasnya terbatas pada level 6 tanpa cara (setidaknya tidak ada cara sederhana) untuk benar-benar menggunakan java 7:
Kemudian saya menginstal Android SDK versi terbaru (EDIT: Honeycomb, API13, pada saat tulisan ini ditulis). Ia menemukan JDK 7 saya dan diinstal dengan benar. Sama untuk ADT.
Tapi saya terkejut ketika mencoba mengkompilasi dan menjalankan aplikasi Hello Word Android. Kompatibilitas diatur ke Java 6 tanpa ada cara untuk memaksanya ke Java 7:
Jadi saya punya Hello World bekerja, dan juga aplikasi lain yang lebih rumit dan menggunakan
SQLite
,Listview
,Sensor
danCamera
, tapi ini hanya membuktikan bahwa kompatibilitas penanganan Jawa 7 tampaknya harus dilakukan dengan baik dan bekerja dengan Android.Jadi, apakah seseorang mencoba dengan semut tua yang baik, untuk melewati batasan Eclipse yang terlihat di atas?
Bagaimanapun, SDK dirancang untuk digunakan dengan Java 5 atau 6, seperti yang dijelaskan sini .
Kami mungkin memiliki sesuatu yang bekerja dengan Java 7, tetapi itu akan berfungsi "secara tidak sengaja". Bangunan DEX dapat berfungsi dengan baik atau tidak, dan begitu DEX dibangun, mungkin berhasil atau tidak. Ini karena menggunakan JDK yang tidak memenuhi syarat memberikan hasil yang tidak terduga menurut definisi.
Bahkan jika seseorang telah berhasil membangun aplikasi Android di bawah Java 7, ini tidak memenuhi syarat JDK. Proses yang sama yang diterapkan pada aplikasi lain mungkin gagal, atau aplikasi yang dihasilkan mungkin memiliki bug yang terkait dengan penggunaan JDK itu. Tidak direkomendasikan.
Bagi mereka yang terlibat dalam pengembangan webapps, ini persis sama dengan menyebarkan aplikasi web yang dibangun di bawah Java 5 atau 6 di bawah server aplikasi yang memenuhi syarat untuk Java 4 saja (katakanlah misalnya Weblogic 8 misalnya). Ini mungkin berhasil, tetapi ini bukan sesuatu yang dapat direkomendasikan untuk tujuan lain selain mencoba.
sumber
Kutipan dari dalvikvm.com:
Itu berarti, file sumber .java tidak masalah, itu hanya bytecode .class.
Sejauh yang saya tahu, hanya invokedynamic yang ditambahkan ke bytecode JVM di Java 7, sisanya kompatibel dengan Java 6. Bahasa Java sendiri tidak menggunakan invokedynamic . Fitur baru lainnya, seperti pernyataan switch menggunakan String s atau multi- catch hanyalah gula sintaksis dan tidak memerlukan perubahan kode byte. Sebagai contoh, multi- catch hanya menyalin catch -block untuk setiap kemungkinan pengecualian.
Satu-satunya masalah adalah bahwa kelas-kelas baru yang diperkenalkan di Java 7 hilang di Android, seperti AutoCloseable , jadi saya tidak yakin apakah Anda dapat menggunakan fitur try -with-resources (seseorang mencobanya?).
Ada komentar tentang itu? Apakah saya melewatkan sesuatu?
sumber
Pada Android SDK v15, bersama dengan Eclipse 3.7.1, Java 7 tidak didukung untuk pengembangan Android. Mengatur kompatibilitas sumber ke 1,7 mandat pengaturan kompatibilitas file .class yang dihasilkan ke 1,7, yang mengarah ke kesalahan berikut oleh kompiler Android:
sumber
Untuk memperluas jawaban di atas oleh @ KennyTM, jika Anda menargetkan 4.0.3 dan lebih tinggi ( minSdkVersion = 15 ), Anda dapat menggunakan API tersembunyi dengan menambahkan beberapa kelas ke SDK android.jar target Anda.
Setelah Anda melakukan ini, Anda dapat menggunakan coba-dengan-sumber daya pada Closeable apa pun, serta menerapkan AutoCloseable di kelas Anda sendiri.
Saya telah membuat zip yang berisi sumber dan binari dari semua kelas yang perlu dimodifikasi di android.jar untuk membuat API ini tersedia. Anda hanya perlu membongkar dan menambahkan binari ke
android-SDK / platform / Android-NN / Android.jar Anda
Anda dapat mengunduhnya dari sini: http://db.tt/kLxAYWbrYang juga perlu diperhatikan adalah bahwa, dalam beberapa bulan terakhir, Elliott Hughes telah membuat beberapa komitmen pada pohon Android: menghabisi AutoCloseable , menambahkan SafeVarargs , menambah berbagai API , memperbaiki konstruktor yang dilindungi Throwable dan menambahkan dukungan untuk file kelas versi 51 di dx . Jadi, akhirnya ada beberapa kemajuan yang terjadi.
Edit (April 2014):
Dengan dirilisnya SDK 19, Anda tidak perlu lagi menambal android.jar dengan API tambahan.
Metode terbaik untuk menggunakan coba-dengan-sumber daya di Android Studio untuk aplikasi yang menargetkan 4.0.3 dan di atasnya ( minSdkVersion = 15 ) adalah menambahkan yang berikut
compileOptions
kebuild.gradle
:Android Studio akan mengeluh bahwa coba-dengan-sumber daya tidak dapat digunakan dengan level API ini, tetapi pengalaman saya adalah bahwa hal itu bisa. Proyek ini akan dibangun dan dijalankan tanpa masalah pada perangkat dengan 4.0.3 dan lebih tinggi. Saya tidak mengalami masalah dengan ini, dengan aplikasi yang telah diinstal ke perangkat 500k +.
Untuk mengabaikan peringatan ini, tambahkan yang berikut ke
lint.xml
:sumber
Tampaknya membuat ini berfungsi dengan semut murni adalah sedikit omong kosong.
Tapi itu berhasil untuk saya: http://www.informit.com/articles/article.aspx?p=1966024
sumber
custom_rules.xml
, lihat jawaban saya di sini: stackoverflow.com/a/24608415/194894Untuk menggunakan fitur Java 7 dalam kode build oleh sistem build berbasis semut Android, cukup masukkan yang berikut ini di
custom_rules.xml
dalam direktori root proyek Anda:custom_rules.xml:
sumber
Beberapa orang mungkin tertarik dengan proyek git yang saya temukan ini, yang sepertinya memungkinkan untuk menjalankan Java 7 di android. https://github.com/yareally/Java7-on-Android
Namun terlalu banyak risiko jika saya menambahkan ini di proyek saat ini saya kerjakan. Jadi saya akan menunggu sampai Google secara resmi mendukung Java 7.
sumber