d8

d8, Android Studio ve Android Gradle eklentisinin yüklü olduğu bir komut satırı aracıdır. projenizin Java bayt kodunu çalıştıran DEX bayt koduna derlemek için Android cihazlarda kullanın. d8, Java 8 dil özelliklerini kodu kullanabilirsiniz.

d8, Android Build'e bağımsız bir araç olarak da dahildir 28.0.1 ve sonraki araçlar: android_sdk/build-tools/version/.

Genel kullanım

d8 için yalnızca derlenmiş Java bayt koduna yol gerekir dönüştürmeyi seçebilirsiniz. Örnek:

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

Giriş bayt kodu, *.class dosyalarının herhangi bir kombinasyonunda olabilir veya kapsayıcılar için geçerlidir. Şunları da ekleyebilirsiniz: d8 için DEX dosyalarının DEX çıkışıyla birleştirilmesi artımlı derlemelerden yararlanın.

d8, varsayılan olarak Java bayt kodunu optimize edilmiş DEX dosyaları halinde derler ve kendi başınıza yapabileceğiniz kodu hata ayıklamak için kullanabileceğiniz bir araçtır. Ancak, isterseniz flag'lerini artımlı bir derleme gerçekleştirmek için ana DEX dosyasında derlenmeli ve Java 8'in dil özelliklerini kullanmak için ek kaynaklar gerekli.

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ü gibi hata ayıklama bilgilerini eklemek için DEX bayt kodunu derleyin tablolarında anlatacağım.

Bu seçenek varsayılan olarak etkindir. Hata ayıklama bilgilerini DEX bayt kodu, d8, Java bayt kodunun girilmesini bekler bu bilgileri içerir. Örneğin, javac kullanıyorsanız derlemek için -g işaretini iletmeniz gerekir. çıkış Java bayt kodundaki hata ayıklama bilgilerini girin.

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

--release

Hata ayıklama bilgileri olmadan DEX bayt kodunu derleyin. Ancak, d8, oluşturma sırasında kullanılan bazı bilgileri içerir yığın izlemeleri (stack trace) ve günlük kaydı istisnalarını 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, mevcut çalışmadaki DEX dosyalarını üretir dizin.

Bir ZIP veya JAR dosyasının yolunu ve adını belirtirseniz d8 belirtilen dosyayı oluşturur ve çıkış DEX dosyalarını içerir. Şu durumda: mevcut bir dizinin yolunu belirtir, d8 bu dizindeki DEX dosyalarını içerebilir.

--lib android_sdk/platforms/api-level/android.jar Android SDK'nızın android.jar yolunu belirtin. Bu işaret, Java 8 dil özellikleri hakkında daha fazla bilgi edinin.
--classpath path d8 tarafından derlemek için gerekebilecek sınıf yolu kaynaklarını belirtin içe aktarmanızı sağlar. Özellikle, d8, kullanan bayt kodunu derlerken belirli kaynakları belirtebilirsiniz Java 8 dil özellikleri hakkında daha fazla bilgi edinin.
--min-api number Çıkış DEX dosyalarının desteklemesini istediğiniz minimum API düzeyini belirtin.
--intermediate d8 öğesini derlemediğinizi bildirmek için bu işareti iletin projenizin Java bayt kodu kümesinin tamamıdır. Bu işaret, geliştirmeyi öğreneceksiniz. Optimize edilmiş DEX dosyalarını derlemek yerine bir cihazda çalıştırmayı beklediğinizi varsayalım. d8, orta düzeyde DEX dosyaları oluşturur ve bunları belirtilen çıkışta veya varsayılan yolda depolar.

Bir cihazda çalıştırmayı düşündüğünüz DEX dosyalarını derlemek istediğinizde bu işareti hariç tut ve ara DEX sınıflarına giden yolu belirt giriş olarak kullanabilirsiniz.

--file-per-class

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

Bu işareti etkinleştirmek, yalnızca değiştirilen sınıfları yeniden derler. Performans sırasında kullanan artımlı derlemeler için bu optimizasyon varsayılan olarak etkindir.

Bu işareti aynı zamanda belirtirken de kullanamazsınız --main-dex-list

--no-desugaring Java 8 dil özelliklerini devre dışı bırakın. Bu işareti yalnızca amacınız yoksa kullanın kod, Java 8 dil özelliklerini kullanan Java bayt kodunu derlemek için kullanılır.
--main-dex-list path

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

Android sistemi başlangıçta ana DEX dosyasını yüklediğinden kullanıyorsanız, başlangıçta belirli sınıflara öncelik vermek için bu işareti kullanabilirsiniz ana DEX dosyasında derleyerek oluşturabilirsiniz. Bu, özellikle de (ör. yalnızca ana DEX'teki sınıflar) dosyasının, eski multidex kitaplığı kullanıma sunulana kadar çalışma zamanında erişilebilir olması yüklendi.

Her DEX dosyasının yine de 64K referans sınırını aşmamalıdır. Lütfen ana DEX dosyası için çok fazla sınıf belirtir veya derleme hatası. Varsayılan olarak, --main-dex-list, d8 yalnızca bunları içerir sınıflarından birini çağırın. Bu, sınıflarla ilgili sorunları ana DEX dosyasında yok. Hata ayıklaması daha kolay. Örneğin --release modunda, d8 sayıyı azaltmaya çalışıyor uygulamanızın sürüm sürümüne paketleyen DEX dosyalarından ana DEX dosyasında mümkün olduğunca çok sınıfa 64K sınırına ulaşıldı.

Bu işareti aynı zamanda belirtirken de kullanamazsınız --file-per-class

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

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

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

--desugared-lib file

Çıkarılan bir kitaplık yapılandırması belirtin.

file, JSON biçiminde kaldırılmış bir kitaplık yapılandırma dosyasıdır biçimindedir.

--main-dex-rules file Sınıfların her ay birincil DEX dosyası olabilir.
--main-dex-list-output file dosya içinde ana DEX listesini içeren çıkış elde edin.

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

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

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

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

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

javac tarafından oluşturulan onay kodunu zorla devre dışı bırakın. Bu aşağıdaki durumlarda javac onay kodunun varsayılan olarak işlenmesidir: DEX dosyaları oluşturmaktır.

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

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

javac tarafından oluşturulan onay kodunu değiştirmeyin. Bu aşağıdaki durumlarda javac onay kodunun varsayılan olarak işlenmesidir: class dosya oluşturuluyor.

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

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

javac ve kotlinc tarafından oluşturulan onayı değiştir her onay ile handler method yöntemini çağırmak için kod hatasıyla karşılaşırsınız. handler method belirtilmiş bir nokta ve yöntem adından sonra sınıf adı şeklinde değiştirebilirsiniz. İlgili içeriği oluşturmak için kullanılan işleyici yöntemi, şu türde tek bir bağımsız değişken almalıdır: java.lang.Throwable ve dönüş türü void.
--thread-count number of threads Derleme için kullanılacak iş parçacığı sayısını belirtin. Belirtilmemişse sayı, buluşsal yöntemlere dayanır, olduğunu unutmayın.
--map-diagnostics[ :type] from-level to-level type harita teşhisi (varsayılan herhangi bir) olarak bildirildi from-level - to-level, burada from-level ve to-level "bilgi", "uyarı" veya "hata" değerlerinden biridir ve isteğe bağlı type, basit veya tam nitelikli Teşhisin Java türü adı. type belirtilmediyse from-level adresindeki tüm teşhisler eşlendi. Önemli derleyici hatalarının eşlenemeyeceğ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.

Artımlı derlemeler yapma

Geliştirme sırasında derleme hızlarını iyileştirmek (ör. sürekli entegrasyon için) derlemeleri için d8 adlı projeye projenizin Java'sının yalnızca bir alt kümesini derlemesi için talimat verin bayt kodu ile eşdeğerdir. Örneğin, sınıfa özel dexing özelliğini etkinleştirirseniz yalnızca yeniden derleyebilirsiniz önceki derlemeden bu yana değiştirdiğiniz sınıflar.

Aşağıdaki komut, birkaç sınıf için artımlı bir derleme gerçekleştirir ve buna dahildir. Komut ayrıca artımlı derlemelerden oluşur.

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

d8, artımlı bir derleme gerçekleştirdiğinde ek bilgileri şurada depolar: DEX çıkışı. d8 daha sonra bu bilgileri kullanarak Uygulamanızın tam derleme işlemi sırasında --main-dex-list seçeneği sunulur ve DEX dosyalarını birleştirin.

Örneğin, d8 Java 8 lambda sınıflarını işlerken hangi Her giriş sınıfı için lambda sınıfları oluşturulur. Tam derleme sırasında d8 ana DEX dosyasında bir sınıf içeriyorsa, şu sınıf için oluşturulan lambda sınıflarından biri de ana DEX dosyası olarak kaydedin.

Projenizin tüm bayt kodunu DEX dosyaları olarak derlediyseniz birden fazla artımlı derlemede, aşağıdaki komutta gösterildiği gibi, ara DEX dosyaları dizinini d8 konumuna getirir. Ayrıca, d8 tarafından ana --main-dex-list kullanan DEX dosyası. Çünkü giriş, oluşturulduğunda DEX bayt kodu olarak derlendiği için bu derleme daha hızlı tamamlanır daha iyi olacaktır.

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

Java 8 dil özelliklerini kullanan bayt kodu derleyin

d8, Java 8'in dil özelliklerini kullanmanızı sağlar desugaring adlı bir derleme işlemiyle kodunuza ekleyin. Şekeri arındırma dönüşüm bu yararlı dil özelliklerini bayt koduna dönüştürerek Android cihazınızda çalıştırılabilen platformu.

Android Studio ve Android Gradle eklentisinde sınıf yolu bulunur d8 adlı kaynak, su sadeleştirmeyi etkinleştirmek için ihtiyaç duyduğu kaynakları içerir. Ancak, d8 komut satırını kullanıyorsanız bunları kendiniz eklemeniz gerekir.

Bu kaynaklardan biri, hedef Android SDK'nızdaki android.jar öğesidir. Bu bir dizi Android platform API'si içerir. Şunu kullanarak yolunu belirtin: --lib işareti.

Başka bir kaynak ise projenizde derlediğiniz Java bayt kodu kümesidir. şu anda DEX bayt kodu olarak derlememektedir, ancak diğer DEX bayt koduna dönüştürür.

Örneğin, kodunuzda varsayılan ve statik arayüz yöntemleri, bunlar bir Java çok sayıda dil özelliği sunuyorsa bu işareti kullanarak tüm bayt kodunun tamamını derlemeyi amaçlamasanız bile projenin Java bayt kodu DEX bayt koduna dönüştürür. Çünkü d8 uygulamasının anlamak için bu bilgilere ihtiyacı vardır. arayüz yöntemlerine yapılan çağrıları çözümlemeye yardımcı olur.

Aşağıdaki kod örneği, bir varsayılan arayüz yöntemidir:

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