2012-07-25 85 views
35

Theo như tôi biết, thư viện hỗ trợ đang sử dụng vì các thiết bị cũ không có API mới. Ví dụ họ không biết Fragment là gì và cách triển khai nó như thế nào. Do đó, những hành vi này được xác định trong thư viện hỗ trợ.Thư viện hỗ trợ Android hoạt động như thế nào?

Vì vậy, câu hỏi chính của tôi là sự khác biệt giữa thư viện Fragment trong thư viện hỗ trợ với thư viện đôi được giới thiệu trong API 11 (Android v3.0, Honeycomb).

Câu hỏi thứ hai của tôi là, Nếu có thể đưa mọi API mới vào thư viện hỗ trợ, tại sao chúng tôi có hai loại thư viện? Tôi có nghĩa là Android có thể phát hành tất cả các API ngay dưới thư viện hỗ trợ thay vì thư viện hỗ trợ và thư viện phiên bản Android X.xx.

Trả lời

38

Theo như tôi đã hiểu, các thư viện hỗ trợ có thể hoạt động thay thế các API tích hợp, nhưng chúng không được cho là vì chúng trực tiếp ảnh hưởng đến kích thước của ứng dụng.

Ví dụ, thư viện hỗ trợ là 2MB và sử dụng chức năng của nó, nó mất tất cả các lớp, tài nguyên, v.v ... (bây giờ là 2MB), bây giờ là classes.dex (tệp thực thi Dalvik của tất cả các lớp đang được sử dụng trong ứng dụng) của tôi ứng dụng cũng bao gồm các lớp thư viện hỗ trợ đó và tương tự cho các tài nguyên. Vì vậy, nếu không có thư viện hỗ trợ kích thước ứng dụng của tôi là 1MB, sau đó bây giờ với thư viện hỗ trợ kích thước là 2MB thêm, có nghĩa là tổng số 3MB.

Bây giờ, giả sử tính năng thư viện hỗ trợ này rất phổ biến trên một thiết bị, nếu tôi có 10 ứng dụng, thì ít nhất 9 người đang sử dụng cùng thư viện hỗ trợ này, vì vậy 9 * 2 = 18MB trên thiết bị của tôi đang được cùng một thư viện hỗ trợ, được lặp lại trong mọi ứng dụng, điều này là xấu, bởi vì hiện tại 18MB có thể không nhiều, nhưng không gian cần thiết có thể tăng lên, nếu bạn có nhiều ứng dụng hơn sử dụng thư viện hỗ trợ đó.

Do đó, tùy chọn tốt nhất là có thư viện hỗ trợ 2MB đã có trong hệ điều hành của bạn cho bất kỳ số lượng ứng dụng nào, thay vì có nó cho mỗi ứng dụng. Vì vậy, thư viện hỗ trợ có nghĩa là được sử dụng khi bạn thực sự muốn một số tính năng hiệu quả trong ứng dụng của mình hỗ trợ các phiên bản cũ hơn.

Câu hỏi khác nảy sinh ở đây:

tại sao không thư viện hỗ trợ này sẽ được thêm vào hệ điều hành như cập nhật riêng của mình, vì vậy mà mọi ứng dụng không có vấn đề kích thước có thể truy cập chức năng đó?

Câu trả lời là có thể có nhiều lỗi. Giả sử một số người dùng không có bản cập nhật (thư viện hỗ trợ) được cài đặt ...

Cũng có cơ hội là bản cập nhật, nó có thể không hoạt động hiệu quả như dự kiến ​​hoặc có thể gây ra sự cố khi tích hợp với Hệ điều hành, như chúng ta đã thấy rằng mỗi hệ điều hành (windows, Linux, mac) đi kèm với các phiên bản mới, thay vì chỉ đưa ra các bản cập nhật cho thời gian cuộc sống cho tất cả các tính năng mới.

+3

Nếu nhà phát triển không cần bất kỳ tính năng nào mà thư viện hỗ trợ cung cấp, thì chắc chắn, không sử dụng nó. Tuy nhiên, trong kế hoạch lớn của sự vật, 2MB thực sự không phải là nhiều, và tôi rất thích một ứng dụng tương thích và hoạt động tốt hơn một trong đó đã bị tước bỏ thanh barebones của nó đơn giản chỉ vì bất cứ ai phát triển nó đã lo lắng rằng APK quá lớn. Ngoài ra, bạn có thể chỉ cần sử dụng Proguard để giảm/nén kích thước tệp APK của ứng dụng. –

+5

Vì vậy, nhiều câu dài ... Thực sự khó khăn để có được điểm. – CDT

+0

Tôi không đồng ý với câu trả lời của bạn về người dùng không có thư viện hỗ trợ có thể gây ra nhiều lỗi. Tệp kê khai đã cho phép bạn giới hạn ứng dụng của mình chỉ để hoạt động trên một thiết bị có phiên bản OpenGL nhất định. Họ có thể đã làm tương tự cho Thư viện hỗ trợ, địa ngục họ thậm chí có thể mở rộng chức năng để cho phép một phụ thuộc năng động trên bất kỳ thư viện. Đây là cách nó hiện đã được thực hiện trên hầu hết các hệ điều hành dựa trên Linux. –

3

Thư viện hỗ trợ không thực sự có mọi thứ trong các API mới hơn. Nó hỗ trợ các phần của Fragment API, nhưng nó chưa hỗ trợ ActionBar. Đối với điều đó bạn cần một thư viện khác như ActionBar Sherlock.

Tại sao có hai thư viện?

Vì một phần của sự cố là Google chỉ quay lại một số nội dung, nhưng sự hiểu biết của tôi là thêm một số chức năng mới không thể quay lại do giới hạn khung hệ điều hành lõi và thiếu API sâu trong cốt lõi của khung giao diện người dùng Android.

-3

Các mảnh từ thư viện Hỗ trợ tương đương với các mảnh của Honeycomb +.

Để quest thứ hai, từ tài liệu:

v13 là một superset của v4 và bao gồm thêm các lớp học hỗ trợ để làm việc với các API v13

tức là cùng chức năng, chỉ cần thích nghi với v13 API.

Tôi đang sử dụng thư viện hỗ trợ sửa đổi v4 - với bản đồ.

1

Android đã đưa ra các tính năng tuyệt vời của các đoạn và thanh tác vụ trong các bản phát hành gần đây.

Bây giờ nếu chúng ta muốn sử dụng các tính năng này và cũng hỗ trợ phiên bản cũ hơn của android thì chúng ta sẽ phải viết mã phụ thuộc rất lộn xộn, điều này không tốt.

Để cứu chúng ta khỏi tất cả những thứ lộn xộn này, android đã đưa ra thư viện hỗ trợ không hỗ trợ đầy đủ các tính năng mới nhưng đủ tốt để cho phép các nhà phát triển viết mã gọn gàng được hỗ trợ trên tất cả các thiết bị.

Trả lời câu hỏi thứ hai của bạn rất đơn giản, phân đoạn được tích hợp một phần v3.0 và nếu bạn muốn ứng dụng chỉ chạy trên v3.0 + thì bạn thực sự không phải bao gồm thư viện bên ngoài.

8

Điều đã được cho là đã đúng. Mặc dù có một số chi tiết bị thiếu. Trong thực tế, tôi đã có cơ hội tham dự một phiên trong Google IO cuối cùng, nơi họ đặc biệt nói về điều đó. Tôi thực sự ngạc nhiên khi biết rằng thư viện hỗ trợ không lưu trữ mã cho tất cả các phiên bản API posible, thay vì đó là một sự thích nghi của các tính năng mới mà họ cho là có liên quan, đủ để làm cho chúng có sẵn cho các nền tảng cũ hơn.Vì vậy, cách nó hoạt động nó thường là như sau:

  • Hãy nói rằng chúng ta cần phải sử dụng thương hiệu mới (có sẵn từ API 16) ConnectivityManager để theo dõi các mạng thay đổi
  • Chúng tôi bao gồm các thư viện hỗ trợ v4 và chúng tôi sử dụng Cách hoạt động sau đó là hệ thống sẽ kiểm tra phiên bản API của chúng tôi và sẽ chạy mã gốc được tích hợp trong trường hợp chúng tôi đang sử dụng API 16 hoặc sẽ chạy mã của thư viện hỗ trợ trong bất kỳ trường hợp nào khác.

Vì vậy, nó hoạt động giống như một số loại cổng định tuyến. Lý do là nó nói chung hiệu quả hơn (và thực hiện) để sử dụng mã cuối cùng được tối ưu hóa cho hệ điều hành cuối cùng và những cải tiến hệ thống cuối cùng (ví dụ: tăng tốc phần cứng).

Tuy nhiên, có một số yếu tố không được dịch sang thư viện tương thích vì chúng nằm trong mã được tích hợp sẵn. Ví dụ, các mảnh vỡ không được viết lại vì chúng là từ API13 vì chúng là một thành phần lớn cần chạy trong một loạt các kịch bản khác nhau trong hệ thống và các thiết bị có ít khả năng hơn.

Cuối cùng và vì tất cả điều này, nó được khuyến khích sử dụng compats thư viện mà được biết đến như một thói quen tốt, đặc biệt nếu bạn có ý định làm cho ứng dụng của bạn/code sẵn cho các phiên bản cũ (mà phải là cách lý tưởng)

+0

Vui lòng cung cấp thêm thông tin về phiên này. Có video hoặc tập lệnh trực tuyến không? – OneWorld

+0

Tôi sợ tôi không thể nhớ phiên cụ thể, nhưng đây là tất cả các video từ IO '12. https://developers.google.com/events/io/2012/ Hy vọng nó sẽ giúp. –

13

Android 4.0.x (ICS) có rất nhiều tính năng bổ sung so với cho phép nói Android 2.3.x (Gingerbread). Các thư viện tương thích có sẵn để kết nối một số thay đổi đã được thêm vào ICS mà Gingerbread hỗ trợ. "có thể là" là cụm từ quan trọng ở đây bởi vì có một tấn thay đổi được thực hiện cho ICS mà sẽ không bao giờ làm việc với Gingerbread và những người, tất nhiên, sẽ không nhận được một thư viện tương thích.

Các phân đoạn ví dụ, mà bạn đã đưa ra, thực sự được thực hiện hơi khác trong ICS so với trong thư viện tương thích vì ICS có nhiều tính năng hơn mà nó có thể sử dụng. Nếu bạn nhìn vào mã cho ICS cho lớp Fragments, chúng không giống như mã trong thư viện tương thích. Một bộ mã thứ hai toàn bộ của nó để làm cho một cái gì đó "như" các mảnh vỡ trong ICS được sử dụng trong một phiên bản cũ hơn như Gingerbread mà không có lập trình nhận thấy sự khác biệt nhiều.

Đó là điểm của thư viện tương thích và lý do tại sao chúng không được sử dụng để vá rộng rãi Gingerbread để sử dụng tất cả các tính năng trong ICS (chúng không thể). Điểm của thư viện tương thích là giao diện mọi thứ có sẵn trong các phiên bản Android mới hơn như ICS, thực hiện theo cách ICS thành các phiên bản cũ hơn như GB, thực hiện theo cách GB.

Theo như lý do tại sao họ không chỉ giữ thư viện hỗ trợ phát triển và rời khỏi cùng một hệ điều hành cơ sở - câu trả lời cho đó là vấn đề tương thích. Nếu người dùng chỉ có v4 và v12 bị loại bỏ, điều gì sẽ xảy ra? Android ngay bây giờ sử dụng phiên bản Android API của hệ điều hành làm cơ sở cho khả năng tương thích ứng dụng và nhà phát triển có tùy chọn đến bao gồm thư viện hỗ trợ (tăng kích thước tệp của ứng dụng, nhưng cung cấp cho họ các tính năng mới hơn). Mỗi ứng dụng sử dụng thư viện hỗ trợ, độc lập bao gồm chúng (nghĩa là 4 ứng dụng = 4x bao gồm).

Ý tưởng là, bạn chỉ có thể tải xuống các ứng dụng được hỗ trợ bởi phiên bản API hiện tại của hệ điều hành (có liên quan đến Google Play) và bạn có thể chọn bao gồm thư viện hỗ trợ để giữ giao diện của ứng dụng được hỗ trợ các API cũ hơn, chưa có các tính năng mà bạn chọn có sẵn cho những người dùng đó trên các API mới hơn. Nó thực sự là một cái nhìn và cảm nhận xem xét nhiều hơn bất cứ điều gì khác.

Hy vọng xóa mọi thứ :)

+0

Vì vậy, các thư viện hỗ trợ được bao gồm trong hệ điều hành chính xác? – Clocker

+1

Không chính xác. Các phiên bản mới hơn của hệ điều hành có các tính năng mà bạn có thể thực hiện mà không cần thư viện hỗ trợ, nhưng nếu bạn muốn các điện thoại cũ hoạt động, bạn phải thêm các thư viện hỗ trợ theo cách thủ công và sử dụng các lớp trong đó (chúng là tệp đơn giản.jab bạn thêm vào xây dựng đường dẫn). ADT bây giờ tự động thêm thư viện hỗ trợ vào dự án của bạn nếu bạn nhắm mục tiêu API tối thiểu thấp hơn để bạn có được những tính năng nâng cao đó, nhưng chúng làm cho dự án của bạn chiếm nhiều không gian hơn.Đôi khi tốt hơn là nhắm mục tiêu API cao hơn để bạn sử dụng mã gốc thay thế, nhưng điều đó tùy thuộc vào bạn và khả năng tương thích nào bạn có thể sống mà không có. – ComputerEngineer88

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