2013-02-17 35 views
20

Hiện nay, tôi có một đoạn mã, được thiết kế để chạy cả Android 2.3 và 4+Enable android: largeHeap trong Android 4, và vô hiệu hóa nó trong Android 2.3

Mã sẽ thực hiện tốt hơn nhiều (Nơi nó sẽ không có ngoại lệ OutOfMemory phần lớn thời gian), nếu android:largeHeap đang được áp dụng trong AndroidManifest.xml.

<application 
    android:name=".MyApplication" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:screenOrientation="nosensor" 
    android:largeHeap="true" 

Hiện tại, android:minSdkVersion của tôi cần đặt thành 15 thay vì 10 (Android 2.3). Nếu không, không thể cho phép android:largeHeap trong AndroidManifest.xml.

<uses-sdk 
    android:minSdkVersion="15" 
    android:targetSdkVersion="15" /> 

Trong đơn apk, làm thế nào có thể tôi có thể thiết

  • Sử dụng tùy chọn android:largeHeap nếu tôi là trong Android 4+
  • Không sử dụng tùy chọn android:largeHeap nếu tôi là trong Android 2.3
+0

bạn có thể tham khảo này: http://stackoverflow.com/questions/11275650/how-to-increase-heap- kích thước-of-an-android-ứng dụng – lokoko

Trả lời

72

Bạn cũng có thể tắt heap lớn trong Honeycomb và bật nó trong ICS hoặc JB. Chỉ cần một chút hacky hoặc một cái gì đó. Đây là những gì tôi đã thử.

Trước khi tiếp tục, hãy thay đổi mục tiêu Xây dựng thành Honeycomb, Jelly Bean hoặc ICS để chúng tôi có thể đặt thuộc tính android:largeHeap. Ngoài ra, bạn có thể đặt android:minSdkVersion thành API 10.

Android API 10 không hỗ trợ đống lớn.

  1. Tạo một thư mục values-v14 trong res thư mục
  2. Tôi tạo ra bools.xml trong values-v14
  3. Đặt giá trị này trong bools.xml của values-v14

<bool name="largeheap">true</bool>

giá trị boolean cho values>bools.xml hoặc values-[API VERSION]>bools.xml để vô hiệu hóa đống lớn trong phiên bản API khác nhau hoặc theo mặc định.

<bool name="largeheap">false</bool> 

Thay đổi giá trị của android:largeHeap để @bool/largeheap thay vì hardcoded true hoặc false

<application 
     android:largeHeap="@bool/largeheap" 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher"> 
       .... 
</application> 

Tôi thử mã này bằng cách làm cho một ứng dụng rò rỉ bộ nhớ hoặc chỉ tải một bitmap lớn, và làm việc của nó!

Chúc may mắn!

+1

wnvoter, giải thích tại sao? – Geros

+2

Không bao giờ là kẻ thù, tôi sẽ thêm điều này vào bài đăng của bạn http://stackoverflow.com/questions/5350465/android-heap-size-on-different-phones-devices-and-os-versions –

0

Dường như bạn có sdk mục tiêu không chính xác trong project.properties tập tin, kiểm tra nó ra và thay đổi mục tiêu để AndroidManifest`s targetSdk (15) và xây dựng lại dự án.

project.properties

# Project target. 
target=15 

T.B. Tôi đã thử thêm android: largeHeap vào Dự án của tôi (minSdk = 7, targetSdk = 17) được biên dịch và chạy bình thường trên tất cả các phiên bản Android.

1
  1. 1.Xây dựng dự án với mục tiêu Android 3.0 (API 11) trở lên. (các thuộc tính dự án - Android - Dự án xây dựng mục tiêu - chọn mức API trên 11)

  2. trong tập tin Manifest, Thay đổi giá trị sử dụng-sdk như sau

    < sử dụng-sdk android: minSdkVersion = "10" android: targetSdkVersion = "11" />

đối với các phiên bản trước của Android 3.0, bạn có thể sử dụng lớp VMRuntime cho thao tác bộ nhớ.

8

Giữ thuộc tính android:largeHeap="true" trong số AndroidManifest.xml của bạn. Điều này nên được bỏ qua cho các phiên bản không hỗ trợ nó. Sau đó, để hỗ trợ các phiên bản cũ hơn, hãy đặt kích thước heap bằng cách sử dụng lớp VMRuntime (thông qua phản ánh, nếu cần).

Thông tin thêm về chủ đề này: How to increase heap size of an android application?

0

Vui lòng thay đổi các thuộc tính dự án:

Trong Properties dự án -> Android -> Dự án xây dựng mục tiêu -> Google API, API mức 19 (hoặc bất kỳ khác mà bạn cần):)

vì vậy, bạn có thể để lại tùy chọn SDK tối thiểu của bạn mà không cần thay đổi, ví dụ 8 :)

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