d8

d8, Android Studio ve Android Gradle eklentisinin, projenizin Java bayt kodunu Android cihazlarda çalıştırılan DEX bayt kodunda derlemek için kullandığı bir komut satırı aracıdır. d8, uygulamanızın kodunda Java 8 dili özelliklerini kullanmanıza olanak tanır.

d8, Android Derleme Araçları 28.0.1 ve sonraki sürümlerde bağımsız bir araç olarak da bulunur: android_sdk/build-tools/version/.

Genel kullanım

d8 için yalnızca DEX bayt koduna dönüştürmek istediğiniz derlenmiş Java bayt koduna giden bir yol gerekir. Örneğin:

d8 MyProject/app/build/intermediates/classes/debug/*/*.class

Giriş bayt kodu, *.class dosyası ya da JAR, APK veya ZIP dosyaları gibi herhangi bir kapsayıcı kombinasyonunda olabilir. Ayrıca, DEX çıkışıyla birleştirmek üzere d8 için DEX dosyaları da ekleyebilirsiniz. Bu, artımlı derlemenin çıkışını dahil ederken faydalıdır.

Varsayılan olarak d8, Java bayt kodunu optimize edilmiş DEX dosyalarında derler ve çalışma zamanında kodunuzda hata ayıklamak için kullanabileceğiniz hata ayıklama bilgilerini içerir. Bununla birlikte, artımlı bir derleme gerçekleştirmek için isteğe bağlı işaretler ekleyebilir, ana DEX dosyasında derlenmesi gereken sınıflar belirtebilir ve Java 8 dili özelliklerini kullanmak için gereken ek kaynaklara giden yolları belirtebilirsiniz.

d8 path-to-input-files [options]

Aşağıdaki tabloda, d8 ile kullanabileceğiniz isteğe bağlı işaretler açıklanmaktadır:

Option Açıklama
--debug

Hata ayıklama sembol tabloları gibi hata ayıklama bilgilerini eklemek için DEX bayt kodunu derleyin.

Bu seçenek varsayılan olarak etkindir. d8, hata ayıklama bilgilerini DEX bayt kodunuza eklemek için, giriş Java bayt kodunun bu bilgileri içermesini bekler. Örneğin, kodunuzu derlemek için javac kullanıyorsanız çıkıştaki Java bayt koduna hata ayıklama bilgileri eklemek için -g işaretini iletmeniz gerekir.

Uygulamanızın veya kitaplığınızın sürüm sürümü için DEX dosyalarını derlerken bunun yerine --release işaretini kullanın.

--release

Hata ayıklama bilgileri olmadan DEX bayt kodunu derleyin. Bununla birlikte d8, yığın izleme oluştururken ve istisnaları günlüğe kaydederken kullanılan bazı bilgileri içerir.

Herkese açık bir sürüm için bayt kodu derlerken bu işareti iletin.

--output path

DEX çıkışı için istenen yolu belirtin. Varsayılan olarak d8, DEX dosyalarını geçerli çalışma dizininde oluşturur.

Bir ZIP veya JAR dosyasının yolunu ve adını belirtirseniz d8, belirtilen dosyayı oluşturur ve çıkış DEX dosyalarını ekler. Mevcut bir dizinin yolunu belirtirseniz d8, bu dizindeki DEX dosyalarını oluşturur.

--lib android_sdk/platforms/api-level/android.jar Android SDK'nızın android.jar yolunu belirtin. Bu işaret, Java 8 dil özelliklerini kullanan bayt kodu derlerken gereklidir.
--classpath path Projenizin DEX dosyalarını derlemek için d8 tarafından gerekebilecek classpath kaynaklarını belirtin. d8, özellikle Java 8 dil özelliklerini kullanan bayt kodunu derlerken belirli kaynakları belirtmenizi gerektirir.
--min-api number Çıkış DEX dosyalarının desteklemesini istediğiniz minimum API düzeyini belirtin.
--intermediate Projenizin Java bayt kodunun tamamını derlemediğinizi d8 konusunda bilgilendirmek için bu işareti iletin. Bu işaret, artımlı derlemeler gerçekleştirirken kullanışlıdır. d8, bir cihazda çalıştırmayı beklediğiniz optimize edilmiş DEX dosyalarını derlemek yerine, ara DEX dosyaları oluşturur ve bunları belirtilen çıkışta veya varsayılan yolda depolar.

Bir cihazda çalıştırmak istediğiniz DEX dosyalarını derlemek istediğinizde bu işareti hariç tutun ve ara DEX sınıflarının yolunu giriş olarak belirtin.

--file-per-class

Her sınıfı ayrı DEX dosyalarında derleyin.

Bu işareti etkinleştirmek, yalnızca değişen sınıfları yeniden derleyerek daha fazla artımlı derlemeler gerçekleştirmenizi sağlar. Android Gradle eklentisini kullanarak artımlı derlemeler gerçekleştirirken bu optimizasyon varsayılan olarak etkinleştirilir.

Bu işareti, --main-dex-list belirtilirken de kullanamazsınız.

--no-desugaring Java 8 dili özelliklerini devre dışı bırakın. Bu işareti yalnızca Java 8 dili özelliklerini kullanan Java bayt kodunu derlemek istemiyorsanız kullanın.
--main-dex-list path

Ana DEX dosyasına d8 içermesi gereken sınıfları listeleyen bir metin dosyası belirtin. Bu dosya genellikle classes.dex olarak adlandırılır. Bu işareti kullanarak bir sınıf listesi belirtmediğinizde d8, ana DEX dosyasına hangi sınıfların dahil edileceğini garanti etmez.

Uygulamanızı başlatırken Android sistemi önce ana DEX dosyasını yüklediğinden, başlangıçta belirli sınıfları ana DEX dosyasında derleyerek önceliklendirmek için bu işareti kullanabilirsiniz. Eski multidex kitaplığı yüklenene kadar çalışma zamanında yalnızca ana DEX dosyasındaki sınıflar kullanılabilir. Bu nedenle bu yöntem, özellikle eski multidex'i desteklerken faydalıdır.

Her DEX dosyasının yine de 64K referans sınırını karşılaması gerektiğini unutmayın. Bu nedenle, ana DEX dosyası için çok fazla sınıf belirtmeyin. Aksi takdirde derleme hatası alırsınız. Varsayılan olarak, --main-dex-list kullanarak sınıf belirtirken, d8 yalnızca ana DEX dosyasındaki sınıfları içerir. Bunun amacı, ana DEX dosyasında eksik olan sınıflarla ilgili sorunlarda hata ayıklamayı kolaylaştırmaktır. --release modunu belirtirseniz d8, 64K sınırına ulaşılana kadar ana DEX dosyasına mümkün olduğunca fazla sınıf ekleyerek uygulamanızın sürüm sürümüne paketlenen DEX dosyalarının sayısını azaltmaya çalışır.

Bu işareti, --file-per-class belirtilirken de kullanamazsınız.

--pg-map file Dağıtım için eşleme dosyası olarak file kullan.
--file-per-class-file

Her giriş .class dosyası için ayrı bir DEX dosyası oluşturun.

Sentetik sınıfları kaynak sınıflarıyla tutun.

--desugared-lib file

Şekerden arındırılmış bir kitaplık yapılandırması belirtin.

file, JSON biçiminde şekeri ayrıştırılmış kitaplık yapılandırma dosyasıdır.

--main-dex-rules file ProGuard, sınıfların birincil DEX dosyasına yerleştirileceği kuralları korur.
--main-dex-list-output file file içinde ana DEX listesini sağlayan çıkış.

--force-enable-assertions [:class_or_package_name...]

--force-ea [:class_or_package_name...]

javac tarafından oluşturulan onaylama kodunu zorla etkinleştirin.

--force-disable-assertions [:class_or_package_name...]

--force-da [:class_or_package_name...]

javac tarafından oluşturulan onaylama kodunu zorla devre dışı bırakın. Bu, DEX dosyaları oluşturulurken javac onaylama kodunun varsayılan olarak işlenmesidir.

--force-passthrough-assertions [:class_or_package_name...]

--force-pa [:class_or_package_name...]

javac tarafından oluşturulan onaylama kodunu değiştirmeyin. Bu, class dosyası oluşturulurken javac onaylama kodunun varsayılan olarak işlenmesidir.

--force-assertions-handler:handler method [:class_or_package_name...]

--force-ah:handler method [:class_or_package_name...]

handler method yöntemini atmak yerine her onaylama hatasıyla çağırmak için javac ve kotlinc tarafından oluşturulan onay kodunu değiştirin. handler method, bir sınıf adı ve ardından, bir nokta ve yöntem adı şeklinde belirtilir. İşleyici yöntemi, java.lang.Throwable türünde tek bir bağımsız değişken almalı ve void dönüş türüne sahip olmalıdır.
--thread-count number of threads Derleme için kullanılacak iş parçacığı sayısını belirtin. Belirtilmezse sayı, çekirdek sayısı dikkate alınarak buluşsal yöntemleri temel alır.
--map-diagnostics[ :type] from-level to-level type harita teşhisi (varsayılan herhangi bir) from-level ile to-level olarak raporlanmıştır. Burada from-level ve to-level "bilgi", "uyarı" veya "hata" değerlerinden biridir. İsteğe bağlı type ise bir teşhisin basit veya tam Java türü adıdır. type belirtilmezse from-level içindeki tüm teşhisler eşlenir. Önemli derleyici hatalarının eşlenemediğini unutmayın.
--version Şu anda kullandığınız d8 sürümünü yazdırın.
--help d8 kullanımı için yardım metnini yazdırın.

Artımlı derlemeler gerçekleştirme

Geliştirme sırasında (ör. sürekli entegrasyon derlemelerinde) derleme hızlarını artırmak için d8 ürününe projenizin Java bayt kodunun yalnızca bir alt kümesini derlemesi talimatını verin. Örneğin, sınıf başına sıralamayı etkinleştirirseniz yalnızca önceki derlemeden sonra değiştirdiğiniz sınıfları yeniden derleyebilirsiniz.

Aşağıdaki komut, birkaç sınıfın kademeli bir derlemesini gerçekleştirir ve sınıf başına dexing işlevini etkinleştirir. Komut, artımlı derleme için bir çıkış dizini de belirtir.

d8 MainActivity.class R.class --intermediate --file-per-class --output ~/build/intermediate/dex

d8, artımlı bir derleme gerçekleştirdiğinde ek bilgileri DEX çıktısında depolar. d8 daha sonra bu bilgileri, --main-dex-list seçeneğini doğru şekilde işlemek ve uygulamanızın tam derlemesi sırasında DEX dosyalarını birleştirmek için kullanır.

Örneğin, Java 8 lambda sınıflarını işlerken d8, her bir giriş sınıfı için hangi lambda sınıflarının oluşturulduğunu takip eder. Tam derleme sırasında d8 ana DEX dosyasında bir sınıf içerdiğinde bu sınıf için oluşturulan tüm lambda sınıflarının ana DEX dosyasına da dahil edildiğinden emin olmak için meta verilere başvurur.

Projenizin bayt kodunun tamamını birden çok artımlı derlemede DEX dosyaları olarak derlediyseniz aşağıdaki komutta gösterildiği gibi ara DEX dosyaları dizinini d8 öğesine ileterek tam bir derleme gerçekleştirin. Ayrıca, d8 ürününün --main-dex-list kullanarak ana DEX dosyasında derlemesini istediğiniz sınıfları belirtebilirsiniz. Giriş, DEX bayt kodunda derlenmiş bir dosya grubu olduğundan bu derleme temiz bir derlemeden daha hızlı tamamlanır.

d8 ~/build/intermediate/dex --release --main-dex-list ~/build/classes.txt --output ~/build/release/dex

Java 8 dili özelliklerini kullanan bayt kodu derleme

d8, şekeri giderme adı verilen bir derleme işlemi aracılığıyla kodunuzda Java 8 dili özelliklerini kullanmanızı sağlar. Susuztan arındırma, bu yararlı dil özelliklerini Android platformunda çalıştırılabilen bayt koduna dönüştürür.

Android Studio ve Android Gradle eklentisi, d8 ürününün şeker gidermeyi sizin için etkinleştirmek üzere gerektirdiği sınıf yolu kaynakları içerir. Ancak d8 komut satırından kullanıldığında bunları sizin eklemeniz gerekir.

Bu kaynaklardan biri, hedef Android SDK'nızdaki android.jar'dir. Bu kaynak, bir dizi Android platformu API'sini içerir. --lib işaretini kullanarak yolunu belirtin.

Diğer bir kaynak ise projenizde derlenen ve şu anda DEX bayt kodunda derlemediğiniz, ancak diğer sınıfları DEX bayt kodunda derlemeniz gereken Java bayt kodu kümesidir.

Örneğin, kodunuzda bir Java 8 dili özelliği olan varsayılan ve statik arayüz yöntemleri kullanılıyorsa tüm bayt kodunu DEX bayt kodunda derlemek istemeseniz bile projenizin tüm Java bayt kodunun yolunu belirtmek için bu işareti kullanmanız gerekir. Çünkü d8, projenizin kodunu anlamak ve arayüz yöntemlerine yapılan çağrıları çözümlemek için bu bilgilere ihtiyaç duyar.

Aşağıdaki kod örneği, varsayılan arayüz yöntemine erişen bir sınıfın kademeli bir derlemesini gerçekleştirir:

d8 MainActivity.class --intermediate --file-per-class --output ~/build/intermediate/dex
--lib android_sdk/platforms/api-level/android.jar
--classpath ~/build/javac/debug