求教大家
問(wèn)題:
當(dāng)下有沒(méi)有 任何 直接 /間接 的方式, 實(shí)現(xiàn) MIUI 照明彈 類(lèi)似功能.
目的:
識(shí)別流氓, 關(guān)入大牢.
目前主力機(jī) Pixel3 XL , 用 Shelter , 把 非 Play 商店 以及 部分自認(rèn)為流氓 的 app 放到工作空間, 平時(shí)一直關(guān)閉 工作空間 .
最后, 祝大家端午節(jié)快樂(lè)啊
如圖:最上面是我的 app,字體沒(méi)有做任何設(shè)置,都是默認(rèn)。下面兩個(gè)微信的圖是更改 MIUI 的字體粗細(xì)的效果,我的 app 都是一樣的沒(méi)有變化。
手機(jī)已經(jīng) root,進(jìn)入了開(kāi)發(fā)者模式并打開(kāi)了 usb 調(diào)試功能以及允許安裝未知來(lái)源的應(yīng)用。
Android studio 4.0 棄用了 Android device moniter 和 Hierarchy Viewer,改用了 Layout Inspector 。使用 Layout Inspector 時(shí),沒(méi)有 教程 中出現(xiàn)的 choose process 窗口,而是自動(dòng)彈出了自建 project 對(duì)應(yīng) app 的監(jiān)控視圖,手機(jī)也自動(dòng)顯示了自建的軟件。在底部窗口也只有一個(gè)自建 app 的這一個(gè) process 可選。
請(qǐng)問(wèn)如何通過(guò) Android studio 獲取微信控件的 id 呢?(想用 AccessibilityService 實(shí)現(xiàn)一個(gè)微信自動(dòng)回復(fù)機(jī)器人)
以前用訊飛 or 百度輸入法,可以輸入“riqi”,第二個(gè)候選詞就是今天日期
但最近都換成了 Gboard,沒(méi)這功能了,總不能每次輸入,還臨時(shí)切換下輸入法吧?
有什么便捷的輸入今天年月日的方法嗎?(例如 通知欄有個(gè)常駐小插件,點(diǎn)一下就自動(dòng)復(fù)制當(dāng)前日期到剪貼板?)
比如把后蓋下下來(lái)、拆掉幾個(gè)攝像頭、拆掉無(wú)線(xiàn)充電線(xiàn)圈之類(lèi)的,不知道會(huì)不會(huì)有損傷。反正手機(jī)有手機(jī)殼,平常也只需要一個(gè)可以?huà)叽a的攝像頭,要用的時(shí)候再裝回去感覺(jué)似乎降低不了多少重量,里面是有鋼板之類(lèi)的東西嗎? 另外,手機(jī)還在保,所以盡量不要讓售后能看出來(lái),不過(guò)也快要過(guò)保了
應(yīng)用名稱(chēng):Trichrome Library包名:com.google.android.trichromelibrary 測(cè)試設(shè)備的 Android 版本:10 這個(gè)應(yīng)用可以在 APKMirror 上下載,直接點(diǎn)擊 APK 安裝提示安裝成功,卻不能在應(yīng)用列表里面找到此應(yīng)用,使用第三方軟件讀取應(yīng)用列表也不能找到此應(yīng)用,嘗試再次點(diǎn)擊 APK 安裝時(shí)出現(xiàn)的是安裝應(yīng)用而不是更新應(yīng)用,再次嘗試安裝仍然安裝成功,但依然無(wú)法找到此應(yīng)用。在 TWRP 下查看 /data/app 目錄下能找到多個(gè)以 com.google.android.trichromelibrary 開(kāi)頭的文件夾。 為什么會(huì)這樣呢?
之前用 XR,618 買(mǎi)了 oneplus 8pro,感覺(jué)這個(gè)屏幕長(zhǎng)度也太長(zhǎng)了吧,用了好多天了,還沒(méi)習(xí)慣。
話(huà)說(shuō)現(xiàn)在安卓手機(jī)尺寸都很長(zhǎng),這是以后的趨勢(shì)嗎?
我覺(jué)得那些那些優(yōu)化、那些 AI 算法,把照片拍得都失真了,反倒感覺(jué) iPhone 比較自然,如果花大幾千塊錢(qián)買(mǎi)的手機(jī),拍的照片全時(shí)“虛”的,感覺(jué)還不如自然的,應(yīng)該允許這種選擇吧(默認(rèn)不需要優(yōu)化,不需要 AI 調(diào)整)
android 隱式調(diào)用 activity 打開(kāi)音頻文件第一次選擇打開(kāi)方式第二次就默認(rèn)上次打開(kāi)方式了
做了一個(gè)榮耀 30pro 和三星 s20 的對(duì)比評(píng)測(cè)視頻 鏈接https://www.bilibili.com/video/BV1kT4y1777N/ 還請(qǐng)輕點(diǎn)拍
急迫地需要大家的幫助:
我是「冰箱 IceBox 」的獨(dú)立開(kāi)發(fā)者,相信點(diǎn)進(jìn)來(lái)的不少人之前可能都曾聽(tīng)說(shuō)過(guò)或用過(guò)。5 年多來(lái)它在各大市場(chǎng)共有 400 萬(wàn)以上的下載,至今仍有 20 萬(wàn)以上的月活。
最近半個(gè)月,它接連多次被 Google Play 下架。前 3 次的理由是「無(wú)法卸載」。
誠(chéng)然,如果以免 root 模式設(shè)置了冰箱,那么由于 Android 系統(tǒng)限制無(wú)法直接在桌面卸載。
為此冰箱在其設(shè)置內(nèi)明確提供了卸載選項(xiàng),并在 App 說(shuō)明、設(shè)置教程、設(shè)置成功后彈框等至少 3 處向用戶(hù)明確引導(dǎo)展示如何卸載。
5 年來(lái)我也從未聽(tīng)說(shuō)過(guò)任何正版用戶(hù)抱怨無(wú)法卸載。( 2 年前有一個(gè)破解版的搞破解把卸載功能搞掛了)
前幾次,我都通過(guò) Google Play 申訴渠道明確附上各個(gè)頁(yè)面截圖信息并通過(guò)了申訴,重新打包上架。而最近的一次,Google 甚至將狀態(tài)由「暫停」升級(jí)為了「下架」。理由讓我瞠目結(jié)舌: 關(guān)于“促成不誠(chéng)實(shí)行為”政策 我們不允許任何應(yīng)用以任何方式協(xié)助用戶(hù)誤導(dǎo)他人或提供用于實(shí)現(xiàn)欺騙性行為的功能,包括但不限于生成或促使生成身份證、社會(huì)保障號(hào)、護(hù)照、文憑、信用卡和駕照。應(yīng)用必須針對(duì)自身的功能和 /或內(nèi)容提供準(zhǔn)確的聲明、名稱(chēng)、說(shuō)明和相關(guān)圖片 /視頻,并按用戶(hù)合理預(yù)期的方式運(yùn)行。即使應(yīng)用聲稱(chēng)是“惡作劇”或“純屬娛樂(lè)”(或其他類(lèi)似描述),也仍須遵守我們的政策要求。
思來(lái)想去,冰箱 IceBox 作為一款省電 App,完全和所謂「身份證、社會(huì)保障號(hào)、護(hù)照」沒(méi)有任何關(guān)系,也沒(méi)有任何「惡作劇」功能。所有功能都是用戶(hù)手動(dòng)觸發(fā)的。
已經(jīng)再次嘗試提交申訴,但感覺(jué)希望渺茫。一款幾百萬(wàn)用戶(hù)的 App,Google 想下架就下架,一個(gè)理由不通就隨便再找一個(gè),也太不負(fù)責(zé)了吧!
Google Play 在我的用戶(hù)群體中不到 1/10,Play Store 下架雖不會(huì)對(duì)我造成毀滅打擊,但會(huì)大量傷害現(xiàn)有的已從 Google 購(gòu)買(mǎi)的用戶(hù)。
請(qǐng)問(wèn)大家有類(lèi)似的經(jīng)歷嗎,如有的話(huà)如何應(yīng)對(duì)?或者如果你有渠道聯(lián)系 Google 審核團(tuán)隊(duì)也請(qǐng)伸出援手!在此非常感謝大家!
安卓有沒(méi)辦法讓微信攝像頭掃自己手機(jī)屏幕上的二維碼?
微信一些二維碼需要攝像頭掃才行,長(zhǎng)按識(shí)別二維碼和掃一掃導(dǎo)入圖片都被提示必須攝像頭掃。 所以想:有沒(méi)辦法讓攝像頭掃自己屏幕上二維碼?
已經(jīng)想到的辦法: 1 、二維碼圖片傳到第二臺(tái)手機(jī),掃第二臺(tái)手機(jī)的屏幕——>可行,但有沒(méi)辦法不依賴(lài)第二部手機(jī)呢? 2 、是否有虛擬攝像頭應(yīng)用,可以指定圖片作為攝像頭獲取的圖像?——>沒(méi)找到手機(jī)的解決方案,虛擬機(jī)倒好像是有。 3 、把攝像頭設(shè)置成前置攝像頭,手機(jī)開(kāi)分屏模式,一半顯示二維碼一半掃一掃,然后掃鏡子?——>有點(diǎn)奇葩,但好像微信不能開(kāi)前置攝像頭掃一掃?
v 友還有好 ieda 嗎?
當(dāng)一個(gè)掌握一定程度 android 原生開(kāi)發(fā)的人, 希望為自己的 APP 建立一套后端系統(tǒng)的時(shí)候, 從什么入手開(kāi)始學(xué)比較好呢?
比如是否掌握 Tomcat & Java Web 相關(guān)的技術(shù),就可以開(kāi)發(fā)后臺(tái),寫(xiě) api 了呢?
有沒(méi)有好書(shū)推薦?學(xué)這款書(shū):( https://item.jd.com/10066936.html )的方向是否正確?(這書(shū)挺厚,如果選錯(cuò)了時(shí)間成本有點(diǎn)大)
另外,想知道緩存型數(shù)據(jù)庫(kù)( redis 什么的)對(duì)一個(gè)日活 1 千左右的 app 后臺(tái)來(lái)說(shuō)是否必備,只用 mysql 會(huì)不會(huì)是無(wú)稽之談。
https:¥// www.androidpolice.com/2020/06/30/ads-are-taking-over-samsungs-galaxy-smartphones-and-im-fed-up/
發(fā)個(gè)帖嘲諷一下,沒(méi)想到三星也要把自己降低到粗糧的水平...
所以現(xiàn)在能買(mǎi)的 Android 還有啥牌子?排除國(guó)產(chǎn),三星,還有歐洲小廠們,就只剩 Pixel 和 Xperia 了?
想控制 app 的網(wǎng)絡(luò)連接,現(xiàn)在用的是 AFWall+,但是這個(gè)軟件是一刀切行為,上傳下載不能分開(kāi)控制有能分開(kāi)控制的軟件嗎?推薦下。
在嘗試寫(xiě)一個(gè)非常簡(jiǎn)易的 app,里面需要建立一個(gè)嵌入式數(shù)據(jù)庫(kù)然后在 app 里實(shí)現(xiàn)一點(diǎn)簡(jiǎn)易的查詢(xún)排序功能。最初到網(wǎng)上爬到的數(shù)據(jù)建了個(gè) mongoDB 數(shù)據(jù)庫(kù),不知道怎么存在安卓安裝包里直接導(dǎo)入,遂查到可以用 realm 。但是運(yùn)行時(shí)建庫(kù)一直報(bào)錯(cuò): javassist.NotFoundException:io.realm.com_get_quick_medical_helper_MainActivity3$1UserRealmProxyInterface 求大佬解惑,或者有其他解決辦法曲線(xiàn)救國(guó)也可,感激不盡!
https://github.com/xiayitian1003/Quick-Medical-Helper
按照道理下面這個(gè) linearLayout 的 lparams{} 設(shè)置的參數(shù)不應(yīng)該是給 linearLayout,但 as 提示的是上一個(gè)層級(jí)的 relativeLayout,實(shí)際設(shè)置的效果也是給 relativeLayout 。
安卓有接觸到某個(gè) nfc 標(biāo)簽后執(zhí)行任務(wù)的軟件嗎?
類(lèi)似 ios 捷徑那種可以設(shè)定碰到某個(gè) nfc 然后執(zhí)行指定操作?
基于 Paging 做了一版,效果基本能用,但是只依賴(lài)網(wǎng)絡(luò)數(shù)據(jù)沒(méi)有本地庫(kù),做動(dòng)態(tài)刪除就不行了。用傳統(tǒng)的 RecyclerView.OnScrollListener 來(lái)做,底部的上拉刷新沒(méi)問(wèn)題,通過(guò)比較 findLastVisibleItemPosition 和當(dāng)前 list 的大小很容易實(shí)現(xiàn)。但是做下拉刷新是就不太好做了,使用 SwipeRefreshLayout 能實(shí)現(xiàn)功能,但是體驗(yàn)很不好,沒(méi)辦法做到無(wú)感。感覺(jué)在 OnScrollListener onScrolled 里判斷,但是沒(méi)找到合適的判斷條件。大家有什么好方案嗎?
Android 手機(jī)用的郵箱 App,專(zhuān)門(mén)用于收發(fā)國(guó)內(nèi)的郵箱的郵件:網(wǎng)易 163 郵箱、QQ 郵箱、新浪郵箱、搜狐郵箱。原本是想用網(wǎng)易郵箱大師 App,以及 QQ 郵箱 App,但據(jù)說(shuō)操蛋的事情太多,故國(guó)產(chǎn)郵箱 App,準(zhǔn)備放棄。 請(qǐng)不要對(duì)我說(shuō),使用以下郵箱 App:Gmail 、Yahoo 、Outlook 等。 這些 Android 手機(jī)用的郵箱 App,我手機(jī)上已經(jīng)有了。但是,我的那些郵箱,與國(guó)產(chǎn)郵箱,我不想讓它們呆在同一個(gè)房間( App )里,物以類(lèi)聚,人以群分,所以,它們必須分開(kāi),必須在不同的 App 之內(nèi)。 綜上所述,我需要一款類(lèi)似于 Gmail 、Yahoo 、Outlook 等 App 以外的,非國(guó)產(chǎn)的 Android 手機(jī)郵箱 App,需要像 Gmail 、Yahoo 、Outlook 等一樣,好用又安全。 謝謝!
withContext 是指定協(xié)程運(yùn)行的線(xiàn)程,suspend 是掛起,那請(qǐng)求網(wǎng)絡(luò)時(shí)見(jiàn)到這兩種寫(xiě)法,一種用 withContext(Dispatchers.IO )請(qǐng)求,另一種在 viewscope 里調(diào)用 suspend 請(qǐng)求網(wǎng)絡(luò)的方法,這兩種方法有什么區(qū)別?第二種方法里的 suspend 方法還是在主線(xiàn)程里執(zhí)行嗎?
不需要聯(lián)網(wǎng)。
可以播放完一個(gè)列表就停止播放(不知道為什么網(wǎng)易音樂(lè)沒(méi)有這個(gè)功能,只能循環(huán)播放)
我認(rèn)為基于 idea 的 AS 使用起來(lái)很不錯(cuò),特別是當(dāng)我嘗試使用了幾天 VisualStudio 之后。 我想吐槽的是: AS 又雙叒叕 更新了,gradle 又更新了,新版本的 AS 要求 gradle 最低版本一直飛奔。 —— 我忍住不升級(jí)。 gradle 下載不來(lái) —— 手動(dòng)下 maven 倉(cāng)庫(kù)慢 —— 我使用 aliyun 的鏡像。
然后我遇到一個(gè)新的問(wèn)題,ssl 失敗: Caused by: org.gradle.api.resources.ResourceException: Could not get resource ' http://maven.aliyun.com/nexus/content/groups/public/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.3.30/kotlin-compiler-embeddable-1.3.30.jar' . Caused by: javax.net.ssl.SSLException: SSL peer shut down incorrectly 。
嘗試改成 http, 也無(wú)濟(jì)于事,用瀏覽器直接下是可行的。 有解乎
比如我分享一張圖片,分享列表里面會(huì)把我所有 tg 群列出來(lái),所以,有辦法屏蔽嗎?一加 7pro 氧 os
事情的起因是老師突然把考試改成只能通過(guò) APP 考試了,所以之前的騷操作都用不了了,有沒(méi)有什么辦法能拿到超星考試?yán)飯D片的鏈接,或者能復(fù)制題目呢?
嘗試寫(xiě)了一個(gè) NDK 應(yīng)用,native 層代碼能成功調(diào)用,apk 包里也有 so 文件。手機(jī)上安裝后有 /data/app/pkgName/lib/arm64 目錄,但內(nèi)容是空的。 查看應(yīng)用的內(nèi)存 maps,和打開(kāi)的文件句柄都沒(méi)有發(fā)現(xiàn)加載 so 文件,但 so 中的代碼都已經(jīng)被執(zhí)行了,這個(gè)是在哪里加載的呢? 系統(tǒng)是 LineagesOS 16.0 對(duì)應(yīng) Android 9.
隨著國(guó)內(nèi)越來(lái)越多應(yīng)用商店要求上傳 64 位 APK,Qigsaw 針對(duì) Base APK 和 Split APKs 基于 ABI 維度拆分的需求也迫在眉睫。因此,1.4.0 版本推出該功能,僅需一個(gè)配置,Qigsaw 將為您解決所有 APKs 的拆分。更多更新說(shuō)明,我已經(jīng)發(fā)布至 1.4.0 版本更新詳情說(shuō)明 ,請(qǐng)大家移步查看。 支持 Base APk 和 Split APKs 基于 ABI 維度拆分 ABI 。Qigsaw 會(huì)依據(jù)當(dāng)前應(yīng)用運(yùn)行的 CPU 架構(gòu)環(huán)境選擇對(duì)應(yīng) Split APKs 下載。 支持 Base APK 中 Activity 使用 Split APKs 中 Fragment 或 Resources 。 不再?gòu)?qiáng)制要求啟動(dòng)編譯命令中包含 qigsawAssemble${variantName.capitalize()}。 其他 bug fix 請(qǐng)參考 commit 提交。
感謝大家對(duì) Qigsaw 的支持,Github star 數(shù)離 1000 的目標(biāo)越來(lái)越近,歡迎大家點(diǎn)亮 star,多謝!
ImageDecoder.decodeBitmap 這個(gè) API 解碼 heif 時(shí)候,是不是會(huì)自動(dòng)調(diào)用硬解,失敗了再走軟解;
小白一個(gè),想問(wèn)一下,在非 root 情況下,是否有辦法給車(chē)載的某個(gè) app 授予錄音權(quán)限呢?目前這個(gè)車(chē)載平板可以開(kāi)啟調(diào)試模式,可以連電腦。 想問(wèn)通過(guò) adb 或者電腦上手機(jī)管理類(lèi)的軟件是否可以實(shí)現(xiàn)錄音權(quán)限授予的操作呢?
今天看到 LineageOS 上 Moto X Play(XT1562)更新到 android 10 了,版本是 lineage-17.1-20200614-nightly-lux-signed.zip ,直接刷入后發(fā)現(xiàn)卡不能用了,打電話(huà)直接提示“需關(guān)閉飛行模式才能撥打電話(huà)”。是不是底包的問(wèn)題???
我在 bat 這方面是個(gè)新手,不是很了解,網(wǎng)上查了 也查不到 就想做個(gè)半自動(dòng)安裝的 bat 腳本
adb devices ::adb shell ::查詢(xún)手機(jī)連接情況
@ set /p path=APK path:
adb install %path%
::echo end pause
zxing 識(shí)別條形碼 精度不高?。?大家都是怎么優(yōu)化的。是條形碼不是二維碼哦
源碼解析
谷歌推出 Navigation 主要是為了統(tǒng)一應(yīng)用內(nèi)頁(yè)面跳轉(zhuǎn)行為。本文主要是根據(jù) Navigation 版本為 2.1.0 的源碼進(jìn)行講解。 'androidx.navigation:navigation-fragment:2.1.0' 'androidx.navigation:navigation-ui:2.1.0' 'androidx.navigation:navigation-fragment-ktx:2.1.0' 'androidx.navigation:navigation-ui-ktx:2.1.0'
Navigation 的使用很簡(jiǎn)單,在創(chuàng)建新項(xiàng)目的時(shí)候可以直接選擇 Bottom Navigation Activity 項(xiàng)目,這樣默認(rèn)就已經(jīng)幫我們實(shí)現(xiàn)了相關(guān)頁(yè)面邏輯。
之前寫(xiě)過(guò) Navigation 相關(guān)的用法,請(qǐng)移步:
Android Jetpack 架構(gòu)組件 — Navigation 入坑詳解
Navigation 的源碼也很簡(jiǎn)單,但是卻涉及到很多的類(lèi),主要有以下幾個(gè): Navigation 提供查找 NavController 方法 NavHostFragment 用于承載導(dǎo)航的內(nèi)容的容器 NavController 通過(guò) navigate 實(shí)現(xiàn)頁(yè)面的跳轉(zhuǎn) Navigator 是一個(gè) abstract,有是個(gè)主要實(shí)現(xiàn)類(lèi) NavDestination 導(dǎo)航節(jié)點(diǎn) NavGraph 導(dǎo)航節(jié)點(diǎn)頁(yè)面集合
我們首先從 NavHostFragment 入手查看,因?yàn)樗侵苯佣x在我們的 XML 文件中的,我們直接查看器生命周期方法 onCreate: @CallSuper @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Context context = requireContext(); mNavController = new NavHostController(context); //1 mNavController.setLifecycleOwner(this); .... onCreateNavController(mNavController);//2 .... }
注釋 1 處 直接創(chuàng)建了 NavHostController 并通過(guò) findNavController 方法暴露給外部調(diào)用者。NavHostController 是繼承自 NavController 的。注釋 2 處代碼如下: @CallSuper protected void onCreateNavController(@NonNull NavController navController) { navController.getNavigatorProvider().addNavigator( new DialogFragmentNavigator(requireContext(), getChildFragmentManager())); navController.getNavigatorProvider().addNavigator(createFragmentNavigator()); }
通過(guò) navController 獲取 NavigatorProvider 并向其中添加了兩個(gè) Navigator,分別為 DialogFragmentNavigator 和 FragmentNavigator 。另外在 NavController 的構(gòu)造方法中還添加了另外兩個(gè) Navigator,如下: public NavController(@NonNull Context context) { .... mNavigatorProvider.addNavigator(new NavGraphNavigator(mNavigatorProvider)); mNavigatorProvider.addNavigator(new ActivityNavigator(mContext)); }
他們都是 Navigator 的實(shí)現(xiàn)類(lèi)。分別對(duì)應(yīng)于 DialogFragment 、Fragment 和 Activity 的頁(yè)面跳轉(zhuǎn)。大家可能對(duì)于 NavGraphNavigator 一些好奇,它是用在什么地方的呢? 其實(shí)我們?cè)?XML 中配置的 navGraph 對(duì)應(yīng)的 navigation 跟節(jié)點(diǎn)文件中的 startDestination 就是通過(guò) NavGraphNavigator 來(lái)實(shí)現(xiàn)跳轉(zhuǎn)的。這也是它目前唯一的用途。
各個(gè) Navigator 通過(guò)復(fù)寫(xiě) navigate 方法來(lái)實(shí)現(xiàn)各自的跳轉(zhuǎn)邏輯。這里重點(diǎn)強(qiáng)調(diào)下 FragmentNavigator 的實(shí)現(xiàn)邏輯: public NavDestination navigate(@NonNull Destination destination, @Nullable Bundle args, @Nullable NavOptions navOptions, @Nullable Navigator.Extras navigatorExtras) { .... final Fragment frag = instantiateFragment(mContext, mFragmentManager, className, args); frag.setArguments(args); final FragmentTransaction ft = mFragmentManager.beginTransaction(); .... ft.replace(mContainerId, frag); //1 .... }
最關(guān)鍵的一行代碼就是注釋 1 處。他是通過(guò) replace 來(lái)加載 Fragment 的 ,這不符合我們實(shí)際的開(kāi)發(fā)邏輯。文章后續(xù)會(huì)講解如何自定義 FragmentNavigator 來(lái)避免 Fragment 在切換的時(shí)候 生命周期的執(zhí)行。
回到上文中的 navController 獲取的 NavigatorProvider 其內(nèi)部是維護(hù)了一個(gè) HashMap 來(lái)存儲(chǔ)相關(guān)的 Navigator 信息。通過(guò)獲取到 Navigator 的注解 Name 為 key 和 Navigator 的 getClass 為 value 進(jìn)行存儲(chǔ)。
我們?cè)诨氐缴衔闹械?onCreate 方法: @CallSuper @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Context context = requireContext(); .... if (mGraphId != 0) { mNavController.setGraph(mGraphId); } else { .... if (graphId != 0) { mNavController.setGraph(graphId, startDestinationArgs); } } }
這里通過(guò) mNavController 調(diào)用了 setGraph 。這里主要是為了解析我們的 XML 中配置的 mobile_navigation 節(jié)點(diǎn)信息文件。會(huì)根據(jù)不同的節(jié)點(diǎn)來(lái)各自解析。 @NonNull private NavDestination inflate(@NonNull Resources res, @NonNull XmlResourceParser parser, @NonNull AttributeSet attrs, int graphResId) throws XmlPullParserException, IOException { Navigator navigator = mNavigatorProvider.getNavigator(parser.getName()); final NavDestination dest = navigator.createDestination(); dest.onInflate(mContext, attrs); .... final String name = parser.getName(); if (TAG_ARGUMENT.equals(name)) { // argument 節(jié)點(diǎn) inflateArgumentForDestination(res, dest, attrs, graphResId); } else if (TAG_DEEP_LINK.equals(name)) { // deeplink 節(jié)點(diǎn) inflateDeepLink(res, dest, attrs); } else if (TAG_ACTION.equals(name)) { // action 節(jié)點(diǎn) inflateAction(res, dest, attrs, parser, graphResId); } else if (TAG_INCLUDE.equals(name) && dest instanceof NavGraph) { // include 節(jié)點(diǎn) final TypedArray a = res.obtainAttributes(attrs, R.styleable.NavInclude); final int id = a.getResourceId(R.styleable.NavInclude_graph, 0); ((NavGraph) dest).addDestination(inflate(id)); a.recycle(); } else if (dest instanceof NavGraph) { // NavGraph 節(jié)點(diǎn) ((NavGraph) dest).addDestination(inflate(res, parser, attrs, graphResId)); } } return dest; }
通過(guò)獲取 NavInflater 來(lái)對(duì)其進(jìn)行解析。解析后返回 NavGraph,NavGraph 是繼承自 NavDestination 的。里面主要是保存了所有解析出來(lái)的節(jié)點(diǎn)信息。
最后簡(jiǎn)單的總結(jié)下就是通過(guò) NavHostFragment 獲取到 NavContorl 并存儲(chǔ)了相關(guān)的 Navigator 信息。通過(guò)各自的 navigate 方法進(jìn)行頁(yè)面的跳轉(zhuǎn)。通過(guò) setGraph 來(lái)解析配置的頁(yè)面節(jié)點(diǎn)信息,并封裝為 NavGraph 對(duì)象。里面通過(guò) SparseArray 來(lái)存儲(chǔ) Destination 信息。
自定義 FragmentNavigator
上文中我們說(shuō)了需要自定義自己的 Navigator 用于承載 Fragment 。主要的實(shí)現(xiàn)思路就是繼承現(xiàn)有的 FragmentNavigator 并復(fù)寫(xiě)其 navigate 方法,將其中的 replace 方法 替換為 show 和 hide 方法 來(lái)完成 Fragment 的切換。
那么我們自定義的 Navigator 如何才能讓系統(tǒng)識(shí)別呢? 這也簡(jiǎn)單,只要給我們的 類(lèi)加上注解 @ Navigator .Name(value) 那么他就是一個(gè) Navigator 了。最后通過(guò)上文中分析的思路 在將其加入到 NavigatorProvider 中 即可。
具體的自定義 Navigator 已經(jīng)在項(xiàng)目 Android Jetpack 架構(gòu)開(kāi)發(fā)組件化應(yīng)用實(shí)戰(zhàn) 中了,類(lèi)名:FixFragmentNavigator 。大家可以自行去看下。這里就將核心的代碼貼出來(lái)看下: @Navigator.Name("fixFragment") //新的 Navigator 名稱(chēng) class FixFragmentNavigator(context: Context, manager: FragmentManager, containerId: Int) : FragmentNavigator(context, manager, containerId) { override fun navigate( destination: Destination, args: Bundle?, navOptions: NavOptions?, navigatorExtras: Navigator.Extras? ): NavDestination? { .... //ft.replace(mContainerId, frag) /** * 1 、先查詢(xún)當(dāng)前顯示的 fragment 不為空則將其 hide * 2 、根據(jù) tag 查詢(xún)當(dāng)前添加的 fragment 是否不為 null,不為 null 則將其直接 show * 3 、為 null 則通過(guò) instantiateFragment 方法創(chuàng)建 fragment 實(shí)例 * 4 、將創(chuàng)建的實(shí)例添加在事務(wù)中 */ val fragment = mManager.primaryNavigationFragment //當(dāng)前顯示的 fragment if (fragment != null) { ft.hide(fragment) } var frag: Fragment? val tag = destination.id.toString() frag = mManager.findFragmentByTag(tag) if (frag != null) { ft.show(frag) } else { frag = instantiateFragment(mContext, mManager, className, args) frag.arguments = args ft.add(mContainerId, frag, tag) } .... } }
自定義完成好,還需要將 mobile_navigation 的節(jié)點(diǎn)中遠(yuǎn) fragment 替換為 fixFragment 節(jié)點(diǎn)。并刪除布局文件中 NavHostFragment 節(jié)點(diǎn)的 app:navGraph="@navigation/mobile_navigation"
信息,因?yàn)槲覀冃枰謩?dòng)將 FixFragmentNavigator 和 NavControl 進(jìn)行關(guān)聯(lián)。 //添加自定義的 FixFragmentNavigator navController = Navigation.findNavController(this, R.id.nav_host_fragment) val fragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val fragmentNavigator = FixFragmentNavigator(this, supportFragmentManager, fragment!!.id) navController.navigatorProvider.addNavigator(fragmentNavigator) navController.setGraph(R.navigation.mobile_navigation)
這樣就完成了自定義 Navigator 實(shí)現(xiàn)切換 Tab 的時(shí)候 Fragment 生命周期不會(huì)重新執(zhí)行了。
具體代碼邏輯詳見(jiàn): Android Jetpack 架構(gòu)開(kāi)發(fā)組件化應(yīng)用實(shí)戰(zhàn)
榮耀平板 v6,感覺(jué)不錯(cuò),6+64G,支持?jǐn)U展卡,2099 到手,不知 64G,對(duì)于 android 平板夠不夠用?
各位 v 友,我自己做了個(gè) app,因?yàn)榉?wù)器流量比較拮據(jù) 下載 app 都是放到網(wǎng)盤(pán)上給客戶(hù)下載。 升級(jí)又讓客戶(hù)去下載,不合適,想考慮用 app 內(nèi)自動(dòng)更新。
一個(gè) app 大約 15m 左右,用戶(hù)大概有 10000 多,以前服務(wù)器是 web 用的, 開(kāi)發(fā) web 都是很考慮圖片大小優(yōu)化,1k-10k 的圖片,一下子考慮 同時(shí) 1 萬(wàn)多人下載 15m,服務(wù)器是萬(wàn)萬(wàn)撐不起的。
是不是有第三方服務(wù)專(zhuān)門(mén)提供 app 升級(jí)的服務(wù)呢 好久沒(méi)搞服務(wù)器的調(diào)整了,如果升級(jí)自己原有服務(wù)器,也不知道流量貴不貴。
大家能否給下建議呢?
有沒(méi)有什么好用的在線(xiàn)分析的平臺(tái)
除了我現(xiàn)在用的騰訊哈勃
還有自己搭建的 MobSF
最好是有動(dòng)態(tài)分析的
這個(gè)只是學(xué)校里面的一些研究課題,不是正式的產(chǎn)品。
請(qǐng)教一下,現(xiàn)在主流的手機(jī)屏幕解鎖方式有密碼,手勢(shì)滑動(dòng),指紋,人臉識(shí)別等。我主要想研究下,設(shè)計(jì)一些新的解鎖方式,看看與傳統(tǒng)的解鎖方式,在安全性,易用性,速度等方面的對(duì)比。比如,手勢(shì)滑動(dòng)從現(xiàn)在的 9 個(gè)點(diǎn),增加到 16 個(gè)點(diǎn);手寫(xiě)簽名的方式進(jìn)行解鎖等。
因?yàn)橹皼](méi)有接觸過(guò)這方面的開(kāi)發(fā),想請(qǐng)教下,只是做些試驗(yàn), 需要什么樣的設(shè)備和條件呀? 從哪里可以找到手機(jī)解鎖相關(guān)的源代碼呀?
非常感謝!
移動(dòng)互聯(lián)網(wǎng)給人們的生活帶來(lái)了極大的便利,但是隨著移動(dòng)互聯(lián)網(wǎng)市場(chǎng)的需求快速增長(zhǎng),移動(dòng) APP 的開(kāi)發(fā)與應(yīng)用也是成幾何級(jí)數(shù)量遞增,帶來(lái)的流量紅利逐漸被消耗殆盡,移動(dòng)應(yīng)用市場(chǎng)由增量變成存量,移動(dòng)互聯(lián)網(wǎng)發(fā)展開(kāi)始步入下半場(chǎng),在功能上得到最大化開(kāi)發(fā)的移動(dòng)應(yīng)用,因缺少安全防護(hù)開(kāi)始面臨接踵而來(lái)的安全問(wèn)題,安全威脅已經(jīng)成為制約移動(dòng) APP 發(fā)展的主要因素。------------------------------------------------------------------------------------------------------------------------------------ 逆向破解,竊取技術(shù) 核心技術(shù)是每家企業(yè)的立足根本,能夠直接影響產(chǎn)品在市場(chǎng)中的地位。比如機(jī)器學(xué)習(xí)算法的性能、圖片和視頻算法的處理速度和準(zhǔn)確性。目前產(chǎn)品競(jìng)爭(zhēng)激烈,部分企業(yè)為了快速追趕友商,會(huì)在暗地中使用逆向工程,提取友商產(chǎn)品的核心程序,并逆向分析其業(yè)務(wù)邏輯和算法,之后抄襲運(yùn)用在自己的產(chǎn)品中,搶占市場(chǎng)份額。 ------------------------------------------------------------------------------------------------------------------------------------ 破解軟件,非法盜版 目前大部分移動(dòng)應(yīng)用直接裸奔,沒(méi)有采取任何安全措施。部分應(yīng)用采用簽名校驗(yàn)、Dex 加殼等技術(shù)來(lái)杜絕盜版應(yīng)用,但是難以抵擋專(zhuān)業(yè)“黑客”的逆向破解,攻擊者利用 IDA 等逆向工具結(jié)合靜態(tài)和動(dòng)態(tài)手段,可以輕松破解軟件的防御機(jī)制,并肆意篡改代碼或植入病毒來(lái)竊取隱私數(shù)據(jù)。盜版應(yīng)用會(huì)嚴(yán)重危用戶(hù)的隱私數(shù)據(jù)和個(gè)人資產(chǎn),也嚴(yán)重影響企業(yè)的名譽(yù),甚至遭受監(jiān)管單位懲罰。 ------------------------------------------------------------------------------------------------------------------------------------ Android 常用加密支持對(duì) Android JNI 項(xiàng)目的 C/C++代碼進(jìn)行虛擬化、混淆、字符串加密等安全保護(hù)。該系統(tǒng)基于 Clang 編譯器擴(kuò)展實(shí)現(xiàn), 能夠?qū)?xiàng)目的源代碼進(jìn)行安全編譯,并且在編譯階段可以對(duì)指定的函數(shù)實(shí)施代碼虛擬化、代碼混淆等加密處理。其中代碼虛擬化功能憑借自定義 CPU 指令的特性,代碼一旦加密,永不解密,攻擊者無(wú)法還原代碼,分析核心業(yè)務(wù)邏輯。可幫助中大型企業(yè)在通信、支付、算法、核心技術(shù)等模塊進(jìn)行深度加密,避免因逆向破解問(wèn)題造成的經(jīng)濟(jì)損失。 KiwiVM 為 NDK 插件模式,不改變?cè)虚_(kāi)發(fā)流程,完美支持 Jenkins 、Fastlan 等持續(xù)構(gòu)建工具。PC 端有多款 VM 加密產(chǎn)品,而?KiwiVM 是目前移動(dòng)端僅有的 VM 加密產(chǎn)品。 ------------------------------------------------------------------------------------------------------------------------------------ Android 加密技術(shù)特性 安全覆蓋全面 能夠保護(hù)應(yīng)用 Dex 文件和 So 文件,并且提供主動(dòng)防御保護(hù)機(jī)制,全面保護(hù) APP 安全; 安全強(qiáng)度高 獨(dú)家 Dex-Java2C 和源碼虛擬化技術(shù)配合使用,對(duì) Java 代碼進(jìn)行高強(qiáng)度加密,可抵擋專(zhuān)業(yè)黑客的逆向攻擊; 加密粒度細(xì) 以 Java/C/C++代碼的函數(shù)為單位進(jìn)行加密保護(hù),粒度細(xì)、可控性高、隱蔽性強(qiáng); 兼容性高 適配 APP 內(nèi)的各種業(yè)務(wù)邏輯,并且高級(jí)版的 Java2C 通過(guò)中間代碼進(jìn)行加密保護(hù),兼容性與原始應(yīng)用一致; 性能損耗低 Dex 加殼方案的啟動(dòng)時(shí)間增量小于 1s,是業(yè)界做得最好的方案。Java 函數(shù)級(jí)加密影響非常小,可以忽略不計(jì) ------------------------------------------------------------------------------------------------------------------------------------ 業(yè)務(wù)合作,請(qǐng)聯(lián)系 Android 加密: https://www.kiwisec.com/product/KiwiVM-so.html ios 代碼混淆: https://www.kiwisec.com/product/KiwiVM-ios.html 公司: https://www.kiwisec.com/
在 gradle 文件里添加了 kotlin 庫(kù)后,app 紅叉,報(bào)錯(cuò) Default Activity not found 。但是在 AndroidMenifest.xml 文件里定義了 MAIN 和 LAUNCHER 的 MainActivity 。請(qǐng)問(wèn)怎么解決這種問(wèn)題?
最近看狀態(tài)欄鬧鐘圖標(biāo)不爽,感覺(jué)它完全是多余的。之前知道 adb 命令可以隱藏它,于是決定試一試。
首先執(zhí)行命令: adb shell settings put secure icon_blacklist alarm_clock
發(fā)現(xiàn)鬧鐘圖標(biāo)消失了,但多了一個(gè)不明圖標(biāo),感到很好奇。于是去看了 Android 源碼,發(fā)現(xiàn)了這樣的代碼: public static ArraySet getIconBlacklist(String blackListStr) { ArraySet ret = new ArraySet<>(); if (blackListStr == null) { blackListStr = "rotate,headset"; } String[] blacklist = blackListStr.split(","); for (String slot : blacklist) { if (!TextUtils.isEmpty(slot)) { ret.add(slot); } } return ret; }
原來(lái)在沒(méi)有設(shè)置的時(shí)候有個(gè)默認(rèn)值:"rotate,headset",而那個(gè)不明圖標(biāo)是屏幕旋轉(zhuǎn)的,所以解決辦法就簡(jiǎn)單了: adb shell settings put secure icon_blacklist rotate,headset,alarm_clock