2011-10-09 36 views
11

Sau khi chạy headfirst vào nhiều vấn đề như có hoán vị của tập hợp các công cụ dòng lệnh của Android, cuối cùng tôi đã xoay sở để kết hợp mã nguồn Scala và Java thành một gói ứng dụng có thể sử dụng.Android, Scala và Proguard

Như nhiều đề xuất, tôi đã sử dụng proguard để bóp thư viện Scala thông qua công cụ dex. Vấn đề là:

BUILD SUCCESSFUL 
Total time: 1 minute 29 seconds 

Một phút rưỡi. Chúng ta đang nói về một ứng dụng với sự phức tạp của Hello-World ở đây. Tôi không nghĩ rằng tôi có thể phát triển như thế. Tôi sẽ cần tham gia các lớp thiền.

Đây là cấu hình proguard:

-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 

Có cách nào để tăng tốc độ bước Proguard?

Chỉnh sửa: Tôi đang chạy máy này trong một máy ram 3GB, lõi kép khá tốt, trên nền tảng 64-bit Linux. Một lần chạy của ant compile (scalac/javac) mất 3 giây. Toàn bộ ant install mất 1:30, như được mô tả ở trên. Đó là bước proguard "đóng băng", theo kết quả đầu ra, rất có thể do kích thước lib thời gian chạy của scala/android.

+0

chúng ta cần một số chi tiết chi tiết, ví dụ bạn máy thiết lập-up..ie số cpus, ram, vv –

+0

được cho là trình biên dịch sẽ là nút cổ chai mà trình biên dịch bạn đang sử dụng? –

+0

Xem thêm: http://proguard.sourceforge.net/manual/examples.html # scala. Tôi nghĩ rằng nó không phải là trình biên dịch bị tắc nghẽn, nhưng chỉ 8,5 Mb thời gian chạy scala mất khá nhiều thời gian để đọc và đóng gói. – Rogach

Trả lời

7

Làm việc qua android Bản dựng kiến ​​có thể không phải là cách phù hợp để thực hiện việc này.

Các hiện "tốt nhất lời khuyên" là sử dụng SBT với

plugins.

+1

Đồng ý. Nhưng hãy nhận biết các vấn đề với 2.9.1 tôi đề cập trong bình luận của tôi ở trên. Có thể cài đặt các thư viện Scala (2.8.x) trên thiết bị và tránh bước proguard, như được mô tả ở đây: http://zegoggl.es/2011/07/how-to-preinstall-scala-on-your- android-phone.html nhưng lưu ý rằng có một số vấn đề (chưa được khắc phục như tôi biết) với phiên bản SDK Android mới nhất. –

+1

Tôi chưa thử SBT, nhưng tôi không hiểu nó sẽ giúp ích gì. Nó không tự động chạy cùng một chương trình chạy proguard theo cách thủ công? – slezica

+0

Lưu ý rằng proguarding bây giờ là một phần của plugin android sbt (đừng sợ thông báo giấy phép sai lệch và không chính xác mà nó hiển thị, hãy xem https://github.com/jberkel/android-plugin/issues/129) – ron

5

ProGuard mất nhiều thời gian hơn để thu hẹp thư viện Scala 2.9.1 so với thư viện Scala 2.8.1 (54 giây so với 13 giây, cho 8.5 MB so với 6.2 MB). Hoặc cấu trúc của các lớp thư viện đã thay đổi về cơ bản, hoặc một số lớp mới đang gây ra việc tính toán quá mức. Tôi sẽ phải tìm ra nếu ProGuard hoặc cấu hình của nó có thể được cải thiện cho trường hợp này. Bây giờ, bạn có thể làm việc với Scala 2.8.1.

Tôi giả sử cấu hình ProGuard của bạn cũng chứa các tùy chọn bắt buộc cho Android và cho Scala, như được thảo luận trong ProGuard manual. Nếu bạn đang sử dụng quy trình tạo Android thông thường, đầu vào (classes, libs) và thư viện (android.jar) đã được chỉ định cho bạn trong tệp xây dựng Ant và bạn không cần chỉ định lại chúng trong tệp cấu hình ProGuard. Đọc chúng hai lần sẽ chỉ mất thời gian và tạo ra nhiều cảnh báo (mà bạn đã tắt hoàn toàn - đó là an toàn hơn để chuyển đổi chúng một cách có chọn lọc).

+0

Mặc dù dùng lâu hơn, tôi gặp rắc rối với Proguard và Scala 2.9.1. Sau khi obfuscation shrinkin loại bỏ scala công cụ cơ bản như Traversable hoặc HashMap.foreach vv Vì vậy, nó sẽ gây ra các chương trình thất bại với ClassNotFoundError lớp axy (vv ..) proguard_map điểm axy để đề cập đến trên và sử dụng các đối tượng Scala. – vertti

+0

@vertti Một chương trình HelloWorld đã xử lý (kết hợp với Scala 2.9.1) chạy tốt khi tôi dùng thử, vì vậy tôi sẽ cần thêm chi tiết về mã của bạn. Nếu bạn đăng câu hỏi riêng ở đây hoặc trong Diễn đàn trợ giúp của ProGuard, tôi sẽ xem xét câu hỏi đó. –

+0

Cảm ơn, tôi sẽ cố gắng, nhưng trò chơi hiện tại của tôi là khoảng 6000 dòng scala và tách ra một phần chức năng mà vẫn phá vỡ proguard có thể chứng minh khó khăn. – vertti

3

Nếu bạn có một chiếc điện thoại bắt nguồn từ và chỉ muốn kiểm tra về vấn đề này bạn có thể cài đặt các libs scala trực tiếp trên điện thoại của bạn, do đó bạn không cần phải bước Proguard nữa:

https://github.com/jrudolph/scala-android-libs

Các vấn đề liên quan