2011-10-09 34 views
11

Android komut satırı araç setinin permütasyonları olduğu için kafa kafaya çok fazla sorunla girdikten sonra, Scala ve Java kaynak kodunun bir karışımını kullanılabilir bir apk haline getirmeyi başardım.Android, Scala ve Proguard

Birçok önerdiğim gibi, dex aracı aracılığıyla Scala kütüphanesini sıkıştırmak için proguard'u kullandım. Sorun şu: Bu bir buçuk dakikadır. Hello-World karmaşıklığıyla ilgili bir uygulamadan bahsediyoruz. Böyle geliştirebileceğimi sanmıyorum. Meditasyon dersleri almam gerekecek.

-injars ${out.absolute.dir}/classes:${scala-library.jar}(!META-INF/MANIFEST.MF,!library.properties) 
-outjars ${out.absolute.dir}/classes.min.jar 
-libraryjars ${android.jar} 
-dontwarn 
-dontoptimize 
-dontobfuscate 
-keep public class * extends android.app.Activity 

proguard adımı hızlandırmak için bir yol var mı:

Bu proguard yapılandırma nedir?

Edit: Bunu 64 bit Linux'un üstünde, oldukça iyi bir çift çekirdekli, 3GB ram makinede çalıştırıyorum. ant compile (scalac/javac) 'un bir çalışması 3 saniye sürmektedir. Tam bir ant install, yukarıda açıklandığı gibi 1:30 alır. Bu scala/android runtime lib boyutları nedeniyle büyük olasılıkla, çıktıya göre "donuyor" proguard adım.

+0

Birkaç tane daha detaylar, örneğin makine kurulumu ... cpus, ram, vb. sayısı –

+0

derleyici, derleyici kullandığınız darboğaz olurdu? –

+0

Ayrıca bakınız: http://proguard.sourceforge.net/manual/examples.html # scala. Ben derleyici darboğaz değil, sadece 8.5 Mb scala runtime okumak ve paketlemek için oldukça uzun sürüyor. – Rogach

cevap

7

Android üzerinden çalışma Ant yapılar, muhtemelen bunun için doğru yol değildir.

geçerli "en iyi tavsiye"

eklentileri ile SBT kullanmaktır.

+1

Anlaşmalı. Ancak 2.9.1 ile ilgili konuların farkındayım, yukarıdaki yorumumdan bahsediyorum. Scala (2.8.x) kitaplıklarını bir cihaza kurmak ve burada açıklandığı gibi proguard adımından kaçınmak mümkündür: http://zegoggl.es/2011/07/how-to-preinstall-scala-on-your- android-phone.html ancak Android SDK'nın en yeni sürümüyle ilgili (henüz bildiğim kadarıyla sabit olmayan) bazı sorunların olduğunun farkında olun. –

+1

Henüz SBT'yi denemedim, ancak nasıl yardımcı olacağını anlamıyorum. Manuel olarak planladığım aynı koruma işlemini otomatik yapmaz mı? – slezica

+0

Proguarding'in şu anda sbt android eklentisinin bir parçası olduğunu unutmayın (görüntülenen yanıltıcı ve yanlış lisans mesajından korkmayın, bkz. Https://github.com/jberkel/android-plugin/issues/129) – ron

5

ProGuard Scala 2.9.1 kitaplığını Scala 2.8.1 kitaplığından (54 saniye vs. 13 saniye, 8.5 MB vs 6.2 MB) küçültmek için çok daha uzun sürüyor. Kütüphane sınıflarının yapısı temelde değişmiştir ya da bazı yeni sınıflar aşırı hesaplamalara neden olmaktadır. Bu durum için ProGuard'ın veya yapılandırmasının geliştirilip geliştirilemeyeceğini anlamak zorundayım. Şimdilik, Scala 2.8.1 ile çalışabilirsiniz.

ProGuard yapılandırmanızın, ProGuard manual'da açıklandığı gibi Android ve Scala için gerekli seçenekleri de içerdiğini varsayıyorum. Normal Android oluşturma işlemini kullanıyorsanız, giriş (classes, libs) ve kitaplıklar (android.jar) Ant derleme dosyasında sizin için önceden belirtilmiştir ve bunları ProGuard yapılandırma dosyasında yeniden belirtmeniz gerekmez. Onları iki kez okumak sadece zaman alacaktır ve birçok uyarı üretecektir (tamamen kapattınız - bunları seçici olarak değiştirmek daha güvenlidir).

+0

Daha uzun, Proguard ve Scala 2.9.1 ile garip sorunlar yaşadım. Kesintiden sonra, shrinkin Traversable veya HashMap.foreach gibi temel scala öğelerini kaldırır. Bu nedenle programın ClassNotFoundError sınıfı axy (etc ..) proguard_map noktaları ile yukarıda belirtilen ve kullanılan Scala nesnelerine karşı başarısız olmasına neden olur. – vertti

+0

@vertti İşlediğim bir HelloWorld programı (Scala 2.9.1 ile birlikte) denediğimde iyi çalışıyor, dolayısıyla kodunuzla ilgili daha fazla ayrıntıya ihtiyacım var. Burada veya ProGuard'ın Yardım forumunda ayrı bir soru gönderirseniz, ona bakacağım. –

+0

Teşekkürler, deneyeceğim, ama şu anki oyunum 6000 satırlık bir skaladır ve hala proguardın kırılmasını engelleyen işlevsel bir bölümün sökülmesi zor olabilir. – vertti