Android için hızlı, yinelemeli geliştirme
Bu sayfada, bazel mobile-install
uygulamasının yinelemeli geliştirmeyi nasıl yaptığı açıklanmaktadır
çok daha hızlı sağlıyor. Bu yaklaşımın avantajları ile
ve geleneksel uygulama yükleme yönteminin
zorlukları üzerine konuştuk.
Özet
Bir Android uygulamasındaki küçük değişiklikleri çok hızlı bir şekilde yüklemek için aşağıdakileri yapın:
- Yüklemek istediğiniz uygulamanın
android_binary
kuralını bulun. proguard_specs
özelliğini kaldırarak ProGuard'ı devre dışı bırakın.multidex
özelliğininative
olarak ayarlayın.dex_shards
özelliğini10
olarak ayarlayın.- Dalvik değil, USB üzerinden ART çalıştıran cihazınızı bağlayın ve USB'yi etkinleştirin hata ayıklaması gerekir.
bazel mobile-install :your_target
çalıştır. Uygulama başlangıcı biraz daha yavaş olabilir.- Kodu veya Android kaynaklarını düzenleyin.
bazel mobile-install --incremental :your_target
çalıştır.- Çok fazla beklemek zorunda kalmayın.
Bazel için yararlı olabilecek bazı komut satırı seçenekleri:
--adb
, Bazel'e hangi adb ikili programını kullanacağını bildirir--adb_arg
,adb
komut satırına fazladan bağımsız değişkenler eklemek için kullanılabilir. Bunun yararlı uygulamalarından biri, yüklemek istediğiniz cihazı seçmektir iş istasyonunuza bağlı birden fazla cihazınız varsa aşağıdaki adımları uygulayın:bazel mobile-install --adb_arg=-s --adb_arg=<SERIAL> :your_target
.--start_app
, uygulamayı otomatik olarak başlatır
Şüpheye düştüğünüzde örnek veya bize ulaşın.
Giriş
Bir geliştiricinin araç zincirinin en önemli özelliklerinden biri hızdır: kodu değiştirmekle, 24 saat boyunca aynı aralıkta saniyelerce, bazen saatlerce, sonra da herhangi bir geri bildirim almadan önce beklentilerinizi karşılayıp karşılamadığını anlamanızı sağlar.
Maalesef, .apk oluşturmak için kullanılan geleneksel Android araç zincirinde birçok monolitik, ardışık adımın yapılmasıdır ve bunların tümünün geliştirmenizi sağlar. Google'da tek satır oluşturmak için beş dakika beklenirken Google Haritalar gibi daha büyük projelerde alışılmadık bir durum değildi.
bazel mobile-install
, yinelemeli geliştirmeyi Android için çok daha hızlı hale getiriyor:
Bu yöntemler arasında, işleri parçalama ve zekice manipülasyon yöntemlerini bir arada kullanarak
Uygulamanızın hiçbir kodunu değiştirmeden, dahili Android özellikleri.
Geleneksel uygulama yüklemeyle ilgili sorunlar
Android uygulaması oluştururken aşağıdakiler gibi bazı sorunlar var:
Dexing. Varsayılan olarak "dx" çağrıldığı için derlemede tam olarak bir kez çağrılır. önceki derlemelerden alınan çalışmaları nasıl yeniden kullanacağınızı bilir: Bu sistem, çalışmalarınızı yeniden ancak tek bir yöntem değiştirildi.
Veriler cihaza yükleniyor. adb, USB 2.0'ın tam bant genişliğini kullanmıyor bağlantı vardır ve daha büyük uygulamaların yüklenmesi çok uzun sürebilir. Uygulama tamamen küçük kısımları değişmiş olsa bile (örneğin, bir kaynak veya bir bu yüzden büyük bir performans sorunu olabilir.
Yerel kod derlemesi. Android L, yeni Android çalışma zamanı olan ART'yi Böylece uygulamaları tam zamanında derlemek yerine önceden derler. Dalvik. Bu da daha uzun yükleme maliyetiyle uygulamaları çok daha hızlı hale getirir gerekir. Genellikle uygulamanızı yükledikleri için bu, kullanıcılar açısından iyi bir performanstır. bir kez kullanır ve birçok kez kullanır, ancak uygulama geliştirme sırasında birçok kez yüklenir ve her sürüm en fazla birkaç kez çalışır.
bazel mobile-install
yaklaşımı
bazel mobile-install
aşağıdaki iyileştirmeleri yapar:
Parçalı dexing. Bazel, uygulamanın Java kodunu oluşturduktan sonra sınıfı parçalara ayırıyor dosyalarını yaklaşık olarak eşit boyutlu parçalara ayırır ve
dx
gerekir.dx
, son derlemeden bu yana değişmeyen kırıklarda çağrılmaz.Artımlı dosya aktarımı. Android kaynakları, .dex dosyaları ve yerel dosyalar kitaplıklar ana .apk'den kaldırılır ve ayrı bir mobil yükleme dizini. Bu, kodu ve Android'i güncellemeyi mümkün kılar ve kaynakların birbirinden bağımsız olmasını sağlayın. Böylece, dosyaları aktarmak daha az zaman alır ve yalnızca yapılan değişiklikler cihaz üzerinde yeniden derlenir.
Uygulamanın bazı bölümleri .apk dışından yükleniyor. Küçük bir geçici uygulamadır. Android kaynaklarını, Java kodunu ve yerel kodu yükleyen .apk içine yerleştirin dizinden çıkarır, sonra da kontrolü gerçek uygulama. Birkaç köşede durumlar dışında, bunların hepsi uygulama için şeffaftır bakın.
Parçalı Dex Oluşturma
Parçalı dex oluşturma işlemi makul ölçüde basittir: .jar dosyaları oluşturulduktan sonra,
araç
bunları yaklaşık olarak eşit boyutta ayrı .jar dosyalarına ayırır, daha sonra
Önceki derlemeden sonra değiştirilenler üzerinde dx
. Projenin gidişatını
hangi kırıkların Android'e özgü olmadığını belirler, yalnızca
genel değişiklik budama algoritmasıdır.
Parçalama algoritmasının ilk sürümü, .class dosyalarını sonra listeyi eşit boyutlarda parçalara böldük, ancak daha büyük bir suboptimal: bir sınıf eklendiyse veya kaldırıldıysa (iç içe yerleştirilmiş veya anonim bir sınıf da dahil olmak üzere) sonra tüm sınıfların alfabetik olarak kaymasına neden olur. bu da kırıkların tekrar çözülmesine neden oluyor. Bu nedenle, Java'yı parçalara ayırmaya karar verildi ayrı ayrı seçmek yerine paketlerini kullanın. Elbette bu yine de yeni bir paket eklendiğinde veya kaldırıldığında çok sayıda parçayı tek bir sınıf eklenmesine veya çıkarılmasına göre daha sıktır.
Kırık sayısı BUILD dosyası tarafından kontrol edilir (
android_binary.dex_shards
özelliği) ekleyebilirsiniz. İdeal bir dünyada Bazel
otomatik olarak kaç parçanın en iyi olduğunu belirler, ancak Bazel'in bunu şu anda bilmesi gerekir
yapılandırmadan önce bir dizi işlem (örneğin, derleme sırasında yürütülecek komutlar)
yürütür, böylece ideal kırık sayısını belirleyemez
çünkü eninde sonunda kaç Java sınıfı olacağını
uygulamasını indirin. Genelde, ne kadar fazla kırık olursa, derleme o kadar hızlı ve
ancak uygulama başlatma işlemi daha yavaş olur. Bunun nedeni,
bağlayıcının daha fazla işlem yapması gerekir. İş için ideal nokta genellikle 10 ila 50 parçadır.
Artımlı dosya aktarımı
Uygulamayı oluşturduktan sonraki adım, tercihen mümkün olan en az çabayla. Yükleme işlemi aşağıdaki adımlardan oluşur:
- .apk yükleniyor (genellikle
adb install
kullanılarak) - .dex dosyalarını, Android kaynaklarını ve yerel kitaplıkları mobil yükleme dizini
İlk adımda çok fazla artımlılık yoktur: Uygulama yüklüdür
hakkında bilgi edindiniz. Bazel şu anda bu adımı uygulayıp uygulamayacağını belirtmek için kullanıcıya güveniyor
--incremental
komut satırı seçeneği üzerinden yapabilirsiniz. Çünkü
ve gerekiyorsa her şeyi kapsamayabilir.
İkinci adımda, uygulamanın derlemedeki dosyaları cihaz üzerindeki bir dosyayla karşılaştırılır cihazda hangi uygulama dosyalarının bulunduğunu ve bunların sağlamaları da vardır. Cihaza yüklenen yeni dosyalar, değiştirilen dosyalar güncellenir ve kaldırılan dosyalar olanak tanır. Manifest dosyası mevcut değilse her dosyanın yüklenmelidir.
Ek yükleme başına ek yükleme algoritmasının, uygulama veya cihazdaki bir dosyayı değiştirir, ancak manifest'teki sağlama toplamını değiştirmez. Bu ilgili dosyaların sağlama toplamı hesaplanarak ancak yükleme süresindeki artışa değmeyeceğine karar verildi.
Stub uygulaması
Stub uygulaması, dex'leri, yerel kodları ve öğeleri
Cihaz üzerindeki mobile-install
dizinindeki Android kaynakları gerçekleşir.
Asıl yükleme, BaseDexClassLoader
alt sınıfıyla uygulanır ve bir
ortaya koymuş olabilir. Bu, uygulamanın herhangi bir
sınıfları yüklendiğinden, apk'de bulunan tüm uygulama sınıfları
güncellenebilmesi için cihaz üzerindeki mobile-install
dizinine yerleştirilir
adb install
olmadan.
Bu işlemin, uygulamanın sınıfları yüklendiğinden, .apk böyle bir sınıfa geçer. Bu durumda bu sınıflarda yapılan değişiklikler için yeniden yükleyin.
Bu,Application
AndroidManifest.xml
temel uygulama. Bu
uygulama başlatıldığında kontrolü alır ve sınıf yükleyicisi ile
sırasında (oluşturucusu) uygun bir şekilde kaynak yöneticisini
Java'nın Android çerçevesinin iç yönleri hakkında düşünmesi.
Saplama uygulamasının yaptığı bir başka şey de yerel kitaplıkları kopyalayıp
başka bir konuma mobil yükleme yoluyla
yüklendiğinden emin olun. Bu gereklidir çünkü
dinamik bağlayıcının dosyalarda X
bitinin ayarlanmasını gerektirir ve bu
kök olmayan bir adb
tarafından erişilebilen herhangi bir konum için yapmanız gerekir.
Tüm bunlar yapıldıktan sonra saplama uygulaması,
gerçek Application
sınıfı; tüm referansları gerçek haliyle değiştirerek
bir uygulamadır.
Sonuçlar
Performans
Genel olarak, bazel mobile-install
ile inşaat hızı 4 ila 10 kat artırılır
sonra küçük bir değişiklikten sonra büyük
uygulamalar yüklemeyi ümit ediyoruz.
Aşağıdaki sayılar birkaç Google ürünü için hesaplandı:
Bu, elbette değişikliğin yapısına bağlı: temel kitaplığı değiştirmek daha fazla zaman alır.
Sınırlamalar
Saplama uygulamasında yapılan hileler her durumda işe yaramaz. Aşağıdaki durumlarda, işlevin beklendiği gibi çalışmadığı durumlar vurgulanır:
Context
,Application
sınıfına yayınlandığındaContentProvider#onCreate()
. Bu yöntem, uygulama sırasında çağrılırApplication
örneğini değiştirme fırsatımız olmadan startup'ı sınıfını kullanır. Bu nedenle,ContentProvider
, saplama uygulamasına başvurmaya devam eder. e-posta alırsınız. Muhtemelen bu bir hata değildir çünküContext
uygulamasını bu şekilde eski sürüme geçirmem gerekiyordu ancak bu işlemi birkaç dakika içinde yapacağım bazı uygulamalar var.bazel mobile-install
tarafından yüklenen kaynaklara yalnızca şunun içinden erişilebilir: görebilirsiniz. Diğer uygulamalar kaynaklaraPackageManager#getApplicationResources()
, bu kaynaklar artımlı olmayan son yükleme.ART çalışmayan cihazlar. Temel uygulama, pek çok Froyo ve sonraki aşamalarında, Dalvik'in uygulamanın gerçekten bazı yerlerde birden çok .dex dosyasına dağıtılmışsa ek açıklamaların kullanıldığı bir belirli sağlar. Uygulamanız bu hataları gidermediği sürece Dalvik, (ancak eski Android sürümlerini desteklemenin tam olarak bizim için tam olarak odaklan)