blob: 3060fbfe734f4e0224c0c38a79eb51bd114c8474 [file] [log] [blame]
page.title=Các thay đổi Hành vi
page.keywords=preview,sdk,compatibility
meta.tags="preview", "compatibility"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-changes_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Trong tài liu này</h2>
<ol>
<li><a href="#perf">Ci thin Hiu năng</a>
<ol>
<li><a href="#doze">Chế độ Ng sâu</a></li>
<li><a href="#bg-opt">Ti ưu hóa Chy ngm</a></li>
</ol>
</li>
<li><a href="#perm">Thay đổi Quyn</a></li>
<li><a href="#accessibility">Ci thin Tr năng</a>
<ol>
<li><a href="#screen-zoom">Thu phóng Màn hình</a></li>
<li><a href="#vision-settings">Cài đặt Kh năng nhìn trong Trình Thiết lp</a></li>
</ol>
</li>
<li><a href="#ndk">Liên kết ng dng NDK vi Thư vin Nn tng</a></li>
<li><a href="#afw">Android cho Công vic</a></li>
</ol>
<h2>Xem thêm</h2>
<ol>
<li><a href="{@docRoot}preview/api-overview.html">
Tng quan v API Android N</a></li>
</ol>
</div>
</div>
<p>
Vi các tính năng và kh năng mi, Android N
cũng có mt s các thay đổi hành vi ca h thng và API. Tài liu
này nêu bt mt s các thay đổi quan trng mà bn cn biết và cân nhc cho
ng dng ca mình.
</p>
<p>
Nếu bn đã tng phát hành ng dng cho Android, hãy lưu ý rng các thay đổi
trong nn tng này có th tác động đến ng dng ca bn.
</p>
<h2 id="perf">Ci thin Hiu năng</h2>
<p>
Android N có cha các thay đổi hành vi ca h thng nhm ci thin thi lượng
pin ca thiết bị, s dng RAM và hiu năng ng dng. Các thay đổi này có th tác động đến
tính kh dng ca tài nguyên và các thông báo h thng đối ti ng dng. Bn
nên tìm hiu các thay đổi này và đánh giá xem ng dng cn phi điu chnh như thế nào đối vi
các thay đổi.
</p>
<h3 id="doze">Chế độ Ng sâu</h3>
<p>
Được đưa vào Android 6.0 (Mc API 23), Chế độ Ng sâu ci thin thi lượng pin bng cách
trì hoãn các hot động ca CPU và mng khi người dùng không cm sc,
không di chuyn và tt màn hình thiết bị. Android N
thêm các ci tiến cho Chế độ Ng sâu bng cách s dng mt tp con các hn chế ca CPU và mng
khi thiết b không được cm sc vi màn hình b tt, nhưng không nht thiết
phi để mt chỗ, ví d như mt thiết b cm tay di chuyn trong túi ca người dùng.
</p>
<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" />
<p class="img-caption">
<strong>Hình 1.</strong> Minh ha cách thc Chế độ Ng sâu áp dng cp đầu tiên ca
các hn chế hot động h thng nhm ci thin thi lượng pin.
</p>
<p>
Khi mt thiết b dùng ngun đin t pin và màn hình b tt trong mt khong thi gian
nht định, thiết b s chuyn vào Chế độ Ng sâu và áp dng tp con đầu tiên ca các hn chế: Nó
s ngt truy cp mng ca ng dng và trì hoãn các tác v và các đồng bộ. Nếu thiết b
được đặt mt ch trong mt khong thi gian nht định sau khi vào Chế độ Ng sâu thì h thng s áp dng
các hn chế còn li ca Chế độ Ng sâu thành {@link android.os.PowerManager.WakeLock}, báo thc
{@link android.app.AlarmManager}, GPS, quét Wi-Fi. Cho dù
mt s hoc tt c các hn chế ca Chế độ Ng sâu có được áp dng hay không thì h thng s đánh thc
thiết b trong các khong thi gian bo trì ngn, trong đó các ng dng được phép
truy cp mng và có th thc thi mi tác vụ/đồng b b trì hoãn.
</p>
<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
<p class="img-caption">
<strong>Hình 2.</strong> Minh ha cách Chế độ Ng sâu áp dng cp th hai ca
các hn chế hot động h thng sau khi thiết b được đặt mt ch trong mt khong thi gian nht định.
</p>
<p>
Lưu ý rng vic bt màn hình hoc cm sc s đưa thiết b thoát Chế độ Ng sâu và
loi b các hn chế x lý này. Hành vi b sung này không
nh hưởng đến các khuyến ngh và các thc hành tt nht khi thích ng cho ng dng ca bn vi phiên bn
Chế độ Ng sâu được đưa vào Android 6.0 (API mc 23) trước đó, như mô t trong
<a href="{@docRoot}training/monitoring-device-state/doze-standby.html">
Ti ưu hóa Chế độ Ng sâu và Chế độ Ch ca ng dng</a>. Bn nên tiếp tc
làm theo các khuyến ngh đó, ví d như s dng Google Cloud Messaging (GCM) để
gi và nhn tin nhn, và hãy tiến hành áp dng các bn cp nht để nhn
hành vi Chế độ Ng sâu b sung.
</p>
<h3 id="bg-opt">D án Svelte: Ti ưu hóa Chy ngm</h3>
<p>
Android N g b ba truyn phát không biu th để giúp ti ưu hóa c
vic s dng b nh ln tiêu th đin năng. Thay đổi này là điu cn thiết bi các truyn phát
không biu th thường xuyên khi động các ng dng đã được đăng ký để lng nghe chúng dưới
nn. G b các truyn phát này có th đem li li ích ln đối vi hiu năng
ca thiết b và tri nghim người dùng.
</p>
<p>
Các thiết b di động thường xuyên gp phi nhng thay đổi v kết ni, chng hn như khi di chuyn
gia Wi-Fi và d liu di động. Hin ti, các ng dng có th theo dõi nhng thay đổi v
kết ni bng cách đăng ký mt b thu truyn phát cho {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} không biểu thị trong bản kê khai
ca chúng. Vì nhiu ng dng đăng ký để nhn truyn phát này do đó mt hot động chuyn mng
duy nht cũng có th khiến tt c các ng dng thc dy và x lý truyn phát đó ngay
lp tc.
</p>
<p>
Tương tự, các ng dng có th đăng ký nhn truyn phát {@link
android.hardware.Camera#ACTION_NEW_PICTURE} và {@link
android.hardware.Camera#ACTION_NEW_VIDEO} không biểu thị từ các ứng dụng khác, ví dụ như
ng dng Camera. Khi mt người dùng chp nh vi ng dng Camera thì nhng ng dng này s thc dy
để x lý truyn phát đó.
</p>
<p>
Để loi b các vn đề này, Android N áp dng các cách ti ưu hóa
sau:
</p>
<ul>
<li>ng dng nhm mc tiêu Android N s không nhn các truyn phát {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION}, ngay cả khi chúng
có các mc nhp ca trong bn kê khai yêu cu thông báo v các s kin này. Nhng ng dng đang chy
tin cnh vn có th lng nghe {@code CONNECTIVITY_CHANGE} qua
lung chính ca chúng nếu yêu cu thông báo bng {@link
android.content.BroadcastReceiver}.
</li>
<li>ng dng không th gi hoc nhn các truyn phát {@link
android.hardware.Camera#ACTION_NEW_PICTURE} hoặc {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Cách tối ưu này
tác động đến mi ng dng, không ch các ng dng nhm mc tiêu Android N.
</li>
</ul>
<p>
Các ln phát hành Android sau này có th loi b thêm các truyn phát không biu thị, cũng
như các dch v chy ngm không còn liên kết. Vì lý do này, bn nên tránh dùng hoc
g b các ph thuc trên các b thu được khai báo trong bn kê khai đối vi các truyn phát không biu thị,
cũng như các dch v chy ngm.
</p>
<p>
Khuôn kh Android cung cp mt s gii pháp để gim thiu s cn thiết đối vi
các truyn phát không biu th hoc các dch v chy ngm này. Ví dụ, API {@link
android.app.job.JobScheduler} cung cp mt cơ chế lên lch hiu qu
cho các hot động mng khi đáp ng các điu kin được ch định, ví d như kết ni ti mt
mng không đo lưu lượng. Bn còn có th s dng {@link
android.app.job.JobScheduler} để phn ng li các thay đổi đối vi trình cung cp ni dung.
</p>
<p>
Để biết thêm thông tin v thay đổi hành vi này và cách thích ng ng dng ca bn,
hãy xem <a href="{@docRoot}preview/features/background-optimization.html">Ti ưu hóa
Chy ngm</a>.
</p>
<h2 id="perm">Thay đổi Quyn</h2>
<p>
Android N có các thay đổi đối vi quyn có th tác động đến ng dng ca bn,
bao gm các quyn tài khon người dùng và mt quyn mi cho phép ghi vào
b nh ngoài. Sau đây là phn tóm tt các quyn đã thay đổi trong
bn xem trước:
</p>
<ul>
<li>{@code GET_ACCOUNTS} (B loi bỏ)
<p>
Quyn GET_ACCOUNTS nay đã b loi bỏ. H thng s b qua quyn
này đối vi các ng dng nhm mc tiêu Android N.
</p>
</li>
</ul>
<h2 id="accessibility">Ci thin Tr năng</h2>
<p>
Android N có các thay đổi nhm nâng cao kh năng s dng
ca nn tng cho nhng người dùng có th lc kém hoc khiếm thị. Nhìn chung, các thay đổi này s không
yêu cu thay đổi mã ngun trong ng dng ca bn. Tuy nhiên, bn cn xem li
các tính năng này và kim th chúng vi ng dng ca mình để đánh giá các tác động tim tàng đối vi tri nghim
người dùng.
</p>
<h3 id="screen-zoom">Thu phóng Màn hình</h3>
<p>
Android N cho phép người dùng đặt <strong>Display size</strong> để phóng to
hoc thu nh tt c các phn t trên màn hình, nh đó ci thin tr năng ca thiết b
cho nhng người dùng có th lc kém. Người dùng không th thu phóng màn hình vượt quá chiu rng màn hình
ti thiu <a href="http://developer.android.com/guide/topics/resources/providing-resources.html">
sw320dp</a>. Đây là chiu rng ca Nexus 4, mt máy đin thoi ph biến có kích c trung bình.
</p>
<div class="cols">
<div class="col-6">
<img src="{@docRoot}preview/images/screen-zoom-1.png" alt="" height="XXX" id="figure1" />
</div>
<div class="col-6">
<img src="{@docRoot}preview/images/screen-zoom-2.png" alt="" height="XXX" id="figure1" />
</div>
</div> <!-- end cols -->
<p class="img-caption">
<strong>Hình 3.</strong> Màn hình bên phi hin th tác động ca
vic tăng kích c Hin th ca mt thiết b đang chy nh h thng Android N.
</p>
<p>
Khi mt độ ca thiết b thay đổi, h thng s thông báo cho các ng dng đang chy theo
nhng cách sau:
</p>
<ul>
<li>Nếu mt ng dng nhm mc tiêu mc API 23 hoc thp hơn thì h thng s t động tt
tt c các tiến trình chy ngm ca ng dng đó. Điu này có nghĩa là nếu mt người dùng ri khi
ng dng đó để m màn hình <em>Settings</em> và thay đổi
<strong>Display size</strong> thì h thng s tt ng dng ging
như trong trường hp thiết b thiếu b nhớ. Nếu ng dng đó có bt k tiến trình nào
chy tin cnh thì h thng s thông báo cho các tiến trình đó v thay đổi cu hình như
mô t trong <a href="{@docRoot}guide/topics/resources/runtime-changes.html">X lý
Thay đổi Thi gian chy</a>, ging như hướng ca thiết b va thay đổi.
</li>
<li>Nếu ng dng nhm mc tiêu Android N thì mi tiến trình ca nó
(chy tin cnh và chy ngm) đều được thông báo v thay đổi cu hình như
mô t trong <a href="{@docRoot}guide/topics/resources/runtime-changes.html">X lý
Thay đổi Thi gian chy</a>.
</li>
</ul>
<p>
Hu hết các ng dng không cn thc hin bt k thay đổi nào để h tr tính năng này, min là
các ng dng đó tuân theo các thc hành tt nht ca Android. Nhng điu c th cn kim tra:
</p>
<ul>
<li>Kim th ng dng ca bn trên mt thiết b có chiu rng màn hình <code><a href=
"{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>
và đảm bo nó hot động đúng.
</li>
<li>Khi cu hình ca thiết b thay đổi, hãy cp nht mi thông tin được lưu tr trong b đệm
ph thuc vào mt độ, ví d như các nh bitmap được lưu đệm hoc các tài nguyên được ti t
mng. Hãy kim tra các thay đổi cu hình khi ng dng khôi phc t trng thái
tm dng.
<p class="note">
<strong>Lưu ý:</strong> Nếu bn lưu tr trong b đệm các d liu ph thuc vào cu hình thì nên
thêm siêu d liu liên quan như kích c
màn hình phù hp hoc mt độ đim nh cho d liu đó. Vic lưu siêu d liu này cho phép bn
quyết định liu bn có cn phi làm mi d liu được lưu tr đệm sau khi mt cu hình
thay đổi.
</p>
</li>
<li>Tránh ch định các kích thước theo đơn v px vì chúng không thay đổi t l theo
mt độ màn hình. Thay vào đó, hãy ch định các kích thước bng các đơn v <a href="{@docRoot}guide/practices/screens_support.html"im nh
độc lp vi mt độ</a> (<code>dp</code>).
</li>
</ul>
<h3 id="vision-settings">Cài đặt Kh năng nhìn trong Trình Thiết lp</h3>
<p>
Android N có Cài đặt Kh năng nhìn trên màn hình Chào mng, nơi người dùng có th
thiết lp các cài đặt tr năng sau đây trên mt thiết b mi:
<strong>Magnification gesture</strong>, <strong>Font size</strong>,
<strong>Display size</strong> và <strong>TalkBack</strong>. Thay đổi này
s tăng kh năng thy được các khiếm khuyết liên quan đến nhng cài đặt màn hình khác nhau. Để
đánh giá tác động ca tính năng này, bn có th kim th ng dng ca mình vi các
cài đặt sau được bt. Bn có th tìm các cài đặt này trong <strong>Settings &gt;
Accessibility</strong>.
</p>
<h2 id="ndk">Liên kết ng dng NDK vi Thư vin Nn tng</h2>
<p>
Android N có các thay đổi đối vi không gian tên để ngăn vic ti các API không công khai.
Nếu bn s dng NDK, bn ch nên s dng các API công khai t nn tng
Android. S dng các API không công khai trong bn phát hành chính thc tiếp theo ca Android
có th khiến ng dng b treo.
</p>
<p>
Để cnh báo cho bn vic s dng các API không công khai, các ng dng chy trên thiết b
Android N s to ra mt li trong phn xut ra ca logcat khi mt ng dng gi mt API không công khai.
Li này cũng được hin th trên màn hình thiết b dưới dng thông báo để h tr
nâng cao nhn biết đối vi tình hung này. Bn nên xem li mã ca ng dng để
g b phn s dng các API nn tng không công khai và kim th k lưỡng ng dng bng
mt thiết b hoc b gi lp ca bn xem trước.
</p>
<p>
Nếu ng dng ca bn ph thuc vào các thư vin ca nn tng, hãy xem tài liu NDK để biết
các cách khc phc cơ bn nhm thay thế các API không công khai bng các API công khai tương ng.
Bn cũng có th liên kết vi các thư vin ca nn tng mà không nhn biết ng dng,
đặc bit nếu ng dng ca bn s dng thư vin thuc mt phn ca nn tng (như
<code>libpng</code>), nhưng không thuc NDK. Trong trường hp đó, hãy đảm bo rng
tp APK ca bn có cha tt c các tp .so bn d định liên kết vi.
</p>
<p class="caution">
<strong>Cn trng:</strong> Mt s thư vin ca bên th ba có th liên kết vi các API
không công khai. Nếu ng dng ca bn s dng các thư vin này thì ng dng ca bn có th gp li sp đổ khi đang chy
trong ln phát hành Android chính thc kế tiếp.
</p>
<p>
Các ng dng không nên ph thuc vào hoc s dng các thư vin gc không kèm theo trong
NDK bi vì chúng có th thay đổi hoc b g b khi khi phát hành bn Android khác
thay cho bn cũ. Vic chuyn t OpenSSL sang BoringSSL là mt ví d v s thay đổi đó.
Ngoài ra, các thiết b khác nhau có th cung cp các mc độ tương thích khác nhau bi
không có yêu cu nào v kh năng tương thích cho các thư vin nn tng không đi kèm vi
NDK. Nếu bn buc phi s dng các thư vin không thuc NDK trên các thiết b cũ, hãy thc hin
quá trình ti ph thuc vào mc Android API.
</p>
<p>
Nhm giúp bn chn đoán các loi vn đề này, sau đây là mt s li Java và NDK
ví d bn có th gp phi khi c dng ng dng vi Android N:
</p>
<p>Ví d li Java:</p>
<pre class="no-pretty-print">
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so"
is not accessible for the namespace "classloader-namespace"
</pre>
<p>Ví d li NDK:</p>
<pre class="no-pretty-print">
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
</pre>
<p>
Sau đây là mt s cách khc phc đối vi ng dng gp phi các kiu li này:
</p>
<ul>
<li>Vic s dng getJavaVM và getJNIEnv trong libandroid_runtime.so có th được thay
bng các hàm JNI chun:
<pre class="no-pretty-print">
AndroidRuntime::getJavaVM -&gt; GetJavaVM from &lt;jni.h&gt;
AndroidRuntime::getJNIEnv -&gt; JavaVM::GetEnv or
JavaVM::AttachCurrentThread from &lt;jni.h&gt;.
</pre>
</li>
<li>Vic s dng ký hiu {@code property_get} trong {@code libcutils.so} có th được
thay bng phương thc {@code __system_property_get} công khai thay thế.
Để làm điu này, hãy dùng {@code __system_property_get} vi câu lnh include sau:
<pre>
#include &lt;sys/system_properties.h&gt;
</pre>
</li>
<li>Vic s dng ký hiu {@code SSL_ctrl} trong {@code libcrypto.so} nên được
thay bng mt ký hiu cc b ca ng dng. Ví dụ, bn nên liên kết tĩnh
{@code libcyrpto.a} trong tp {@code .so} hoc thêm tham chiếu
{@code libcrypto.so} động ca riêng mình t BoringSSL hoc OpenSSL trong ng dng ca bn.
</li>
</ul>
<h2 id="afw">Android cho Công vic</h2>
<p>
Android N có các thay đổi cho ng dng nhm mc tiêu Android cho Công vic, bao gm
các thay đổi đối vi cài đặt chng chỉ, đặt li mt khu, qun lý người dùng
th hai và truy cp các mã định danh ca thiết bị. Nếu bn đang dng các ng dng dành cho
các môi trường Android cho Công vic thì bn nên xem li các thay đổi này và chnh sa
ng dng ca mình cho phù hp.
</p>
<ul>
<li>Bn phi cài đặt mt trình cài đặt chng ch y thác trước khi DPC có th đặt
nó. Đối vi c ng dng người s hu cu hình và ng dng người s hu thiết b nhm mc tiêu SDK N, bn cn
cài đặt trình cài đặt chng ch y thác trước khi trình kim soát
chính sách ca thiết b (DPC) gi
<code>DevicePolicyManager.setCertInstallerPackage()</code>. Nếu trình cài đặt
chưa được cài thì h thng s đưa ra mt
<code>IllegalArgumentException</code>.
</li>
<li>Gi đây các hn chế đặt li mt khu cho người qun lý thiết b s áp dng vi người s hu
cu hình. Người qun lý thiết b không th s dng
<code>DevicePolicyManager.resetPassword()</code> được na để xóa mt khu hoc thay đổi
các mt khu đã đặt. Người qun lý thiết b vn có th đặt mt mt khu nhưng ch
khi thiết b không có mt khu, mã PIN hoc mu hình.
</li>
<li>Người s hu thiết b hoc cu hình có th qun lý các tài khon ngay c khi các hn chế được
đặt. Người s hu thiết b và người s hu cu hình có th gi các API Qun lý tài khon
ngay c khi các hn chế người dùng <code>DISALLOW_MODIFY_ACCOUNTS</code> đã có sn.
</li>
<li>Người s hu thiết b có th qun lý nhng người dùng th cp d dàng hơn. Khi mt thiết b
đang chy trong chế độ người s hu thiết bị, hn chế <code>DISALLOW_ADD_USER</code>
s được đặt t động. Điu này ngăn người dùng to các người dùng
th cp không được qun lý. Ngoài ra, các phương thc <code>CreateUser()</code> và
<code>createAndInitial()</code> đã b loi bỏ; phương thc
<code>DevicePolicyManager.createAndManageUser()</code> mi s thay thế chúng.
</li>
<li>Người s hu thiết b có th truy cp các mã định danh ca thiết bị. Mt người s hu thiết b có th truy cp
địa ch MAC ca Wi-Fi ca mt thiết bị, bng phương thc
<code>DevicePolicyManagewr.getWifiMacAddress()</code>. Nếu Wi-Fi chưa tng
được bt trên thiết b đó thì phương thc này s tr v mt giá tr {@code null}.
</li>
</ul>
<p>
Để biết thêm thông tin v các thay đổi đối vi Android cho Công vic trong Android N, hãy xem
<a href="{@docRoot}preview/features/afw.html">Cp nht ca Android cho Công vic</a>.
</p>
<h2 id="other">Các đim quan trng khác</h2>
<ul>
<li>Khi mt ng dng đang chy trên Android N nhưng nhm mc tiêu mc API thp hơn,
và người dùng thay đổi kích c hin th thì tiến trình ca ng dng s b tt. ng dng
phi có kh năng x lý tình hung này mt cách tinh tế. Nếu không, ng dng s b li sp đổ
khi người dùng khôi phc nó t mc Gn đây.
<p>
Bn cn kim th ng dng để đảm bo
rng hành vi này không xy ra.
Bn có th thc hin điu đó bng cách gây ra mt li sp đổ ging vy
khi tt ng dng mt cách th công qua DDMS.
</p>
<p>
Các ng dng nhm mc tiêu N và cao hơn s không b tt t động khi có các thay đổi v mt độ;
tuy nhiên, chúng có th phn hi khó khăn đối vi các thay đổi cu hình.
</p>
</li>
<li>
Các ng dng trên Android N cn có kh năng x lý các thay đổi cu hình mt cách tinh tế,
và không b li sp đổ trong các ln khi động tiếp theo. Bn có th kim tra hành vi ng dng
bng cách thay đổi kích c phông ch (<strong>Setting</strong> &gt;
<strong>Display</strong> &gt; <strong>Font size</strong>), và sau đó khôi phc
ng dng t mc Gn đây.
</li>
</ul>