Tạo thư viện Android Jar để phân phối


160

Tôi biết các dự án Thư viện Android, cho phép bạn tạo một dự án nguồn chia sẻ có thể được kéo vào Ứng dụng Android khi cần. Tuy nhiên, điều đó đòi hỏi nguồn đó có sẵn.

Tôi đang tìm cách xây dựng và phân phối thư viện nguồn đóng có thể được sử dụng trong các dự án Android khác như JAR truyền thống. Điều này sẽ yêu cầu sử dụng trình biên dịch Android, vì vậy đây không phải là tệp JAR vanilla-Java. FWIW, tôi không cần nhúng tài nguyên / bố cục trong JAR.

Tôi đã xem http://andparcel.com/ nhưng cảm giác như một cách giải quyết và tôi muốn sử dụng cái gì đó 'được hỗ trợ chính thức' bởi Google. Ngoài ra, tôi cần đảm bảo rằng JAR tôi xây dựng tương thích với phiên bản Android SDK cũ / mới (tức là tôi cần một cách để đặt phiên bản nền tảng đích, v.v.).

Các bộ công cụ Android mới nhất có cho phép tạo / tiêu thụ nhị phân JAR không? Bạn có thể chỉ ra một số tài liệu về cách tôi có thể làm điều đó?


bạn đã có câu trả lời cho câu hỏi của bạn chưa? Tôi có một yêu cầu tương tự .. Làm thế nào bạn bắt đầu tạo tập tin jar?
Krishnabhadra

Để phân phối .jar cho Android, bạn không cần trình biên dịch dx Android, trình biên dịch Java thông thường hoạt động. Nếu bạn phân phối một jar, nó sẽ được chuyển đổi thành mã byte dx khi ứng dụng được xây dựng.
ThomasW

Câu trả lời:


49

Nếu bạn tạo dự án Thư viện Android mà không có bất kỳ tài nguyên nào, ADT (được chú ý lần đầu tiên trong r16) sẽ tạo một .jar có cùng tên với dự án trong thư mục 'bin'.


vui lòng xem câu hỏi này stackoverflow.com/questions/12970802/ từ
vnshetty

1
Điều này giúp tôi có được bình, nhưng tôi có cần phân phối thư mục tài nguyên không? Cố gắng xử lý sherlock thanh hành động và các dự án của tôi sẽ không được biên dịch vì chúng không thể tìm thấy tài nguyên trên thanh hành động.
Nathan Schwermann

1
@schwiz điều này chỉ hoạt động cho các dự án phi tài nguyên (như tôi nêu trong câu trả lời). Nếu không, bạn cần nhập nó như một dự án Thư viện Android tiêu chuẩn.
Freddroid

1
Điều này có còn đúng không? Tôi không thấy myapp.jartrong /binthư mục. Có classes.jar, nhưng đó không phải là nó, phải không?
garbagecollector

Tôi đang chạy ADT mới nhất và tôi vẫn nhận được <tên dự án> .jar trong thư mục / bin của mình. Nhưng nếu dự án của bạn phụ thuộc vào tài nguyên thì không tốt và dự án cần được đưa vào như một dự án thư viện (mặc dù vậy bạn vẫn nhận được .jar.
Freddroid

23

Android không cung cấp một loại Android-JAR đặc biệt. Nhưng những gì bạn có thể làm là thêm một tệp build.xml vào dự án của bạn và xây dựng JAR bằng ant.

Bản dựng của tôi trông như thế này:

<project name="MyAndroidLib" default="dist" basedir=".">
  <description>
This is my Android lib
  </description>
  <!-- set global properties for this build -->
  <property name="src" location="src" />
  <property name="bin" location="bin" />

  <target name="jar">
    <jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
      <!-- replace 'com' by what ever you are using -->
      <!-- as first part of the package name -->
      <!-- e.g. de, org, ... -->
      <!-- the ** is important to include the directory recursively -->
      <include name="com/**" />
    </jar>
  </target>
</project>

Xây dựng JAR bằng cách chạy ant jartrong thư mục chính dự án của bạn.


Đã thử điều này và có thể xây dựng tệp JAR, nhưng kích thước là số lẻ (chỉ 343 byte), so với khi xuất thư viện sang JAR. Bất kỳ ý tưởng về những lá cờ đang thiếu?
Shane Oliver

Bạn có thể kiểm tra nội dung của JAR bằng chương trình lưu trữ (JAR là ZIP) và xem những gì còn thiếu và thêm chúng. Bạn có thể tìm thêm thông tin ở đây: ant.apache.org/manual/T task / ra.html
white_gecko

5
Với SDK Android mới nhất, các tệp Java được biên dịch thành bin/classes, do đó, <jar destfile="MyAndroidLib.jar" basedir="bin/">nên<jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
Theo

17

Bạn có thể tạo một dự án Java "thông thường" và nhập từ đó Android.jar. Sau đó, bạn sẽ có quyền truy cập vào mọi thành phần trong SDK. Sau đó, bạn có thể xuất dự án của mình dưới dạng jar ... và tải nó từ ứng dụng Android của bạn. Điều này hoạt động rất tốt và nó có vẻ là một cách đơn giản để làm điều đó.


1
Trong trường hợp đó làm thế nào để khai báo các thành phần của thư viện như dịch vụ, hoạt động, người phát sóng, người cố ý. Ứng dụng khách có cần giữ tất cả các khai báo này trong tệp kê khai không?
Ron

@ferostar Làm cách nào tôi có thể nhập android.jar vào dự án java?
Krishnabhadra

Trong trường hợp thư viện đó có tài nguyên, làm thế nào để tạo R.java và thêm nó vào JAR

15

chỉ cần đi đến các thuộc tính của dự án mà bạn muốn tạo jar.Click trên tab Android. và đánh dấu vào thư viện Is. bây giờ bạn có thể thấy tệp .jar trong thư mục bin. Sử dụng nó ở nơi bạn muốn sử dụng.


2
Điều này dường như hoạt động nếu LibraryProject không có tài nguyên. Bất kỳ ý tưởng làm thế nào để làm cho nó làm việc với các tài nguyên?
Nathan Schwermann

Đây là một câu trả lời tồi, nếu dự án thư viện của bạn phụ thuộc vào các dự án khác. Những tài liệu tham khảo sẽ không được chọn.
stevebot 24/2/2015

10

Giải pháp duy nhất 'được Google hỗ trợ chính thức' là dự án Thư viện và nó yêu cầu mã nguồn được phân phối. Bạn có thể tạo JAR theo cách thông thường, nhưng bạn không thể bao gồm hoặc tham chiếu các tài nguyên trong đó.

Thật không may, tôi nghĩ rằng cũng không thể bao gồm một JAR được đóng gói trong một dự án Thư viện, như một phương tiện để giải quyết yêu cầu về mã nguồn.


"Bạn có thể tạo JAR theo cách thông thường, nhưng bạn không thể bao gồm hoặc tham chiếu các tài nguyên trong đó." <- dường như không hoạt động ngay trong Eclipse nếu tôi tham chiếu các lớp Android hoặc sử dụng trình biên dịch Android. Manh mối về cách làm cho nó hoạt động?
psychotik

5
Tôi chỉ tạo một dự án Java bình thường trong Eclipse, thêm android.jar vào đường dẫn xây dựng, sau đó chọn Xuất - Java - Tệp Jar.
Jeff Gilfelt

@JeffGilfelt và nếu bạn bao gồm android.jar cho thư mục sdk android-13 chẳng hạn, bạn có thể sử dụng thư viện jar của mình trong các dự án cho cấp API cao hơn không?
Fran Marzoa

10

Trong bản dựng mới nhất của Android Studio 1.2, việc tạo thư viện JAR đã được thực hiện đơn giản như điểm và nhấp chuột.

Các bước để làm theo:

  • Tệp Goto -> Mới -> Mô-đun mới nhập mô tả hình ảnh ở đây
  • Chọn "Thư viện Java" ở cuối danh sách tùy chọn nhập mô tả hình ảnh ở đây
  • Nhập tên của jar lib và tên của lớp trong đó và nhấn nút kết thúc nhập mô tả hình ảnh ở đây
  • Đó là nó !

Bước tiếp theo là thêm Thư viện Jar của bạn làm phụ thuộc trong ứng dụng của bạn. Đơn giản như thế

  • Tệp Goto -> Cấu trúc dự án -> Chọn 'ứng dụng' -> Chọn 'Phụ thuộc'
  • Chọn '+' ở dưới cùng -> Chọn 'Phụ thuộc mô-đun' nhập mô tả hình ảnh ở đây
  • Chọn mô-đun lib lib bạn vừa tạo ở trên nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây
  • Chọn Ok và đó là nó!

.... Hoặc bạn chỉ có thể thêm dòng dưới đây vào tệp lớp ứng dụng của mình

dependencies {
      compile fileTree(dir: 'libs', include: ['*.jar']) // Default Gradle Task, should be already present
      compile 'com.android.support:appcompat-v7:21.0.3' // Default Gradle Task, should be already present

      compile project(':nameOfYourJarLibraryModule') // This is your jar library module
 }

Google đang quảng cáo Lưu trữ Android (AAR), mặc dù JAR được hỗ trợ được đưa trở lại studio android. Để tìm hiểu sự khác biệt giữa AAR và JAR, hãy tham khảo liên kết này


Tôi không hiểu làm thế nào điều này tạo ra một tệp jar mới. Có vẻ như bạn vừa mới tạo một mô-đun mới sẽ được sử dụng làm thư viện trong dự án Android của bạn
Jejefcgb

Gì?! bạn tạo bình mới từ không có gì?
Ewoks

@Ewoks: sau khi bạn đã tạo mô-đun, bạn phải thêm các lớp vào nó. Sau khi hoàn thành, bạn thêm nó như một phụ thuộc
Nishant.

2
Câu hỏi là: có một thư viện tiềm ẩn với mã nguồn. Làm thế nào để tạo jar của nó để jar chỉ được sử dụng trong một dự án khác thay vì toàn bộ mã nguồn thư viện .. Hoặc tôi đã bỏ lỡ điều gì?
Ewoks

2
@Nishant. Đã làm cho tôi! Cảm ơn!
ramires.cabral

6

Hãy thử điều này: Công việc này

1) làm cho dự án thư viện của bạn trở thành một dự án bình thường bằng cách bỏ chọn cờ IsL Library.

2) Thực thi dự án của bạn dưới dạng Ứng dụng Android. (Nó sẽ không hiển thị bất kỳ lỗi nào)

3) bạn sẽ tìm thấy tệp .jar trong thư mục bin cùng với .apk.

4) Cung cấp cho bạn .jar người muốn sử dụng thư viện của bạn.

5) Nói với họ chỉ cần nhập jar bên ngoài vào đường dẫn xây dựng.

Điều này sẽ hoạt động tốt với tất cả các tài nguyên. may mắn nhất.


1
Tôi phải sửa bài này: Các tệp JAR chỉ có thể chứa mã, không có tài nguyên Android. Nếu có bất kỳ tài nguyên nào được bao gồm / cần thiết, chúng tôi phải mở dự án thư viện và không thể chỉ sử dụng tệp JAR đơn giản.
cody

@cody: Làm thế nào để chúng tôi tạo tệp jar cùng với tài nguyên và sử dụng nó trong dự án khác?
Mahantesh M Ambi

1

ADT tạo một thư mục bin chứa tất cả các tệp lớp cho tất cả các tệp và thư mục nguồn phù hợp trong dự án của bạn, bạn có thể sử dụng lệnh jar, tạo một kho lưu trữ jar chứa các tệp và thư mục lớp này và có thể là thư viện của bạn, nhưng tất nhiên là Cấp độ nền tảng tệp lớp sẽ chỉ được nhắm mục tiêu cho cấp độ hiện tại của bản dựng dự án - bạn sẽ cần một tệp jar khác nhau cho mỗi cấp độ nền tảng; Tuy nhiên, điều tuyệt vời ở đây là tệp R. class được bao gồm trong cây thư mục dự án và do đó bạn có quyền truy cập vào tài nguyên của nó. Tôi không biết đây có phải là cách chính thức để làm mọi thứ trong Android không, nhưng nó hiệu quả với tôi.


0

Trong dự án của chúng tôi, chúng tôi đang tạo apk (sử dụng apkbuilder) được cài đặt trong / system / framework và thêm apk này trong đường dẫn mặc định. Để biên dịch các ứng dụng bằng jar, chúng tôi đang tạo một tệp jar (sử dụng jar c).

Lưu ý: Chúng tôi không có bất kỳ tài nguyên nào trong thư viện.


0

.jar chỉ là một tệp .zip chứa tệp. class (bạn có thể thử thay đổi phần mở rộng của bất kỳ tệp .jar nào thành .zip sau đó xem kết quả). Dễ dàng, bạn có thể tạo bất kỳ thư viện .jar cho bất kỳ mục đích nào bằng cách nén tệp. Class.


Không hoàn toàn đúng, xem en.wikipedia.org/wiki/JAR_(file_format) để biết sự khác biệt tinh tế (chủ yếu là đặt hàng các mục trong ZIP)
iddo

0

Các bước:

1) Mở tệp project.properies

2) Thêm giá trị android.library=true

3) Lưu tập tin

4) Từ menu nhật thực cho dự án, chọn xây dựng tự động sau đó chọn sạch

Kết quả: Bình mới được tạo ra dưới thùng .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.