2012-01-12 11 views
8

Tôi đang phát triển một dự án sử dụng video Flash trong chế độ xem web. Tôi giải quyết tất cả các vấn đề liên quan đến mã của tôi, nhưng chỉ làm việc dưới Honeycomb.Cách làm cho dự án của tôi tương thích với các phiên bản sdk khác nhau trong khi sử dụng các tính năng cho một phiên bản cụ thể

Đọc this Tôi đã tìm hiểu cách giải quyết các vấn đề cho Android 3.0 trở lên (bao gồm ICS), nhưng giờ đây là câu hỏi lớn ... Nếu tôi thực hiện dự án của mình tương thích với ICS, tôi phải sử dụng chỉ thị, nhưng sau đó tôi sẽ không chạy trên Gingerbread.

Để cung cấp một số thông tin thêm ... mảnh mã có vấn đề là thế này:

android:hardwareAccelerated="true" 

mà là một tài sản đó đã được bao gồm trong Android 3.0.

Vì vậy, có bất cứ điều gì tôi có thể làm để tránh xây dựng hai apks khác nhau (somehitng như một apk trước HoneyComb và sau HoneyComb apk)?

Đây là một mảnh manifest Android của tôi:

<application android:label="@string/app_name" 
      android:icon="@drawable/elabora" 
      android:theme="@android:style/Theme.NoTitleBar"> 
    <activity android:name="es.fundacionvodafone.elabora.android.controlador.InicioElaboraTest" 
       android:label="@string/app_name" 
       android:noHistory="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name="es.fundacionvodafone.elabora.android.controlador.InicioElabora" 
       android:configChanges="orientation|keyboardHidden" 
       android:label="@string/app_name" 
       android:hardwareAccelerated="true"> 
      <!--    
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      --> 
    </activity> 

Cảm ơn trước.

Cập nhật: Tôi đã sử dụng những gì Mike giải thích, đó là để nói, xác định minSdk và targetSdk đúng cách, nhưng tôi đã nhầm lẫn bởi thực tế sau đây. Với cấu hình dự án như vậy, khi bạn chạy dự án trong nhật thực, nó sẽ nhắc cửa sổ sau: Capture of eclipse running a project with a targetSdk above the device api level Chữ thập đỏ có nghĩa là mức mục tiêu dự ánSdk cao hơn cấp API của thiết bị. Vì vậy, tôi nghĩ rằng nó đã không chỉ làm việc trong thiết bị này, nhưng điều là bạn thực sự có thể chạy nó, và hoạt động như mong đợi.

+0

Tại sao bạn cho rằng bạn "sẽ không chạy trên Gingerbread"? Bạn có thể có tối thiểu sdk = 8, mục tiêu SDK và xây dựng dự án mục tiêu xây dựng SD = 15. Chỉ cần chắc chắn để kích hoạt cho mỗi phiên bản bất cứ điều gì làm việc cho nó. Bạn có thể sử dụng thuộc tính boolean phụ thuộc phiên bản sẽ bật và tắt mọi thứ tùy thích. – user1076637

+0

@ user1076637, tôi vừa phạm sai lầm khi ... Tôi cập nhật câu trả lời của mình, thiết lập minSdk và targetSdk thích hợp là một giải pháp hợp lệ. – mdelolmo

Trả lời

8

Nhận xét được đăng bởi OP bên dưới câu hỏi của anh ấy (về cơ bản nói rằng targetSDK không ảnh hưởng đến việc biên dịch ứng dụng) là hoàn toàn sai! Xin lỗi để được cùn.

Tóm lại, đây là mục đích để khai báo một targetSDK khác từ minSDK: Có nghĩa là bạn đang sử dụng các tính năng từ một SDK cấp cao hơn mức tối thiểu, nhưng bạn đã đảm bảo tính tương thích ngược. Nói cách khác, hãy tưởng tượng rằng bạn muốn sử dụng một tính năng mới được giới thiệu gần đây, nhưng điều đó không quan trọng đối với ứng dụng của bạn. Sau đó, bạn sẽ đặt targetSDK thành phiên bản nơi tính năng mới này được giới thiệu và mức tối thiểu cho một cái gì đó thấp hơn để mọi người vẫn có thể sử dụng ứng dụng của bạn.

Để đưa ra ví dụ, giả sử bạn đang viết một ứng dụng sử dụng rộng rãi tính năng phát hiện cử chỉ. Tuy nhiên, mọi lệnh có thể được nhận biết bằng cử chỉ cũng có thể được thực hiện bằng một nút hoặc từ menu. Trong trường hợp này, cử chỉ là một 'phụ thú vị' nhưng không bắt buộc. Do đó bạn sẽ đặt sdk mục tiêu thành 7 ("Eclair" khi thư viện GestureDetection được giới thiệu) và tối thiểuSDK thành cấp 3 ("Cupcake") để ngay cả những người có điện thoại thực sự cũ có thể sử dụng ứng dụng của bạn. Tất cả những gì bạn phải làm là đảm bảo rằng ứng dụng của bạn đã kiểm tra phiên bản Android mà nó đang chạy trước khi thử sử dụng thư viện cử chỉ, để tránh sử dụng nó nếu nó không tồn tại. (Phải thừa nhận rằng đây là một ví dụ ngày kể từ khi hầu như không ai vẫn có một điện thoại v1.5, nhưng có một thời gian khi duy trì khả năng tương thích với v1.5 là thực sự quan trọng.)

Để đưa ra một ví dụ khác, bạn có thể sử dụng nếu bạn muốn sử dụng một tính năng từ Gingerbread hoặc Honeycomb. Một số người sẽ sớm nhận được bản cập nhật, nhưng nhiều người khác, đặc biệt là với phần cứng cũ hơn, có thể gặp khó khăn với Eclair cho đến khi họ mua một thiết bị mới. Điều này sẽ cho phép bạn sử dụng một số tính năng mới thú vị, nhưng không loại trừ một phần thị trường có thể có của bạn.

Có một bài viết thực sự tốt từ Android developer's blog về cách sử dụng tính năng này và đặc biệt, cách thiết kế "kiểm tra tính năng tồn tại trước khi sử dụng" mã tôi đã đề cập ở trên.

Đối với OP: Tôi đã viết chủ yếu này vì lợi ích của bất kỳ ai tình cờ gặp phải câu hỏi này trong tương lai.

+0

Xin lỗi, tôi hơi lạc lõng, nhận xét gì về câu hỏi nào? Dù sao, cách tôi đang sử dụng minSdk và targetSdk là một trong những trường hợp để mô tả, tôi tin. Đó là một tính năng phải được kích hoạt bởi một tài sản cetain đã được bao gồm Gingerbread. Trước đó, tài sản đó không cần thiết để làm cho nó hoạt động. – mdelolmo

3

Tôi có vấn đề tương tự với việc phiên bản tệp kê khai android. Đối với điện thoại cũ, tôi muốn có các tiện ích con trong một vài kích thước được xác định trước, đối với các điện thoại mới hơn có hỗ trợ thay đổi kích thước, tôi muốn có một tiện ích có thể thay đổi kích thước. Không thể tìm thấy cách nào để làm điều đó. Có thể đây là lý do Google đến với multiple APK support.

Bài viết Powell của Adam được đề cập ở trên không đề cập đến loại phiên bản này. (bài viết tuyệt vời BTW).

Chỉnh sửa: nhận giải pháp. Định nghĩa widget trong tệp kê khai android có giá trị boolean 'enabled' có thể được đặt từ các giá trị tài nguyên boolean. Giá trị tài nguyên có thể có trên mỗi giá trị phiên bản bằng cách sử dụng tên thư mục tài nguyên đủ điều kiện phiên bản tiêu chuẩn. Đã giải quyết được sự cố.

+0

Rất tốt, cảm ơn. Điều này cũng làm việc cho người nhận, mà tôi sẽ cần phải vô hiệu hóa cho Oreo –