總算開始了Android 11的適配作業(yè)。記載一下,供需求的人參看蝶棋。
1. 預(yù)備工作
老規(guī)矩,首要將咱們項(xiàng)目中的 targetSdkVersion
改為 30忽妒⊥嫒梗或許運(yùn)用兼容性調(diào)試東西,后邊我會提到段直。
2. 存儲機(jī)制更新
Scoped Storage(分區(qū)存儲)
詳細(xì)適配辦法和上一年的Android 10 適配攻略中的沒有太大差異吃溅。
不過需求留神的是,運(yùn)用targetSdkVersion >= 30
鸯檬,強(qiáng)制實(shí)施分區(qū)存儲機(jī)制决侈。之前在AndroidManifest.xml
中增加 android:requestLegacyExternalStorage="true"
的適配辦法已不起效果。
還有一個改變:Android 11 容許運(yùn)用除 MediaStore
API 之外的 API 經(jīng)過文件途徑直接拜訪同享存儲空間中的媒體文件喧务。其間包括:
-
File
API赖歌。 - 原生庫枉圃,例如
fopen()
。
假定你之前沒有適配Android 10庐冯,這一點(diǎn)對你來說是個好音訊孽亲。Android 10在AndroidManifest.xml
中增加 android:requestLegacyExternalStorage="true"
來適配,Android 11上直接運(yùn)用File
API拜訪媒體文件展父。不得不說墨林,等等黨的成功?
不過犯祠,運(yùn)用原始文件途徑直接拜訪同享存儲空間中的媒體文件會重定向到 MediaStore
API旭等,這次重定向會構(gòu)成功用影響(隨機(jī)讀寫慢一倍左右)。而且直接運(yùn)用原始文件途徑衡载,并不會比運(yùn)用 MediaStore
API 有更多優(yōu)勢搔耕,因而官方強(qiáng)烈主張直接運(yùn)用 MediaStore
API。
MANAGE_EXTERNAL_STORAGE
當(dāng)然還有一種簡略粗暴的適配辦法痰娱,獲取外部存儲辦理權(quán)限弃榨。假定你的運(yùn)用是手機(jī)管家、文件辦理器這類需求拜訪大量文件的app梨睁,能夠央求MANAGE_EXTERNAL_STORAGE
權(quán)限鲸睛,將用戶引導(dǎo)至體系設(shè)置頁面翻開。代碼如下:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
public static void checkStorageManagerPermission(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
!Environment.isExternalStorageManager()) {
Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
需求留神的是即便你有了MANAGE_EXTERNAL_STORAGE
權(quán)限坡贺,也無法拜訪Android/data/
目錄下的文件官辈。
關(guān)于MANAGE_EXTERNAL_STORAGE
權(quán)限,國內(nèi)運(yùn)用應(yīng)該沒有什么影響遍坟∪冢可是在Google Play上需求說明為什么已有的SAF
或MediaStore
不滿足你的運(yùn)用需求,審核經(jīng)過才容許上架運(yùn)用愿伴。所以一般狀況下肺魁,我個人不推薦你為了適配簡略,直接央求運(yùn)用MANAGE_EXTERNAL_STORAGE
權(quán)限隔节。
其他細(xì)節(jié)改動見文檔:Android 11 中的存儲機(jī)制更新鹅经。
相關(guān)api改動及運(yùn)用推薦郭霖大神的這篇:Android 11新特性,Scoped Storage又有了新花樣怎诫。
存儲拜訪結(jié)構(gòu) (SAF)改動
Android 11對SAF增加以下束縛:
- 運(yùn)用
ACTION_OPEN_DOCUMENT_TREE
或ACTION_OPEN_DOCUMENT
瘾晃,無法閱讀到Android/data/
和Android/obb/
目錄及其悉數(shù)子目錄。 - 運(yùn)用
ACTION_OPEN_DOCUMENT_TREE
無法授權(quán)拜訪存儲根目錄刽虹、Download文件夾酗捌。
REQUEST_INSTALL_PACKAGES
在8.0的適配中呢诬,咱們設(shè)備apk包之前需求央求“設(shè)備不知道來歷運(yùn)用”的權(quán)限涌哲。一般來說初次是跳轉(zhuǎn)到授權(quán)頁面讓用戶手動翻開胖缤,然后回來app進(jìn)行設(shè)備。
在Android 11中當(dāng)用戶打開“設(shè)備不知道來歷運(yùn)用”的權(quán)限阀圾,app就會被殺死哪廓。該行為與強(qiáng)制分區(qū)存儲有關(guān),由于持有 REQUEST_INSTALL_PACKAGES
權(quán)限的運(yùn)用能夠拜訪其他運(yùn)用的Android/obb
目錄初烘。
好在用戶公布權(quán)限之后涡真,盡管app會被殺死,可是設(shè)備頁面仍然會彈出肾筐。
現(xiàn)在關(guān)于這一改動我沒有發(fā)現(xiàn)能夠適配處理的辦法哆料,詳細(xì)介紹見:Android 11特性調(diào)整:設(shè)備外部來歷運(yùn)用需求重啟APP
3.權(quán)限改變
單次權(quán)限授權(quán)
從 Android 11 開始,每當(dāng)運(yùn)用央求與方位信息吗铐、麥克風(fēng)或攝像頭相關(guān)的權(quán)限時东亦,面向用戶的權(quán)限對話框會包括僅限這一次選項(xiàng)。假定用戶在對話框中挑選此選項(xiàng)唬渗,體系會向運(yùn)用公布暫時的單次授權(quán)典阵。
單次權(quán)限授權(quán)的運(yùn)用能夠在一段時間內(nèi)拜訪相關(guān)數(shù)據(jù),詳細(xì)時間取決于運(yùn)用的行為和用戶的操作:
- 當(dāng)運(yùn)用的 Activity 可見時镊逝,運(yùn)用能夠拜訪相關(guān)數(shù)據(jù)壮啊。
- 假定用戶將運(yùn)用轉(zhuǎn)為后臺作業(yè),運(yùn)用能夠在短時間內(nèi)繼續(xù)拜訪相關(guān)數(shù)據(jù)撑蒜。
- 假定您在 Activity 可見時主張了一項(xiàng)前臺服務(wù)歹啼,而且用戶隨后將您的運(yùn)用轉(zhuǎn)到后臺,那么您的運(yùn)用能夠繼續(xù)拜訪相關(guān)數(shù)據(jù)座菠,直到該前臺服務(wù)中止染突。
- 假定用戶撤消單次授權(quán)(例如在體系設(shè)置中撤消),不管您是否主張了前臺服務(wù)辈灼,運(yùn)用都無法拜訪相關(guān)數(shù)據(jù)份企。與任何權(quán)限相同,假定用戶撤消了運(yùn)用的單次授權(quán)巡莹,運(yùn)用進(jìn)程就會中止司志。
當(dāng)用戶下次翻開運(yùn)用而且運(yùn)用中的某項(xiàng)功用央求拜訪方位信息、麥克風(fēng)或攝像頭時降宅,體系會再次提示用戶公布權(quán)限骂远。
假定你之前就是運(yùn)用權(quán)限時才央求相關(guān)權(quán)限,那么這一改動關(guān)于你的運(yùn)用沒有影響腰根。
央求方位權(quán)限
這部分在Android 10的適配有過調(diào)整激才,其時規(guī)則如下:
央求
ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
權(quán)限標(biāo)明在前臺時具有拜訪設(shè)備方位信息的權(quán)限。在央求彈框中,挑選“一向容許”標(biāo)明前后臺都能夠獲取方位信息瘸恼,挑選“僅在運(yùn)用運(yùn)用進(jìn)程中容許”只標(biāo)明具有前臺的權(quán)限劣挫。
在Android 11中,央求彈框中取消了“一向容許”這一選項(xiàng)东帅。也就是說默許不會公布你后臺拜訪設(shè)備方位信息的權(quán)限压固。假定檢驗(yàn)央求ACCESS_BACKGROUND_LOCATION
權(quán)限的一同央求任何其他權(quán)限,體系會拋出失常,不會向運(yùn)用公布其間的任一權(quán)限。
官方給出的適配主張及原因如下:
主張運(yùn)用對方位權(quán)限實(shí)施遞加央求聂薪,先央求前臺方位信息拜訪權(quán)限冰沙,再央求后臺方位信息拜訪權(quán)限。實(shí)施遞加央求能夠?yàn)橛脩艄┙o更大的控制權(quán)和透明度,由于他們能夠更好地了解運(yùn)用中的哪些功用需求后臺方位信息拜訪權(quán)限。
總結(jié)一下得出兩點(diǎn):
- 先央求前臺方位信息拜訪權(quán)限,再央求后臺方位信息拜訪權(quán)限矿咕。
- 單獨(dú)央求后臺方位信息拜訪權(quán)限,不要與其他權(quán)限一同央求狼钮。
這兒還需求留神不同方針途徑運(yùn)用在Android 11上的表現(xiàn):
- Android 10 為方針途徑的運(yùn)用
容許一同拜訪前后臺的方位信息權(quán)限碳柱,但相同不會有“一向容許”這一選項(xiàng)。
- 沒有前后臺的方位信息權(quán)限時:
- 有前臺的方位信息權(quán)限時:
- Android 11 為方針途徑的運(yùn)用
- 沒有前后臺的方位信息權(quán)限時熬芜,只能先央求前臺的方位信息權(quán)限:
- 有前臺的方位信息權(quán)限莲镣,央求后臺的方位信息時體系會跳轉(zhuǎn)到下面的設(shè)置頁面。
挑選“一向容許”標(biāo)明具有前后臺方位信息拜訪權(quán)限涎拉,假定用戶回絕兩次運(yùn)用定位拜訪央求(直接回來等)瑞侮,后邊央求相同權(quán)限都會被直接提示央求失利。(這兒就需求咱們給用戶以引導(dǎo)了)
這兒解釋一下“回絕兩次”鼓拧,這是Android 11 上增加的權(quán)限對話框的可見性
半火,從前咱們點(diǎn)擊了“不再問詢”標(biāo)明回絕授權(quán)。現(xiàn)在還包括相似上面這種轉(zhuǎn)到體系設(shè)置季俩,然后點(diǎn)回來按鈕钮糖,也算是回絕授權(quán)。當(dāng)然酌住,用戶按回來按鈕封閉權(quán)限對話框店归,此操作不算。
總結(jié)一下酪我,與Android 10的差異就是將后臺權(quán)限的央求分離了出來消痛,增加了用戶“回絕”的條件,避免了運(yùn)用重復(fù)央求用戶已回絕的權(quán)限都哭。
軟件包可見性
軟件包可見性是Android 11上提高體系隱私安全性的一個新特性秩伞。它的效果是束縛app隨意獲取其他app的信息和設(shè)備狀況逞带。避免病毒軟件、間諜軟件利用纱新,引發(fā)網(wǎng)絡(luò)垂釣展氓、用戶設(shè)備信息走漏等安全事情。
獲取主動可見運(yùn)用的列表怒炸,能夠?qū)嵤┲噶?code>adb shell dumpsys package queries带饱,找到 forceQueryable
部分毡代。下面是在vivo iqoo手機(jī)的實(shí)施效果阅羹。
Queries:
system apps queryable: false
forceQueryable:
[com.android.BBKCrontab,com.vivo.fingerprint,com.vivo.epm,com.vivo.abe,com.vivo.fingerprintengineer,com.vivo.contentcatcher,com.vivo.floatingball,com.vivo.agent,com.vivo.nightpearl,android,com.wapi.wapicertmanage,com.vivo.vms,co
m.android.providers.settings,com.vivo.upslide,com.vivo.assistant,com.vivo.vivokaraoke,com.vivo.fingerprintui,com.android.wallpaperbackup,com.bbk.facewake,com.vivo.faceunlock,com.vivo.doubleinstance,com.vivo.audiofx,com.iqoo.powersav
ing,com.bbk.SuperPowerSave,com.vivo.vibrator4d,com.vivo.smartunlock,com.vivo.globalanimation,com.vivo.appfilter,com.vivo.voicewakeup,com.vivo.minscreen,com.android.bbklog,com.mobile.cos.iroaming,com.vivo.networkstate,com.vivo.daemon
Service,com.vivo.smartshot,com.vivo.vtouch,com.android.networkstack.tethering.inprocess,com.android.localtransport,com.vivo.pem,com.vivo.wifiengineermode,com.android.server.telecom,com.vivo.gamecube,com.vivo.aiengine,com.vivo.multin
lp,com.vivo.smartmultiwindow,com.vivo.permissionmanager,com.qti.diagservices,com.vivo.bsptest,com.qti.snapdragon.qdcm_ff,com.vivo.dr,com.vivo.sps,com.android.dynsystem,com.vivo.setupwizard,com.vivo.gamewatch,com.android.keychain,com
.vivo.faceui,com.android.networkstack.inprocess,com.android.location.fused,com.android.inputdevices,com.android.settings,com.iqoo.engineermode,com.vivo.fuelsummary]
[com.qualcomm.uimremoteserver,com.vivo.devicereg,com.qti.qualcomm.deviceinfo,com.volte.config,com.android.mms.service,com.android.ons,com.qualcomm.qcrilmsgtunnel,com.vivo.sim.contacts,com.qualcomm.qti.uimGbaApp,com.qualcomm.qti.
modemtestmode,com.android.stk,com.android.vendors.bridge.softsim,com.qualcomm.uimremoteclient,com.qti.qualcomm.datastatusnotification,com.qualcomm.qti.uim,com.android.phone,com.qualcomm.qti.dynamicddsservice,com.qualcomm.qti.telepho
nyservice,com.android.cellbroadcastservice,com.android.providers.telephony,com.qti.dpmserviceapp,com.android.incallui]
[com.android.vivo.tws.vivotws,com.android.bluetooth]
com.android.nfc
com.android.se
com.android.networkstack.permissionconfig
com.android.shell
com.android.providers.media.module
com.android.wifi.resources.overlay.common
com.android.theme.icon_pack.filled.themepicker
com.android.theme.icon_pack.circular.themepicker
com.android.server.telecom.overlay.common
......
能夠看到都是體系運(yùn)用包名,所以咱們的三方運(yùn)用默許是不行見的教寂。此項(xiàng)改動影響比較多的是共享支付一類需求與其他運(yùn)用交互的功用捏鱼。下面舉一個簡略的比如:
private static boolean hasActivity(Context context, Intent intent) {
PackageManager packageManager = context.getPackageManager();
return packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
}
public void test() {
Intent intent = new Intent();
intent.setClassName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");
Log.d("hasActivity:", hasActivity(this, intent) + "");
}
hasActivity
辦法中經(jīng)過queryIntentActivities
來判別此頁面是否存在±腋可是在targetSdkVersion >= 30
中导梆,這些三方默許都是不行見的。所以都會回來false迂烁。相似辦法getInstalledPackages
看尼、getPackageInfo
也遭到相應(yīng)的束縛。
解決辦法很簡略盟步,在AndroidManifest.xml
中增加queries
元素藏斩,里面增加需求可見的運(yùn)用包名。
<manifest package="com.example.app">
<queries>
<package android:name="com.tencent.mm" /> <- 指定微信包名
</queries>
...
</manifest>
我在適配中用到的還有下面的包名却盘,咱們能夠按需增加:
<queries>
<!-- 微博 -->
<package android:name="com.sina.weibo" />
<!-- QQ -->
<package android:name="com.tencent.mobileqq" />
<!-- 支付寶 -->
<package android:name="com.eg.android.AlipayGphone" />
<!-- AlipayHK -->
<package android:name="hk.alipay.wallet" />
</queries>
除了直接增加包名的辦法外狰域,咱們能夠按intent和provider來增加:
<manifest package="com.example.app">
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
<provider android:authorities="com.example.settings.files" />
</queries>
...
</manifest>
詳細(xì)的規(guī)則拜見:辦理軟件包可見性
當(dāng)然,還有一種簡略粗暴的辦法黄橘,能夠直接央求權(quán)限QUERY_ALL_PACKAGES
兆览。假定你的運(yùn)用需求上架Google Play
,那么或許要留神相關(guān)方針塞关。為了尊重用戶隱私抬探,主張?jiān)蹅兊倪\(yùn)用按正常作業(yè)所需的最小軟件包可見性來適配。
有一點(diǎn)需求說明一下帆赢,咱們?nèi)粘_\(yùn)用的startActivity
辦法不受體系軟件包可見性行為的影響驶睦,即便hasActivity
為false,相同能夠跳轉(zhuǎn)匿醒。假定咱們在做跳轉(zhuǎn)前场航,進(jìn)行相似hasActivity
的判別,那么會受影響廉羔。
最終需求留神的是溉痢,運(yùn)用queries
元素需求Android Gradle
插件版別是 4.1及以上僻造,由于舊版其他插件并不兼容此元素,出現(xiàn)合并 manifest
的過錯孩饼。
前臺服務(wù)類型
Android 10中髓削,在前臺服務(wù)拜訪方位信息,需求在對應(yīng)的service
中增加 location
服務(wù)類型镀娶。
相同的立膛,Android 11中,在前臺服務(wù)拜訪攝像頭或麥克風(fēng)梯码,需求在對應(yīng)的service
中增加camera
或microphone
服務(wù)類型宝泵。
<manifest>
...
<service
android:name="MyService"
android:foregroundServiceType="microphone|camera" />
</manifest>
這一束縛的改動,使得程序無法在后臺主張服務(wù)拜訪攝像頭和麥克風(fēng)轩娶。如需運(yùn)用儿奶,只能是前臺翻開前臺服務(wù)。除非有如下狀況:
- 服務(wù)由體系組件主張鳄抒。
- 服務(wù)是經(jīng)過運(yùn)用小部件主張闯捎。
- 服務(wù)是經(jīng)過與告知交互主張的。
- 服務(wù)是
PendingIntent
主張的许溅,它是從另一個可見的運(yùn)用程序發(fā)送過來的瓤鼻。 - 服務(wù)由一個運(yùn)用程序主張,該運(yùn)用是一個DPC贤重,且在設(shè)備悉數(shù)者形式下作業(yè)茬祷。
- 服務(wù)由一個供給
VoiceInteractionService
的運(yùn)用主張。 - 服務(wù)由一個具有
START_ACTIVITIES_FROM_BACKGROUND
權(quán)限的運(yùn)用主張游桩。
權(quán)限主動重置
假定運(yùn)用以 Android 11 或更高版別為方針途徑而且數(shù)月未運(yùn)用牲迫,體系會經(jīng)過主動重置用戶已公布運(yùn)用的作業(yè)時活絡(luò)權(quán)限來保護(hù)用戶數(shù)據(jù)。如下圖所示:
留神上圖中有一個主張主動重置的開關(guān)借卧。假定咱們的運(yùn)用有特別需求盹憎,能夠引導(dǎo)用戶封閉它。示例代碼如下:
public void checkAutoRevokePermission(Context context) {
// 判別是否翻開
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
!context.getPackageManager().isAutoRevokeWhitelisted()) {
// 跳轉(zhuǎn)設(shè)置頁
Intent intent = new Intent(Intent.ACTION_AUTO_REVOKE_PERMISSIONS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
context.startActivity(intent);
}
}
SYSTEM_ALERT_WINDOW權(quán)限
這部分我在適配中沒有用到铐刘,直接照搬文檔:
在 Android 11 中陪每,體系會依據(jù)央求主意向某些類型的運(yùn)用公布 SYSTEM_ALERT_WINDOW
權(quán)限:
體系會主意向具有
ROLE_CALL_SCREENING
且央求SYSTEM_ALERT_WINDOW
的悉數(shù)運(yùn)用公布該權(quán)限。假定運(yùn)用失掉ROLE_CALL_SCREENING
镰吵,就會失掉該權(quán)限檩禾。體系會主意向經(jīng)過
MediaProjection
截取屏幕且央求SYSTEM_ALERT_WINDOW
的悉數(shù)運(yùn)用公布該權(quán)限,除非用戶已清楚回絕向運(yùn)用公布該權(quán)限疤祭。當(dāng)運(yùn)用中止截取屏幕時盼产,就會失掉該權(quán)限。此用例首要用于游戲直播運(yùn)用勺馆。
這些運(yùn)用無需發(fā)送 ACTION_MANAGE_OVERLAY_PERMISSION
以獲取 SYSTEM_ALERT_WINDOW
權(quán)限戏售,它們只需直接央求 SYSTEM_ALERT_WINDOW
即可侨核。
MANAGE_OVERLAY_PERMISSION
intent 一向會將用戶轉(zhuǎn)至體系權(quán)限屏幕
從 Android 11 開始,ACTION_MANAGE_OVERLAY_PERMISSION
intent 一向會將用戶轉(zhuǎn)至頂級設(shè)置屏幕灌灾,用戶可在其間公布或撤消運(yùn)用的 SYSTEM_ALERT_WINDOW
權(quán)限搓译。intent 中的任何 package:
數(shù)據(jù)都會被疏忽。
在更低版其他 Android 中锋喜,ACTION_MANAGE_OVERLAY_PERMISSION
intent 能夠指定一個軟件包些己,它會將用戶轉(zhuǎn)至運(yùn)用專用屏幕以辦理權(quán)限。從 Android 11 開始將不再支撐此功用嘿般,而是有必要由用戶先挑選要公布或撤消哪些運(yùn)用的權(quán)限段标。此改動能夠讓權(quán)限的公布更有目的性,然后達(dá)到保護(hù)用戶的目的博个。
讀取手機(jī)號
假定你是經(jīng)過TelecomManager
的getLine1Number
辦法怀樟,或TelephonyManager
的getMsisdn
方法獲取電話號碼功偿。那么在Android 11中需求增加READ_PHONE_NUMBERS
權(quán)限盆佣。運(yùn)用其他辦法不受限。
<manifest>
<!-- 假定運(yùn)用僅在 Android 10及更低版別中運(yùn)用該權(quán)限械荷,能夠增加 maxSdkVersion="29" -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"
android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
</manifest>
4.其他行為改動
自定義view的Toast
Android 11
為方針途徑的運(yùn)用共耍,從后臺發(fā)送自定義view的Toast音訊體系會進(jìn)行屏蔽。前臺運(yùn)用不受影響吨瞎。Toast
相應(yīng)的setView
和 getView
也現(xiàn)已扔掉不主張運(yùn)用痹兜。
假定要在后臺運(yùn)用,推薦運(yùn)用默許的toast或Snackbar
替代颤诀。
APK簽名
Android 11
為政策途徑的運(yùn)用字旭,僅經(jīng)過v1 簽名的運(yùn)用無法在Android 11
的設(shè)備上設(shè)備或更新。有必要運(yùn)用v2或更高版別進(jìn)行簽名崖叫。
一同Android 11
增加了對 APK 簽名方案 v4 的支撐遗淳。
AsyncTask
AsyncTask
在Android 11現(xiàn)已不主張運(yùn)用,主張遷移至kotlin的協(xié)程心傀。
此外Handler
未指定Looper
的結(jié)構(gòu)辦法也已不主張運(yùn)用屈暗。
主張清楚指定Looper
:
private Handler handler = new Handler(Looper.myLooper());
// 或
private Handler handler = new Handler(Looper.getMainLooper());
5.新增東西
兼容性調(diào)試東西
以往咱們做適配的時分,需求先將咱們項(xiàng)目中的 targetSdkVersion
修改為對應(yīng)版別脂男。這就導(dǎo)致你適配進(jìn)程中有或許遭到其他改動的影響养叛,而這個新增的兼容性調(diào)試東西能夠讓你在不晉級targetSdkVersion
的狀況下,針對每項(xiàng)改動逐一翻開適配宰翅。
運(yùn)用辦法:
- 開發(fā)者選項(xiàng)中找到運(yùn)用兼容性改動選項(xiàng)弃甥。
- 點(diǎn)擊進(jìn)入找到你需求調(diào)試的運(yùn)用
- 在改動列表中,找到想要翻開或封閉的改動汁讼,然后點(diǎn)擊相應(yīng)的開關(guān)淆攻。
上面榜首行
DEFAULT_SCOPED_STORAGE
就是啟用分區(qū)儲存肮之,這些常量詳細(xì)的意義見:Android 11 改動列表。
關(guān)于兼容性調(diào)試東西詳細(xì)的運(yùn)用辦法見:兼容性結(jié)構(gòu)東西卜录,這兒限于篇幅就不打開說了戈擒。
無線調(diào)試
Android 11的開發(fā)者選項(xiàng)中增加了一個無線調(diào)試的功用。相似于聯(lián)接藍(lán)牙耳機(jī)功用艰毒,可以無需USB聯(lián)接線進(jìn)行日常開發(fā)調(diào)試作業(yè)筐高。(差異于從前的Android WIFI ADB,這個是真無線丑瞧,哈哈)
運(yùn)用辦法:
- 開發(fā)者選項(xiàng)中找到無線調(diào)試并翻開柑土。
- 初次配對需點(diǎn)擊“運(yùn)用配對碼配對設(shè)備”
- 作業(yè)
adb pair ipaddr:port
后輸入配對碼進(jìn)行聯(lián)接。
留神事項(xiàng):
- 堅(jiān)持電腦和手機(jī)在一個網(wǎng)絡(luò)绊汹。
- Platform Tools 版別需大于30.0稽屏。可運(yùn)用
adb --version
檢查西乖。
不過我自己領(lǐng)會下來狐榔,感覺聯(lián)接不是很安穩(wěn),不知是AS的問題仍是手機(jī)問題获雕。一同鎖屏后也會斷開聯(lián)接薄腻,領(lǐng)會不是很好。届案。庵楷。等候后續(xù)的優(yōu)化吧。
本篇內(nèi)容有點(diǎn)多楣颠【∨Γ總結(jié)一下,Android 11在權(quán)限上的改動比較多童漩,但假定你一向恪守央求權(quán)限相關(guān)的最佳做法弄贿,那么根本上不需求額定的適配作業(yè)。
最終側(cè)重一下睁冬,關(guān)于單次授權(quán)挎春,權(quán)限對話框的可見性,SYSTEM_ALERT_WINDOW 權(quán)限豆拨,設(shè)備apk這些改動只要在Android 11上就會收效直奋,不管你是否適配Android 11。關(guān)于其他改動和API(相機(jī)施禾、5G脚线、瀑布屏、鍵盤等)弥搞,由于我暫時沒有遇到邮绿,也就沒有列出渠旁,有需求的能夠點(diǎn)擊文末的官方文檔鏈接檢查。
截止發(fā)這篇博客時船逮,我手機(jī)上只發(fā)現(xiàn)嗶哩嗶哩現(xiàn)已適配了Android 11顾腊。大多數(shù)停留在28、29挖胃,更有甚者還在26(Android 8.0 國內(nèi)上架的最低適配標(biāo)準(zhǔn))杂靶。