Android 12開發(fā)者預(yù)覽及適配方案

計(jì)劃概覽

image.png

Android 12 中提供的功能

image.png

官方地址: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-beta1Appcompat 1.3.0-beta-01 中獲得)床绪,我們建議您在實(shí)現(xiàn)此功能時(shí)使用該 API。

image.png

統(tǒng)一 API 會(huì)通過創(chuàng)建一個(gè)要實(shí)現(xiàn)的單一 API 來整合這些不同的代碼路徑其弊,這樣您就可以專注于應(yīng)用特定的邏輯会涎,而讓平臺(tái)處理其余的工作:

image.png
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 可提供新功能:

棄用

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_TOUCHBEHAVIOR_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 的情況除外。
  • 請(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ù)的 foregroundServiceTypeconnectedDevice泉懦、mediaPlayback稿黍、mediaProjectionphoneCall疹瘦。

  • 該服務(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ì)顯示疊加層壮池。

  • 可信窗口

    。包括但不限于以下窗口:

  • 輸入法 (IME) 窗口

  • Google 助理窗口

注意:類型為 TYPE_APPLICATION_OVERLAY 的窗口不受信任杀怠。

  • 不可見窗口椰憋。窗口的根視圖是 GONEINVISIBLE

  • 全透明窗口赔退。窗口的 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)用運(yùn)行的是插樁測(cè)試纺蛆。

  • 您的應(yīng)用以 Android 11 或更低版本為目標(biāo)平臺(tái)吐葵,并在抽屜式通知欄頂部顯示一個(gè)窗口。

注意:如果您的應(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 行為:

此方法允許您在任何運(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=LaxSameSite=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_MUTABLEPendingIntent.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_TASKFLAG_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ī)行為季率。

  1. 您的應(yīng)用從已傳遞的 intent 的 extra 中解封嵌套 intent。
  2. 您的應(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惫叛。

無法通過服務(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)完成以下遷移步驟:

  1. 創(chuàng)建與一個(gè)下列 activity 關(guān)聯(lián)的 PendingIntent 對(duì)象:
  • 用戶點(diǎn)按通知后會(huì)看到的 activity(首選)。

  • Trampoline activity 或用于啟動(dòng)用戶在點(diǎn)按通知后可以看到的 activity 的 activity呈昔。

  1. 構(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)模板中的自定義通知:

image.png
image.png
image.png

Android 12 中的變更會(huì)影響某些定義 Notification.Style 的自定義子類的應(yīng)用,或使用 Notification.Builder 的方法 setCustomContentView(RemoteViews)奉狈、setCustomBigContentView(RemoteViews)setCustomHeadsUpContentView(RemoteViews) 的應(yīng)用。

  1. 請(qǐng)注意自定義視圖規(guī)格蟀拷。一般來說问芬,提供給自定義通知的高度比之前小强戴。在收起狀態(tài)下骑歹,自定義內(nèi)容的最大高度已從 106dp 減少到 48dp。此外最域,水平空間也減小了镀脂。
  2. 為了確保“浮動(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)

image.png

缺點(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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市椿浓,隨后出現(xiàn)的幾起案子太援,更是在濱河造成了極大的恐慌,老刑警劉巖扳碍,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件提岔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡左腔,警方通過查閱死者的電腦和手機(jī)麸祷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門磕瓷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事琳彩±徒希” “怎么了抖仅?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)集灌。 經(jīng)常有香客問我驯鳖,道長(zhǎng)泽腮,這世上最難降的妖魔是什么续崖? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上贴汪,老公的妹妹穿的比我還像新娘。我一直安慰自己坑傅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪托修。 梳的紋絲不亂的頭發(fā)上洋幻,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天森书,我揣著相機(jī)與錄音,去河邊找鬼。 笑死凛膏,一個(gè)胖子當(dāng)著我的面吹牛杨名,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猖毫,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼台谍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了吁断?” 一聲冷哼從身側(cè)響起趁蕊,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仔役,沒想到半個(gè)月后掷伙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡又兵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年任柜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寒波。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乘盼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俄烁,到底是詐尸還是另有隱情绸栅,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布页屠,位于F島的核電站粹胯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辰企。R本人自食惡果不足惜风纠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牢贸。 院中可真熱鬧竹观,春花似錦、人聲如沸潜索。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竹习。三九已至誊抛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間整陌,已是汗流浹背拗窃。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工瞎领, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人随夸。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓九默,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逃魄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荤西,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容