計(jì)劃概覽
Android 12 中提供的功能
官方地址:https://developer.android.google.cn/preview
新功能:
用于接收內(nèi)容的統(tǒng)一 API
Android 12 引入了全新的統(tǒng)一 API,您可以從任何可用來源(剪貼板、鍵盤或拖放操作)接收富媒體內(nèi)容。
您可以向界面組件附加新接口 OnReceiveContentListener
,并在通過任何機(jī)制插入內(nèi)容時(shí)獲得回調(diào)蝎宇。此回調(diào)會(huì)成為您的代碼處理接收所有內(nèi)容(從純文本和樣式文本到標(biāo)記、圖片、視頻亲澡、音頻文件等)的唯一位置。
為了向后兼容以前的 Android 版本纫版,我們還向 AndroidX 添加了新的 API(可在 Core 1.5.0-beta1 和 Appcompat 1.3.0-beta-01 中獲得)床绪,我們建議您在實(shí)現(xiàn)此功能時(shí)使用該 API。
統(tǒng)一 API 會(huì)通過創(chuàng)建一個(gè)要實(shí)現(xiàn)的單一 API 來整合這些不同的代碼路徑其弊,這樣您就可以專注于應(yīng)用特定的邏輯会涎,而讓平臺(tái)處理其余的工作:
public class MyReceiver implements OnReceiveContentListener {
public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};
@Override
public ContentInfoCompat onReceiveContent(View view, ContentInfoCompat contentInfo) {
Pair<ContentInfoCompat, ContentInfoCompat> split = contentInfo.partition(
item -> item.getUri() != null);
ContentInfo uriContent = split.first;
ContentInfo remaining = split.second;
if (uriContent != null) {
ClipData clip = uriContent.getClip();
for (int i = 0; i < clip.getItemCount(); i++) {
Uri uri = clip.getItemAt(i).getUri();
// App-specific logic to handle the URI ...
}
}
// Return anything that your app didn't handle. This preserves the default platform
// behavior for text and anything else that you aren't implementing custom handling for.
return remaining;
}
}
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
AppCompatEditText myInput = findViewById(R.id.my_input);
ViewCompat.setOnReceiveContentListener(myInput, MyReceiver.MIME_TYPES, new MyReceiver());
}
}
兼容的媒體轉(zhuǎn)碼
Android 12 可以自動(dòng)將設(shè)備上錄制的 HEVC(H.265) 和 HDR(HDR10 和 HDR10+)視頻轉(zhuǎn)碼為 AVC (H.264),AVC (H.264) 是與標(biāo)準(zhǔn)播放器廣泛兼容的格式瑞凑。因此末秃,當(dāng)現(xiàn)代編解碼器可用且不會(huì)影響與舊應(yīng)用的兼容性時(shí),便會(huì)利用現(xiàn)代編解碼器籽御。
如果視頻被不支持 HEVC 格式的應(yīng)用打開练慕,Android 會(huì)自動(dòng)將以 HEVC (H.265) 等格式錄制的視頻轉(zhuǎn)碼為 AVC (H.264) 格式。
Android 假定應(yīng)用可以支持播放所有媒體格式技掏,因此兼容的媒體轉(zhuǎn)碼在默認(rèn)情況下是關(guān)閉的铃将。如果應(yīng)用請(qǐng)求將媒體轉(zhuǎn)碼為更兼容的格式,則應(yīng)聲明其媒體功能哑梳。有兩種聲明這些功能的方法:在資源中聲明劲阎,或在代碼中內(nèi)嵌聲明。
在資源中聲明功能
<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
<format android:name="HEVC" supported="true"/>
<format android:name="HDR10" supported="false"/>
<format android:name="HDR10Plus" supported="false"/>
</media-capabilities>
在此示例中鸠真,設(shè)備上錄制的 HDR 視頻被無縫轉(zhuǎn)碼為 AVC SDR(標(biāo)準(zhǔn)動(dòng)態(tài)范圍)視頻悯仙,而 HEVC 視頻則無法轉(zhuǎn)碼龄毡。
在 application
標(biāo)記中使用 property
標(biāo)記來添加對(duì)媒體功能文件的引用。
<property
android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
android:resource="@xml/media_capabilities" />
在代碼中聲明功能
通過 ContentResolver#openTypedAssetFileDescriptor()
等方法訪問媒體內(nèi)容時(shí)锡垄,請(qǐng)使用此對(duì)象:
ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder()
.addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
.addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
.addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
.build();
Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities);
try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
// Content will be transcoded based on values defined in the
// ApplicationMediaCapabilities provided.
}
此方法優(yōu)先于應(yīng)用的 AndroidManifest.xml
中關(guān)聯(lián)的功能沦零,允許針對(duì)特定代碼路徑進(jìn)行更精細(xì)的控制,例如執(zhí)行 A/B 測(cè)試货岭。
AVIF 圖片支持
Android 12 引入了對(duì)使用 AV1 圖片文件格式 (AVIF) 的圖片的支持路操。AVIF 是一種使用 AV1 編碼的圖片和圖片序列的容器格式。它利用了視頻壓縮的幀內(nèi)編碼內(nèi)容千贯。與以前的圖片格式(例如 JPEG)相比屯仗,這種格式可顯著提升相同文件大小下的圖片質(zhì)量。
從音頻產(chǎn)生觸感反饋效果
Android 12 應(yīng)用可使用手機(jī)的振動(dòng)器從音頻會(huì)話產(chǎn)生觸感反饋搔谴。這可讓您獲得更身臨其境的游戲和音頻體驗(yàn)祭钉。例如,觸感反饋效果增強(qiáng)的鈴聲有助于識(shí)別來電者己沛,或者賽車游戲可以模擬在崎嶇地形駕駛的感覺慌核。
如需了解詳情,請(qǐng)參閱 HapticGenerator 參考文檔申尼。
動(dòng)畫 GIF 和 WebP 的原生 ImageDecoder 支持
在 Android 12 中垮卓,NDK ImageDecoder
API 已進(jìn)行了擴(kuò)展,可以對(duì)使用以下文件格式的圖片的所有幀和時(shí)間數(shù)據(jù)進(jìn)行解碼:動(dòng)畫 GIF 和動(dòng)畫 WebP 文件格式师幕。在 Android 11 中引入該 API 時(shí)粟按,該 API 僅從這些格式的動(dòng)畫中解碼第一張圖片。
使用 ImageDecoder
(而非第三方庫)可進(jìn)一步縮減 APK 大小霹粥,并從未來與安全性和性能相關(guān)的更新中受益灭将。
如需詳細(xì)了解該 API,請(qǐng)參閱 API 參考文檔和 GitHub 上的示例后控。
Drawable drawable = ImageDecoder.decodeDrawable(source);
if (drawable instanceof AnimatedImageDrawable) {
((AnimatedImageDrawable) drawable).start();
}
安全性
在非 DPC (設(shè)備策略Controller )應(yīng)用中提供設(shè)備屬性驗(yàn)證
Android 12 擴(kuò)展了一組應(yīng)用庙曙,當(dāng)這些應(yīng)用生成新密鑰時(shí),可以驗(yàn)證認(rèn)證證書中的設(shè)備屬性浩淘。
自 Android 9(API 級(jí)別 28)起捌朴,使用 Keymaster 4.0 或更高版本的設(shè)備政策所有者 (DPO) 可以驗(yàn)證這些認(rèn)證證書中的設(shè)備屬性。從 Android 12 開始张抄,任何以 Android 12 為目標(biāo)平臺(tái)的應(yīng)用都可以使用 setDevicePropertiesAttestationIncluded()
方法執(zhí)行此驗(yàn)證砂蔽。
生成的設(shè)備屬性包含以下 Build
字段:
BRAND
DEVICE
MANUFACTURER
MODEL
PRODUCT
企業(yè)功能新變化
工作資料的安全和隱私權(quán)增強(qiáng)功能
對(duì)于具有工作資料的個(gè)人設(shè)備,Android 12 提供了以下功能:
密碼復(fù)雜度功能以預(yù)定義復(fù)雜存儲(chǔ)分區(qū)(高署惯、中左驾、低和無)的形式設(shè)定設(shè)備級(jí)密碼要求。如有必要,可對(duì)工作資料安全驗(yàn)證應(yīng)用嚴(yán)格的密碼要求诡右。
工作資料安全驗(yàn)證新手入門流程已簡(jiǎn)化“财瘢現(xiàn)在,設(shè)置會(huì)考慮設(shè)備密碼是否符合管理員要求稻爬,讓用戶可以輕松選擇是增強(qiáng)設(shè)備密碼的強(qiáng)度還是使用工作資料安全驗(yàn)證。
注冊(cè)特定 ID 提供了一個(gè)唯一 ID蜕依,用于標(biāo)識(shí)特定組織的工作資料注冊(cè)桅锄,并且可在恢復(fù)出廠設(shè)置后保持穩(wěn)定。在 Android 12 中样眠,對(duì)于具有工作資料的個(gè)人設(shè)備友瘤,系統(tǒng)會(huì)移除對(duì)該設(shè)備的其他硬件標(biāo)識(shí)符(IMEI、MEID檐束、序列號(hào))的訪問權(quán)限辫秧。
公司自有設(shè)備(無論是否具有工作資料)可以選擇是否保留上述列表項(xiàng)中列出的功能,但不需要在 Android 12 中采用被丧。
非受管設(shè)備證書管理
沒有管理功能的設(shè)備現(xiàn)在可以利用 Android 的設(shè)備密鑰生成功能管理證書:
用戶可以授予證書管理應(yīng)用管理其憑據(jù)(不包括 CA 證書)的權(quán)限盟戏。
證書管理應(yīng)用可以使用 Android 的設(shè)備密鑰生成功能。
證書管理應(yīng)用可以聲明支持使用憑據(jù)進(jìn)行身份驗(yàn)證的應(yīng)用和 URI 的列表甥桂。
新 API 可提供新功能:
檢查現(xiàn)有的設(shè)備級(jí)密碼是否符合明確設(shè)備密碼要求柿究。
檢查給定別名下是否安裝了證書和私鑰。
棄用
Android 12 棄用了以下 API黄选,值得引起注意:
不再使用
setPasswordQuality()
和getPasswordQuality()
在具有工作資料的個(gè)人設(shè)備而非公司自有設(shè)備上設(shè)置設(shè)備級(jí)密碼蝇摸。DPC 應(yīng)改用setRequiredPasswordComplexity()
。setOrganizationColor()
和getOrganizationColor()
在 Android 12 中已完全棄用办陷。
連接性
Wi-Fi 感知 (NAN) 增強(qiáng)功能
Android 12 增強(qiáng)了 Wi-Fi 感知功能:
在搭載 Android 12 及更高版本的設(shè)備上貌夕,您可以使用
onServiceLost()
回調(diào),以便在應(yīng)用因服務(wù)停止或超出范圍而導(dǎo)致已發(fā)現(xiàn)的服務(wù)丟失時(shí)收到提醒民镜。設(shè)置多個(gè)數(shù)據(jù)路徑(NAN 數(shù)據(jù)路徑)的方式將發(fā)生變化以提高效率啡专。較低的版本使用 L2 消息功能來交換發(fā)起方的對(duì)等信息,由此導(dǎo)致了延遲制圈。在搭載 Android 12 及更高版本的設(shè)備上植旧,可以將響應(yīng)方(服務(wù)器)配置為接受任何對(duì)等方,也就是說离唐,它不需要預(yù)先知道發(fā)起方信息病附。這可加快數(shù)據(jù)路徑啟動(dòng),并只需一個(gè)網(wǎng)絡(luò)請(qǐng)求即可實(shí)現(xiàn)多個(gè)點(diǎn)對(duì)點(diǎn)鏈接亥鬓。
為了防止框架因資源不足而拒絕發(fā)現(xiàn)請(qǐng)求或連接請(qǐng)求完沪,在搭載 Android 12 及更高版本的設(shè)備上,您可以調(diào)用
WifiAwareManager.getAvailableAwareResources()
。通過此方法的返回值覆积,您可以獲得可用數(shù)據(jù)路徑的數(shù)量听皿、可用發(fā)布會(huì)話的數(shù)量以及可用的訂閱會(huì)話數(shù)量。
行為變更:所有應(yīng)用
Android 12 平臺(tái)包含一些行為變更宽档,這些變更可能會(huì)影響您的應(yīng)用尉姨。以下行為變更將影響在 Android 12 上運(yùn)行的所有應(yīng)用,無論采用哪種 targetSdkVersion
都不例外吗冤。您應(yīng)該測(cè)試您的應(yīng)用又厉,然后根據(jù)需要進(jìn)行修改,以適當(dāng)?shù)刂С诌@些變更椎瘟。
用戶體驗(yàn)
沉浸模式下的手勢(shì)導(dǎo)航改進(jìn)(弱相關(guān))
Android 12 簡(jiǎn)化了沉浸模式覆致,使手勢(shì)導(dǎo)航更易于操作且與其他活動(dòng)體驗(yàn)(例如觀看視頻和閱讀圖書)更加一致。應(yīng)用仍然可以在全屏游戲體驗(yàn)中防止意外手勢(shì)肺蔚,以免用戶在玩游戲時(shí)意外退出游戲煌妈;所有其他全屏或沉浸式體驗(yàn)現(xiàn)在都允許用戶通過滑動(dòng)手勢(shì)進(jìn)行導(dǎo)航。
為了實(shí)現(xiàn)這一點(diǎn)宣羊,從 Android 12 開始璧诵,我們已棄用非粘性沉浸式體驗(yàn)(
BEHAVIOR_SHOW_BARS_BY_TOUCH
、BEHAVIOR_SHOW_BARS_BY_SWIPE
)的現(xiàn)有行為仇冯。它們已被默認(rèn)行為 (BEHAVIOR_DEFAULT
) 取代腮猖,即在隱藏系統(tǒng)欄后,允許使用滑動(dòng)手勢(shì)赞枕。此標(biāo)志會(huì)根據(jù)模式顯示不同的視覺和功能行為:在“三按鈕”模式下澈缺,視覺和功能行為與 Android 12 之前的版本中的沉浸模式相同。
-
在手勢(shì)導(dǎo)航模式下炕婶,行為如下:
- 在視覺上姐赡,它與 Android 11 及更低版本中的沉浸模式相同。
從功能上講柠掂,即使系統(tǒng)欄被隱藏项滑,也允許使用手勢(shì);只需滑動(dòng)屏幕一次便可調(diào)用系統(tǒng)返回操作涯贞,而 Android 11 需要滑動(dòng)兩次枪狂。下拉通知欄或轉(zhuǎn)到主屏幕無需另外滑動(dòng)屏幕。
Android 12 的粘性沉浸模式 (
BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
) 沒有任何變化宋渔。請(qǐng)注意此功能的以下向后兼容性:-
如果應(yīng)用以 Android 11 及更低版本為目標(biāo)平臺(tái)州疾,則在 Android 12 上運(yùn)行時(shí):
-
BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
展示出的功能和呈現(xiàn)出的視覺效果相同。
-
默認(rèn)值會(huì)映射到
BEHAVIOR_SHOW_BARS_BY_SWIPE
皇拣。-
如果應(yīng)用以 Android 12 為目標(biāo)平臺(tái)严蓖,則在 Android 11(API 級(jí)別 30)及更低版本上運(yùn)行時(shí):
- 展示出的功能和呈現(xiàn)出的視覺效果應(yīng)該是相同的薄嫡,但
BEHAVIOR_SHOW_BARS_BY_TOUCH
映射到BEHAVIOR_SHOW_BARS_BY_SWIPE
的情況除外。
- 展示出的功能和呈現(xiàn)出的視覺效果應(yīng)該是相同的薄嫡,但
請(qǐng)務(wù)必更新您的 SDK 級(jí)別颗胡,以獲得新的默認(rèn)值 (
BEHAVIOR_SHOW_BARS_BY_SWIPE
)毫深。否則,BEHAVIOR_SHOW_BARS_BY_TOUCH
的默認(rèn)值會(huì)保持不變毒姨。
前臺(tái)服務(wù)通知延遲
為了在 Android 12 上提供針對(duì)短時(shí)間運(yùn)行的前臺(tái)服務(wù)的流暢體驗(yàn)哑蔫,系統(tǒng)可以為某些前臺(tái)服務(wù)延遲 10 秒顯示前臺(tái)服務(wù)通知。此更改使某些短期任務(wù)在顯示通知之前完成弧呐。
如果某項(xiàng)前臺(tái)服務(wù)至少具有以下特征之一闸迷,則系統(tǒng)會(huì)在服務(wù)啟動(dòng)后立即顯示相關(guān)通知:
該服務(wù)與包含操作按鈕的通知相關(guān)聯(lián)。
該服務(wù)的
foregroundServiceType
為connectedDevice
泉懦、mediaPlayback
稿黍、mediaProjection
或phoneCall
疹瘦。該服務(wù)根據(jù)通知的類別屬性中的定義崩哩,提供與通話、導(dǎo)航或媒體播放相關(guān)的用例言沐。
注意:在未來的 Android 12 開發(fā)者預(yù)覽版中邓嘹,這些用例可能會(huì)發(fā)生變化。
- 該服務(wù)通過在設(shè)置通知時(shí)調(diào)用
setShowForegroundImmediately()
险胰,以停用行為變更汹押。
隱私設(shè)置
對(duì) Netlink MAC 地址的限制(強(qiáng)相關(guān))
Android 12 進(jìn)一步限制了所有非系統(tǒng)應(yīng)用對(duì)設(shè)備的 MAC 地址(不可重置的標(biāo)識(shí)符)的訪問,無論目標(biāo) API 級(jí)別如何都是如此起便。
相關(guān) API 會(huì)返回空值或占位值棚贾,具體取決于應(yīng)用的目標(biāo) SDK 版本:
如果應(yīng)用以 Android 12 為目標(biāo)平臺(tái),則該 API 會(huì)返回 null榆综。
如果應(yīng)用以 Android 11 或更低版本為目標(biāo)平臺(tái)妙痹,則該 API 將返回硬編碼占位值:
02:00:00:00:00:00
開發(fā)者應(yīng)使用 ConnectivityManager
,而不是較低級(jí)別的 API(例如 NetworkInterface
鼻疮、getifaddrs()
)或 Netlink 套接字怯伊。開發(fā)者在其代碼中調(diào)用 NetworkInterface.getHardwareAddress()
時(shí),logcat 輸出會(huì)顯示:CompatibilityChangeReporter: Compat change id reported: 170188668;
開發(fā)者可以使用名為 RETURN_NULL_HARDWARE_ADDRESS
的兼容性標(biāo)志切換 NetworkInterface.getHardwareAddress()
的行為:在啟用時(shí)返回 null判沟,或在停用時(shí)返回 02:00:00:00:00:00
耿芹。
安全性
不受信任的觸摸事件被屏蔽
為了維持系統(tǒng)安全并保持良好的用戶體驗(yàn),Android 12 會(huì)阻止應(yīng)用使用觸摸事件挪哄,使用觸摸事件時(shí)疊加層會(huì)以不安全的方式遮掩應(yīng)用吧秕。 換言之,系統(tǒng)會(huì)屏蔽穿透某些窗口的觸摸操作迹炼,但有一些例外情況寇甸。
受影響的應(yīng)用
此變更會(huì)影響選擇讓觸摸操作穿透其窗口的應(yīng)用,例如使用 FLAG_NOT_TOUCHABLE
標(biāo)志。包括但不限于以下示例:
需要
SYSTEM_ALERT_WINDOW
權(quán)限并使用FLAG_NOT_TOUCHABLE
標(biāo)志的疊加層拿霉,例如使用TYPE_APPLICATION_OVERLAY
的窗口吟秩。使用
FLAG_NOT_TOUCHABLE
標(biāo)志的 activity 窗口。消息框消息绽淘。
例外情況
在以下情況下涵防,允許執(zhí)行“穿透”觸摸操作:
應(yīng)用中的互動(dòng)。您的應(yīng)用會(huì)顯示疊加層沪铭,并且只有當(dāng)用戶與您的應(yīng)用進(jìn)行互動(dòng)時(shí)才會(huì)顯示疊加層壮池。
-
可信窗口
。包括但不限于以下窗口:
注意:類型為 TYPE_APPLICATION_OVERLAY
的窗口不受信任杀怠。
不可見窗口椰憋。窗口的根視圖是
GONE
或INVISIBLE
。全透明窗口赔退。窗口的
alpha
屬性為 0.0橙依。足夠半透明的系統(tǒng)警報(bào)窗口。當(dāng)組合后的不透明度小于或等于系統(tǒng)針對(duì)觸摸的最大遮掩不透明度時(shí)硕旗,系統(tǒng)會(huì)將一組系統(tǒng)警報(bào)窗口視為足夠半透明窗骑。 在開發(fā)者預(yù)覽版 1 中,此最大不透明度是 0.8漆枚,但在今后的開發(fā)者預(yù)覽版中此值可能會(huì)發(fā)生變化创译。
應(yīng)用無法關(guān)閉系統(tǒng)對(duì)話框
為了加強(qiáng)用戶與應(yīng)用和系統(tǒng)互動(dòng)時(shí)的控制,從 Android 12 開始墙基,棄用了 ACTION_CLOSE_SYSTEM_DIALOGS
intent 操作软族。除了一些特殊情況之外,當(dāng)應(yīng)用嘗試調(diào)用包含此操作的 intent 時(shí)残制,系統(tǒng)會(huì)基于應(yīng)用的目標(biāo) SDK 版本執(zhí)行以下操作之一:
如果應(yīng)用以 Android 12 為目標(biāo)平臺(tái)立砸,則會(huì)發(fā)生
SecurityException
。如果應(yīng)用以 Android 11(API 級(jí)別 30)或更低版本為目標(biāo)平臺(tái)痘拆,則系統(tǒng)不會(huì)執(zhí)行 intent仰禽,并且 Logcat 中會(huì)顯示以下消息:
例外情況
在以下情況下,應(yīng)用仍然可以在 Android 12 上關(guān)閉系統(tǒng)對(duì)話框:
注意:如果您的應(yīng)用以 Android 12 為目標(biāo)平臺(tái)桥氏,在這種情況下您無需使用 ACTION_CLOSE_SYSTEM_DIALOGS
温峭。這是因?yàn)椋绻诖翱谖挥诔閷鲜酵ㄖ獧诘捻敳繒r(shí)您的應(yīng)用調(diào)用 startActivity()
字支,系統(tǒng)會(huì)自動(dòng)關(guān)閉抽屜式通知欄凤藏。
- 您的應(yīng)用以 Android 11 或更低版本為目標(biāo)平臺(tái)奸忽。此外,用戶已與通知互動(dòng)揖庄,可能使用了通知的操作按鈕栗菜,您的應(yīng)用正在處理服務(wù)或廣播接收器來響應(yīng)該用戶操作。
限制非 SDK 接口(強(qiáng)相關(guān))
Android 12 包含更新后的受限制非 SDK 接口列表(基于與 Android 開發(fā)者之間的協(xié)作以及最新的內(nèi)部測(cè)試)蹄梢。在限制使用非 SDK 接口之前疙筹,我們會(huì)盡可能確保有可用的公開替代方案。
如果您的應(yīng)用并非以 Android 12 為目標(biāo)平臺(tái)禁炒,其中一些變更可能不會(huì)立即對(duì)您產(chǎn)生影響而咆。然而,雖然您目前仍可以使用一些非 SDK 接口(具體取決于應(yīng)用的目標(biāo) API 級(jí)別)幕袱,但只要您使用任何非 SDK 方法或字段暴备,終歸存在導(dǎo)致應(yīng)用出問題的顯著風(fēng)險(xiǎn)。
如果您不確定自己的應(yīng)用是否使用了非 SDK 接口们豌,則可以測(cè)試該應(yīng)用來進(jìn)行確認(rèn)涯捻。如果您的應(yīng)用依賴于非 SDK 接口,您應(yīng)該開始計(jì)劃遷移到 SDK 替代方案玛痊。然而汰瘫,我們知道某些應(yīng)用具有使用非 SDK 接口的有效用例狂打。如果您無法為應(yīng)用中的某項(xiàng)功能找到使用非 SDK 接口的替代方案擂煞,應(yīng)請(qǐng)求新的公共 API。
如需詳細(xì)了解此 Android 版本中的變更趴乡,請(qǐng)參閱 Android 12 中有關(guān)限制非 SDK 接口的更新对省。如需全面了解有關(guān)非 SDK 接口的詳細(xì)信息,請(qǐng)參閱對(duì)非 SDK 接口的限制晾捏。
行為變更:以 Android 12 為目標(biāo)平臺(tái)的應(yīng)用
以下行為變更僅影響以 Android 12 或更高版本為目標(biāo)平臺(tái)的應(yīng)用蒿涎。如果您的應(yīng)用以 Android 12 為目標(biāo)平臺(tái),您應(yīng)該修改自己的應(yīng)用以適當(dāng)?shù)刂С诌@些行為(如果適用)惦辛。
無法復(fù)制加載中的內(nèi)容
隱私設(shè)置
WebView 中的現(xiàn)代 SameSite Cookie 行為(弱相關(guān))
Android 的 WebView 組件基于為 Google 的 Chrome 瀏覽器提供支持的開源項(xiàng)目 Chromium劳秋。在過去一年中,Chromium 變更了對(duì)第三方 Cookie 的處理方式胖齐,目的是為了更好地保護(hù)用戶的安全和隱私玻淑,并賦予用戶更高的透明度和控制權(quán)。這些變更已面向很多 Chrome 用戶發(fā)布呀伙,從 Android 12 開始补履,這些變更將應(yīng)用于 WebView 中。
Cookie 的 SameSite
屬性決定了它是可以與任何請(qǐng)求一起發(fā)送剿另,還是只能與同站點(diǎn)請(qǐng)求一起發(fā)送箫锤。Android 12 中的 WebView 基礎(chǔ)版本(版本 89.0.4385.0)包含以下隱私保護(hù)方面的變更贬蛙,旨在改善對(duì)第三方 Cookie 的默認(rèn)處理方式,并幫助防止意外跨站點(diǎn)共享:
沒有
SameSite
屬性的 Cookie 被視為SameSite=Lax
谚攒。帶有
SameSite=None
的 Cookie 還必須指定Secure
屬性阳准,這意味著它們需要安全的上下文,并應(yīng)通過 HTTPS 發(fā)送馏臭。站點(diǎn)的 HTTP 版本和 HTTPS 版本之間的鏈接現(xiàn)在被視為跨站點(diǎn)請(qǐng)求溺职,因此除非將 Cookie 正確標(biāo)記為
SameSite=None; Secure
,否則 Cookie 不會(huì)被發(fā)送位喂。
對(duì)于開發(fā)者而言浪耘,一般指導(dǎo)意見是識(shí)別關(guān)鍵用戶流中的跨站點(diǎn) Cookie 依賴項(xiàng),并確保在需要時(shí)使用適當(dāng)?shù)闹碉@式設(shè)置 SameSite
屬性塑崖。您必須顯式指定允許在不同網(wǎng)站上運(yùn)行的 Cookie七冲,或適用于從 HTTP 切換到 HTTPS 進(jìn)行同站點(diǎn)導(dǎo)航的 Cookie。
如需了解有關(guān)這些變更的網(wǎng)站開發(fā)者完整指南规婆,請(qǐng)參閱 SameSite Cookie 說明和 Schemeful SameSite澜躺。
在您的應(yīng)用中測(cè)試 SameSite 行為
如果您的應(yīng)用使用 WebView,或者您需要管理使用 Cookie 的網(wǎng)站或服務(wù)抒蚜,我們建議您在 Android 12 WebView 上測(cè)試您的數(shù)據(jù)流掘鄙。 如果發(fā)現(xiàn)問題,您可能需要更新 Cookie 以支持新的 SameSite 行為嗡髓。
留意登錄和嵌入式內(nèi)容中存在的問題操漠,以及用戶從不安全的頁面啟動(dòng)并轉(zhuǎn)到安全頁面的登錄流、購買和其他身份驗(yàn)證流饿这。
如需使用 WebView 測(cè)試應(yīng)用浊伙,您必須完成以下任一步驟,為需要測(cè)試的應(yīng)用啟用新的 SameSite 行為:
- 在 WebView devtools 中切換界面標(biāo)志 webview-enable-modern-cookie-same-site长捧,在測(cè)試設(shè)備上手動(dòng)啟用 SameSite 行為嚣鄙。
此方法允許您在任何運(yùn)行 Android 5.0(API 級(jí)別 21)或更高版本(包括 Android 12)和 WebView 版本 89.0.4385.0 或更高版本的設(shè)備上進(jìn)行測(cè)試。
- 通過
targetSdkVersion
編譯您的應(yīng)用串结,使其以 Android 12 為目標(biāo)平臺(tái)哑子。
如果您使用此方法,則必須使用運(yùn)行 Android 12 和 WebView 版本 89.0.4385.0 或更高版本的設(shè)備肌割。
注意:由于 Android 12 開發(fā)者預(yù)覽版 1 中存在一個(gè)已知會(huì)影響 WebView 的問題卧蜓,您目前無法在 Android 12 上啟用或測(cè)試 Schemeful Same-Site 變更。 我們已在內(nèi)部解決這個(gè)問題声功,并將在未來的開發(fā)者預(yù)覽版中添加此解決措施烦却。在此期間,您仍可以針對(duì)其他 SameSite 變更在 Android 12 上測(cè)試您的應(yīng)用(請(qǐng)參閱默認(rèn) SameSite=Lax 和 SameSite=None 必須是安全的)先巴。如需了解有關(guān) Android 上的 WebView 遠(yuǎn)程調(diào)試的信息其爵,請(qǐng)參閱 Android 設(shè)備的遠(yuǎn)程調(diào)試入門冒冬。
adb 備份限制
為了保護(hù)私有應(yīng)用數(shù)據(jù),Android 12 變更了 adb backup
命令的默認(rèn)行為摩渺。對(duì)于以 Android 12 為目標(biāo)平臺(tái)的應(yīng)用简烤,用戶運(yùn)行 adb backup
命令時(shí),從設(shè)備導(dǎo)出的任何其他系統(tǒng)數(shù)據(jù)都不包含應(yīng)用數(shù)據(jù)摇幻。
如果您的測(cè)試或開發(fā)工作流程依賴于使用 adb backup
的應(yīng)用數(shù)據(jù)横侦,現(xiàn)在您可以選擇通過在應(yīng)用的清單文件中將 android:debuggable
設(shè)置為 true
來導(dǎo)出應(yīng)用數(shù)據(jù)。
注意:為了幫助保護(hù)應(yīng)用數(shù)據(jù)绰姻,請(qǐng)務(wù)必在發(fā)布應(yīng)用前將 android:debuggable
設(shè)置為 false
枉侧。
安全性
更安全地導(dǎo)出組件(強(qiáng)相關(guān))
如果您的應(yīng)用以 Android 12 為目標(biāo)平臺(tái),且包含使用 intent 過濾器的 activity狂芋、服務(wù)或廣播接收器榨馁,您必須為這些應(yīng)用組件顯式聲明 android:exported
屬性。
警告:如果 activity帜矾、服務(wù)或廣播接收器使用 intent 過濾器翼虫,并且未顯式聲明 android:exported
的值,則您的應(yīng)用將無法在搭載 Android 12 的設(shè)備上進(jìn)行安裝屡萤。
以下代碼段顯示了一個(gè)服務(wù)示例珍剑,該服務(wù)包含 intent 過濾器并針對(duì) Android 12 進(jìn)行了正確配置:
<service android:name="com.example.app.backgroundService"
android:exported="false">
<intent-filter>
<action android:name="com.example.app.START_BACKGROUND" />
</intent-filter>
</service>
待處理 intent 必須聲明可變性
如果您的應(yīng)用以 Android 12 為目標(biāo)平臺(tái),您必須為您的應(yīng)用創(chuàng)建的每個(gè) PendingIntent
對(duì)象指定可變性死陆。這項(xiàng)額外的要求可提高應(yīng)用的安全性招拙。
如需聲明特定 PendingIntent
對(duì)象是否可變,請(qǐng)分別使用 PendingIntent.FLAG_MUTABLE
或 PendingIntent.FLAG_IMMUTABLE
標(biāo)志翔曲。如果您的應(yīng)用試圖在不設(shè)置任何可變標(biāo)志的情況下創(chuàng)建 PendingIntent
對(duì)象迫像,系統(tǒng)會(huì)拋出 IllegalArgumentException
盡可能創(chuàng)建不可變的待處理 intent
在大多數(shù)情況下劈愚,您的應(yīng)用應(yīng)創(chuàng)建不可變的 PendingIntent
對(duì)象瞳遍,如以下代碼段所示。如果 PendingIntent
對(duì)象不可變菌羽,則應(yīng)用無法修改 intent 來調(diào)整調(diào)用 intent 的結(jié)果掠械。
然而,某些應(yīng)用需要?jiǎng)?chuàng)建可變的 PendingIntent
對(duì)象:
通知中的直接回復(fù)操作需要變更與回復(fù)關(guān)聯(lián)的
PendingIntent
對(duì)象中的剪輯數(shù)據(jù)注祖。通常猾蒂,您可以通過將FILL_IN_CLIP_DATA
作為標(biāo)志傳遞給fillIn()
的方法請(qǐng)求此變更。如果您的應(yīng)用使用
PendingIntent
將對(duì)話放在氣泡中是晨,則 intent 應(yīng)該可變肚菠,以便系統(tǒng)可以應(yīng)用正確的標(biāo)志,例如FLAG_ACTIVITY_MULTIPLE_TASK
和FLAG_ACTIVITY_NEW_DOCUMENT
罩缴。
如果您的應(yīng)用創(chuàng)建了可變的 PendingIntent
對(duì)象蚊逢,強(qiáng)烈建議您使用顯式 intent 并填寫 ComponentName
层扶。如此一來,每當(dāng)另一個(gè)應(yīng)用調(diào)用 PendingIntent
并將控制權(quán)傳回您的應(yīng)用時(shí)烙荷,應(yīng)用中的相同組件都會(huì)啟動(dòng)镜会。
注:目前的S版本,即使聲明了PendingIntent.FLAG_IMMUTABLE
终抽,依舊會(huì)報(bào)錯(cuò)
以不安全的方式啟動(dòng)嵌套 intent
為了提高平臺(tái)安全性戳表,Android 12 提供了一種調(diào)試功能,如果您的應(yīng)用以不安全的方式啟動(dòng)嵌套 intent昼伴,此功能便會(huì)發(fā)出警告匾旭。嵌套 intent 是在其他 intent 中作為 extra 傳遞的 intent。如果您的應(yīng)用同時(shí)執(zhí)行以下兩項(xiàng)操作圃郊,就會(huì)發(fā)生 StrictMode 違規(guī)行為季率。
- 您的應(yīng)用從已傳遞的 intent 的 extra 中解封嵌套 intent。
- 您的應(yīng)用立即使用該嵌套 intent 啟動(dòng)應(yīng)用組件描沟,例如將 intent 傳遞給
startActivity()
飒泻、startService()
或bindService()
。
配置應(yīng)用以檢測(cè)嵌套 intent 的不安全啟動(dòng)
如需檢查您的應(yīng)用中是否會(huì)以不安全的方式啟動(dòng)嵌套 intent吏廉,請(qǐng)?jiān)谂渲?VmPolicy
時(shí)調(diào)用 detectUnsafeIntentLaunch()
泞遗,如以下代碼段所示。如果您的應(yīng)用檢測(cè)到 StrictMode 違規(guī)行為席覆,您可能需要停止應(yīng)用的執(zhí)行以保護(hù)潛在的敏感信息史辙。
protected void onCreate() {
StrictMode.setVmPolicy(new VmPolicy.Builder()
// Other StrictMode checks that you've previously added.
// ...
.detectUnsafeIntentLaunch()
.penaltyLog()
// Consider also adding penaltyDeath()
.build());
}
更負(fù)責(zé)地使用 intent
您的應(yīng)用可能會(huì)啟動(dòng)嵌套 intent,以便在應(yīng)用的各個(gè)組件之間導(dǎo)航佩伤,或代表其他應(yīng)用執(zhí)行操作聊倔。如需在這兩種情況下最大限度地降低出現(xiàn) StrictMode 違規(guī)行為的可能性,請(qǐng)執(zhí)行以下操作:
嵌套 intent 的內(nèi)部啟動(dòng):確保這些組件不會(huì)被導(dǎo)出生巡。
嵌套 intent 的跨應(yīng)用啟動(dòng):使用
PendingIntent
代替嵌套 intent耙蔑。如此一來,當(dāng)PendingIntent
從包含它的Intent
中解封時(shí)孤荣,應(yīng)用組件可以使用調(diào)用進(jìn)程的身份啟動(dòng)PendingIntent
甸陌。該配置允許提供程序應(yīng)用向調(diào)用應(yīng)用的任何組件(包括未導(dǎo)出的組件)發(fā)送回調(diào)。
性能
前臺(tái)服務(wù)啟動(dòng)限制
以 Android 12 為目標(biāo)平臺(tái)的應(yīng)用再也無法在后臺(tái)運(yùn)行時(shí)啟動(dòng)前臺(tái)服務(wù)盐股,但一些特殊情況除外钱豁。如果應(yīng)用嘗試在后臺(tái)運(yùn)行時(shí)啟動(dòng)前臺(tái)服務(wù),則會(huì)引發(fā)異常(少數(shù)特殊情況除外)疯汁。當(dāng)您的應(yīng)用在后臺(tái)運(yùn)行時(shí)牲尺,請(qǐng)考慮使用 WorkManager 來計(jì)劃和啟動(dòng)工作。
前臺(tái)服務(wù)的推薦替代方案:WorkManager(值得嘗試)
如果您的應(yīng)用受到此變更的影響幌蚊,建議您轉(zhuǎn)向使用 WorkManager谤碳。Android 12 Beta 版發(fā)布時(shí)凛澎,WorkManager 將成為啟動(dòng)高優(yōu)先級(jí)后臺(tái)任務(wù)的推薦解決方案。
Work Manager 2.7.0-alpha01 支持加急作業(yè)估蹄,后者是 Android 12 中的一種新作業(yè)塑煎。在 Android 11 及更低版本中,此版本的 WorkManager 使用前臺(tái)服務(wù)提供向后兼容性臭蚁。
加急作業(yè)
Android 12 新推出的加急作業(yè)允許應(yīng)用執(zhí)行重要任務(wù)最铁,同時(shí)使系統(tǒng)能夠更好地控制對(duì)資源的訪問權(quán)限。 加急作業(yè)在前臺(tái)服務(wù)和 JobScheduler
作業(yè)之間具有一組特征:
它們不受某些系統(tǒng)電源管理限制(包括省電模式和低電耗模式)的影響垮兑。
只要系統(tǒng)的當(dāng)前工作負(fù)載允許哗蜈,系統(tǒng)就會(huì)立即運(yùn)行這些作業(yè)聚至。
加急作業(yè)可能會(huì)延遲
系統(tǒng)會(huì)嘗試在調(diào)用指定的加急作業(yè)后典蝌,盡快執(zhí)行該作業(yè)固额。但與其他類型的作業(yè)一樣,如果正在運(yùn)行的作業(yè)過多或系統(tǒng)資源不足私爷,系統(tǒng)可能會(huì)延遲啟動(dòng)新的加急作業(yè)雾棺。
具體而言,當(dāng)至少發(fā)生以下任一情況時(shí)衬浑,系統(tǒng)就會(huì)推遲執(zhí)行加急作業(yè):
系統(tǒng)負(fù)載過高捌浩。
已超出加急作業(yè)配額限制。加急作業(yè)使用基于應(yīng)用待機(jī)存儲(chǔ)分區(qū)的配額系統(tǒng)工秩,并限制滾動(dòng)時(shí)間窗口中的最大執(zhí)行時(shí)間尸饺。用于加急作業(yè)的配額比用于其他類型的后臺(tái)作業(yè)的配額限制更大。
允許從后臺(tái)啟動(dòng)前臺(tái)服務(wù)的情況
在以下情況下助币,即使您的應(yīng)用在后臺(tái)運(yùn)行浪听,也可以啟動(dòng)前臺(tái)服務(wù):
您的應(yīng)用從某種用戶可見的狀態(tài),例如某種 activity眉菱,過渡至其他狀態(tài)迹栓。
您的應(yīng)用使用 Firebase Cloud Messaging 接收一條高優(yōu)先級(jí)消息。
用戶對(duì)與應(yīng)用相關(guān)的界面元素執(zhí)行操作倍谜。例如迈螟,他們可能與氣泡、通知尔崔、微件或 activity 互動(dòng)。
您的應(yīng)用收到與地理圍欄或運(yùn)動(dòng)狀態(tài)識(shí)別相關(guān)的事件褥民。
設(shè)備重新啟動(dòng)并在廣播接收器中接收了
ACTION_BOOT_COMPLETED
intent 操作之后季春。應(yīng)用包含特定系統(tǒng)角色或權(quán)限,例如設(shè)備所有者和配置文件所有者消返。
您的應(yīng)用使用 Companion Device Manager载弄。
您的應(yīng)用已請(qǐng)求
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
權(quán)限耘拇,并將用戶導(dǎo)向至用戶已在其中停用該應(yīng)用的電池優(yōu)化功能的設(shè)置頁面。
如需將用戶引導(dǎo)至系統(tǒng)設(shè)置中的電池優(yōu)化頁面宇攻,請(qǐng)調(diào)用包含 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
intent 操作的 intent惫叛。
- 應(yīng)用滿足限制從后臺(tái)啟動(dòng) activity 的例外情況中所述的任何條件,但應(yīng)用在現(xiàn)有任務(wù)的返回堆棧中具有 activity 的情況除外逞刷。
無法通過服務(wù)或廣播接收器創(chuàng)建通知 trampoline
當(dāng)用戶與通知互動(dòng)時(shí)嘉涌,某些應(yīng)用會(huì)啟動(dòng)應(yīng)用組件來響應(yīng)通知點(diǎn)按操作,此應(yīng)用組件最終會(huì)啟動(dòng)用戶最終看到并與之互動(dòng)的 activity夸浅。此應(yīng)用組件被稱為通知 trampoline仑最。
為了改進(jìn)應(yīng)用性能和用戶體驗(yàn),以 Android 12 為目標(biāo)平臺(tái)的應(yīng)用無法從用作通知 trampoline 的服務(wù)或廣播接收器中啟動(dòng) activity帆喇。換言之警医,當(dāng)用戶點(diǎn)按通知或通知中的操作按鈕時(shí),您的應(yīng)用無法在服務(wù)或廣播接收器內(nèi)調(diào)用 startActivity()
预皇。
當(dāng)您的應(yīng)用嘗試從充當(dāng)通知 trampoline 的服務(wù)或廣播接收器啟動(dòng) activity 時(shí)婉刀,系統(tǒng)會(huì)阻止啟動(dòng)該 activity 啟動(dòng)
如果您的應(yīng)用從充當(dāng)通知 trampoline 的服務(wù)或廣播接收器啟動(dòng) activity路星,請(qǐng)完成以下遷移步驟:
- 創(chuàng)建與一個(gè)下列 activity 關(guān)聯(lián)的
PendingIntent
對(duì)象:
用戶點(diǎn)按通知后會(huì)看到的 activity(首選)。
Trampoline activity 或用于啟動(dòng)用戶在點(diǎn)按通知后可以看到的 activity 的 activity呈昔。
- 在構(gòu)建通知的過程中友绝,請(qǐng)使用您在上一步中創(chuàng)建的
PendingIntent
對(duì)象。
限制非 SDK 接口(強(qiáng)相關(guān))
Android 12 包含更新后的受限制非 SDK 接口列表(基于與 Android 開發(fā)者之間的協(xié)作以及最新的內(nèi)部測(cè)試)迁客。在限制使用非 SDK 接口之前郭宝,我們會(huì)盡可能確保有可用的公開替代方案。
如果您的應(yīng)用并非以 Android 12 為目標(biāo)平臺(tái)掷漱,其中一些變更可能不會(huì)立即對(duì)您產(chǎn)生影響粘室。然而,雖然您目前仍可以使用一些非 SDK 接口(具體取決于應(yīng)用的目標(biāo) API 級(jí)別)卜范,但只要您使用任何非 SDK 方法或字段衔统,終歸存在導(dǎo)致應(yīng)用出問題的顯著風(fēng)險(xiǎn)。
如果您不確定自己的應(yīng)用是否使用了非 SDK 接口,則可以測(cè)試您的應(yīng)用來進(jìn)行確認(rèn)锦爵。如果您的應(yīng)用依賴于非 SDK 接口舱殿,您應(yīng)該開始計(jì)劃遷移到 SDK 替代方案。然而险掀,我們知道某些應(yīng)用具有使用非 SDK 接口的有效用例沪袭。如果您無法為應(yīng)用中的某項(xiàng)功能找到使用非 SDK 接口的替代方案,應(yīng)請(qǐng)求新的公共 API樟氢。
如需詳細(xì)了解此 Android 版本中的變更冈绊,請(qǐng)參閱 Android 12 中有關(guān)限制非 SDK 接口的更新。如需全面了解有關(guān)非 SDK 接口的詳細(xì)信息嗡害,請(qǐng)參閱對(duì)非 SDK 接口的限制焚碌。
自定義通知變更(弱相關(guān))
Android 12 改變了完全自定義通知的外觀。 以前霸妹,自定義通知能夠使用整個(gè)通知區(qū)域并提供自己的布局和樣式十电。由此產(chǎn)生的反模式可能會(huì)令用戶困惑鹃骂,或在不同設(shè)備上引發(fā)布局兼容性問題。
對(duì)于以 Android 12 為目標(biāo)平臺(tái)的應(yīng)用寝殴,包含自定義內(nèi)容視圖的通知將不再使用完整通知區(qū)域;相反抵蚊,系統(tǒng)會(huì)應(yīng)用標(biāo)準(zhǔn)模板贞绳。此模板可確保自定義通知在所有狀態(tài)下都與其他通知相同,例如拒秘,在收起狀態(tài)下的通知圖標(biāo)和展開功能,以及在展開狀態(tài)下的通知圖標(biāo)羹应、應(yīng)用名稱和收起功能园匹。此行為與 Notification.DecoratedCustomViewStyle
的行為幾乎完全相同。
通過這種方式供汛,Android 12 通過為用戶提供可看到且熟悉的通知展開功能,使所有通知保持外觀一致且易于瀏覽宿稀。
下圖顯示了標(biāo)準(zhǔn)模板中的自定義通知:
Android 12 中的變更會(huì)影響某些定義 Notification.Style
的自定義子類的應(yīng)用,或使用 Notification.Builder
的方法 setCustomContentView(RemoteViews)
奉狈、setCustomBigContentView(RemoteViews)
和 setCustomHeadsUpContentView(RemoteViews)
的應(yīng)用。
- 請(qǐng)注意自定義視圖規(guī)格蟀拷。一般來說问芬,提供給自定義通知的高度比之前小强戴。在收起狀態(tài)下骑歹,自定義內(nèi)容的最大高度已從 106dp 減少到 48dp。此外最域,水平空間也減小了镀脂。
- 為了確保“浮動(dòng)通知”狀態(tài)看起來符合您的預(yù)期虑省,請(qǐng)勿忘記將通知渠道的重要性提升至“高”(在屏幕中彈出)熟丸。
連接性
以 Android 12 及更高版本為目標(biāo)平臺(tái)的設(shè)備在具有硬件支持的設(shè)備上運(yùn)行時(shí),在與對(duì)等設(shè)備建立連接時(shí)纱兑,使用點(diǎn)對(duì)點(diǎn)連接不會(huì)斷開與現(xiàn)有 Wi-Fi 的連接。如需檢查是否支持此功能铐炫,請(qǐng)使用 WifiManager.isMultiStaConcurrencySupported()
。
補(bǔ)充:
華為鴻蒙初接觸:
官方地址:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/start-overview-0000000000029602
鴻蒙系統(tǒng)已經(jīng)適配了市面上主流游戲和應(yīng)用鳖悠,并且沒有提供任何關(guān)于Android應(yīng)用在鴻蒙系統(tǒng)上的適配方案。
鴻蒙系統(tǒng)采用IDE開發(fā)工具DevEco-Studio,基于IntelliJ IDEA鼠哥,所以整體開發(fā)和Android十分相似,包括目錄結(jié)構(gòu)
缺點(diǎn):
鴻蒙應(yīng)用僅能運(yùn)行在搭載鴻蒙系統(tǒng)的設(shè)備,而今數(shù)量很少
需要注冊(cè)華為開發(fā)者嚷兔,需提供身份證、銀行卡等壶运,門檻較高
IDE小問題較多
常用的遷移文件夾在2.0beta版本會(huì)有問題
目前previewer預(yù)覽不支持隨寫隨見,也沒有支持拖拽控件布局功能
優(yōu)點(diǎn):
鴻蒙應(yīng)用可以支持手機(jī)棵癣、平板、電視河劝、穿戴設(shè)備、汽車等二庵,一次開發(fā)催享,多點(diǎn)展示
支持Java、Js等多語言攀涵,Java提供UI元素更豐富,開發(fā)更靈活怒详,Js提供輕量化缎岗,開發(fā)更簡(jiǎn)便
對(duì)Android開發(fā)者而言茅郎,學(xué)習(xí)成本較低,不僅是在IDE的操作習(xí)慣,且整體的Framwork和Android很相似奔害,如AbilityPackage對(duì)應(yīng)Application,Ability對(duì)應(yīng)Activity揭厚,AbilitySlice對(duì)應(yīng)Fragment筛圆,UI也是基于xml或者代碼Api實(shí)現(xiàn)