bazel mobil yükleme

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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:

  1. Yüklemek istediğiniz uygulamanın android_binary kuralını bulun.
  2. proguard_specs özelliğini kaldırarak ProGuard'ı devre dışı bırakın.
  3. multidex özelliğini native olarak ayarlayın.
  4. dex_shards özelliğini 10 olarak ayarlayın.
  5. Dalvik değil, USB üzerinden ART çalıştıran cihazınızı bağlayın ve USB'yi etkinleştirin hata ayıklaması gerekir.
  6. bazel mobile-install :your_target çalıştır. Uygulama başlangıcı biraz daha yavaş olabilir.
  7. Kodu veya Android kaynaklarını düzenleyin.
  8. bazel mobile-install --incremental :your_target çalıştır.
  9. Ç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 vedx 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:

  1. .apk yükleniyor (genellikle adb install kullanılarak)
  2. .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ığında ContentProvider#onCreate(). Bu yöntem, uygulama sırasında çağrılır Application ö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 kaynaklara PackageManager#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)