2012-03-01 16 views
10

Tôi cần tạo một thư viện tối thiểu của thư viện để sử dụng trong Android. Tôi đang sử dụng một số phương pháp từ thư viện commache commons (chẳng hạn như IOUtils, StringUtils). Tuy nhiên, mỗi cách sử dụng như vậy làm cho tôi nhập toàn bộ thư viện (commons-lang, commons-io v.v.) hoàn toàn có thể chấp nhận được theo Tomcat (war là kích cỡ mamoot), nhưng hoàn toàn không được chấp nhận cho dự án Android.Tạo jar thu nhỏ chỉ với các lớp đã sử dụng

Vì vậy, mục tiêu của tôi là, đóng gói tất cả các lớp đã sử dụng từ các phụ thuộc vào một cái bình - nhưng chỉ những lớp đó là cần thiết. Tôi nhớ một khi được liên lạc với maven plugin mà thực hiện nhiệm vụ đó, unfortunatelly tôi không thể nhớ tên của nó cũng không tìm thấy nó thông qua Google.

Vì vậy, xin vui lòng, bạn có biết maven plugin sẽ làm giảm thiểu sự phụ thuộc như vậy, hoặc bất kỳ công cụ độc lập nào sẽ làm tương tự?

Trả lời

0

Xin lỗi, có thể tôi không hiểu rõ câu hỏi. Công cụ Obfuscator (tức là ProGuard) có thể làm điều đó, phải không? Nó gói một vài JAR vào một và loại bỏ các lớp không sử dụng. Nếu bạn không cần obfuscation/optimization (để ngăn chặn các tác dụng phụ không mong muốn) thì bạn có thể vô hiệu hóa chúng, để lại "shrink" phase được kích hoạt.

+0

Tôi thấy rằng ProGuard đã được tích hợp vào Android SKD, vì vậy tôi chắc chắn sẽ xem xét liệu nó có đáp ứng được các yêu cầu của tôi hay không. –

+0

Như tôi biết các brokes bao bì như vậy đã ký các thư viện JAR. Nó có thể là bất lợi nghiêm trọng. – Mersenne

-3

Tôi đoán nếu bạn sử dụng Eclipse để JAR dự án, nó cung cấp một số tùy chọn để làm điều đó trong khi JARING :) Có thể nó sẽ hữu ích.

Ngoài ra, bạn có thể thu thập các lớp thư viện đã sử dụng trong thư viện tùy chỉnh và bao gồm thư viện do người dùng tạo này trong dự án.

+0

Đây là những gì tôi cần công cụ. Tôi biết tôi có thể làm điều đó bằng tay. –

0

Nói chung không thể tự động chọn tất cả các lớp được ứng dụng sử dụng. Chỉ cần nghĩ về những gì chúng ta có thể làm với Class.forName(String name) hoặc nếu chúng ta sử dụng thùng chứa phụ thuộc và khai báo các loại trong tệp cấu hình bên ngoài.

+0

Tôi biết điều đó, nhưng đây chỉ là khi bạn sử dụng sự phản chiếu. AFAIR công cụ này đã hoạt động khi không có sự phản chiếu, nhưng không thể chắc chắn rằng tôi đã thực sự nhìn thấy nó hoặc nó chỉ là một giấc mơ;) –

+0

Không chỉ khi bạn sử dụng sự phản chiếu - bạn có thể tải một lớp từ một url và lớp có thể phụ thuộc vào các lớp trên classpath của bạn. Sẽ sụp đổ quá. –

+0

nó vẫn còn rất hữu ích ngay cả với một số mã tải trong một cách trình biên dịch không nhìn thấy. Những người muốn tạo ra một cái lọ nhỏ nhất có thể lập danh sách trắng mà không thể tìm thấy tự động. –

5

Plugin maven bạn không thể nhớ có lẽ là Apache Maven Shade Plugin, có tùy chọn minimizeJar. Như Andreas_D nhận thấy, điều này sẽ không bao gồm các lớp học, được tải với Class.forName, vì vậy bạn sẽ cần phải implicity say in configuration, mà bạn cần chúng. Đây là cách tôi làm maven để bao gồm trình điều khiển jdbc trong jar duy nhất của tôi:

<filter> 
    <artifact>net.sourceforge.jtds:jtds</artifact> 
    <includes> 
     <include>**</include> 
    </includes> 
</filter> 
Các vấn đề liên quan