androidsystemui源碼
① 求助Android系統中SystemUI.apk中控制項的顯示和隱藏問題
網上找了好多狀態欄隱藏的方法,搜集總結一下,供以後參考。
系統中狀態欄的隱藏
定製系統的時候,想去掉系統中的狀態欄,系統中的狀態欄隱藏的可在framework中的SystemUI.apk中修改實現。
SystemUI.apk代碼位於
RK2908/ics/frameworks/base/packages/SystemUI
設置狀態欄不顯示:
打開文件SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
找到如下代碼
460 final TabletStatusBarView sb = (TabletStatusBarView)View.inflate(
461 context, R.layout.status_bar, null);
462 mStatusBarView = sb;
在代碼之後加入如下一行
mStatusBarView.setVisibility(View.INVISIBLE);
重新編譯得到SystemUI.apk
xiaxg@system:~/RK2908/ics/build$ source envsetup.sh
xiaxg@system:~/RK2908/ics/frameworks/base/packages/SystemUI$ mm
得到的SystemUI.apk 位於out/target/proct/rk29sdk/system/app/SystemUI.apk
將SystemUI.apk放在目標板 /system/app下;
如不重啟系統的話,需殺掉com.android.systemui進程才會運行新的SystemUI.apk
Apk中狀態欄的隱藏,全屏的實現
在開發中我們經常需要把我們的應用設置為全屏,這里介紹兩種方法,一中是在代碼中設置,另一種方法是在配置文件里改。
1. 在代碼中設置:
package com.android.tutor;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class OpenGl_Lesson1 extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去除title
requestWindowFeature(Window.FEATURE_NO_TITLE);
//去掉Activity上面的狀態欄
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
WindowManager.LayoutParams. FLAG_FULLSCREEN);
setContentView(R.layout.main);
}
}
設置全屏的倆段代碼必須在setContentView(R.layout.main) 之前,不然會報錯。
2. 在配置文件里修改
關鍵此行:android:theme="@android:style/Theme.NoTitleBar.Fullscreen",如果想只是去除標題欄就後面不用加Fullscreen了,另外,如果想要整個應用都去除標題欄和狀態欄,就把這句代碼加到<application。。標簽裡面,如果只是想某個activity起作用,這句代碼就加到相應的activity上。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.tutor"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".OpenGl_Lesson1"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
</manifest>
說明,用前者在我們應用運行後,會看到短暫的狀態欄,然後才全屏,而第二種方法是不會有這種情況的,所以建議使用後者!
② Android11 Notification功能解析
我們知道,當手機有通知時,下拉通知中心中會顯示所有的通知,該功能是在SystemUI中實現的,接著上篇文章 Android11 SystemUI解析 ,本文對通知相關的功能邏輯進行分析,基於Android11 CarSystemUI的通知功能邏輯展開分析。
關於通知功能邏輯,簡單來說,無非就是四步,注冊、發送、接收、顯示,那麼接下來針對以上四步進行源碼詳細分析。
關於CarSystemUI啟動及相關邏輯可以參考文章 Android11 SystemUI解析 ,本文就不贅述了,直接以類為入口進行分析:
從構造方法來看:
可以看到,在創建以上實例時,會通過Inject的方式來創造對應參數的實例,該功能是通過dagger2來實現,具體對應的Mole為CarNotificationMole類,看一下CarNotificationListener實例創造時的實現,關於NotificationViewController後面再分析:
可以看到,在()提供CarNotificationListener實例時,還執行了registerAsSystemService()方法,接下來看一下CarNotificationListener類:
CarNotificationListener繼承了NotificationListenerService類,該類繼承了Service,是framework內部的組成部分,通過registerAsSystemService()來看一下該類的實現:
該方法內部主要執行了兩項操作:
a.創建了NotificationListenerWrapper對象,該類繼承了INotificationListener.Stub,主要用來接收回調,後面在顯示環節進行詳細分析;
b.將以上對象作為參數通過INotificationManager的registerListener進行注冊;
通過getNotificationInterface()的是實現可以知道,registerListener()執行到了NotificationManagerService裡面去了,接下來一起看一下:
mListeners是NotificationListeners實例,是在init()中進行初始化的,NotificationListeners是其內部類,看一下具體實現:
NotificationListeners繼承了ManagedServices,registerSystemService方法是在ManagedServices裡面實現的,看一下:
根據調用關系,registerServiceImpl()方法內先將前面創建的INotificationListener(mWrapper)作為參數創建了ManagedServiceInfo實例info,然後執行linkToDeath進行死亡監測,最後將info加入mServices中進行管理,執行完後再執行onServiceAdded(info),該方法是在NotificationListeners類內部實現的,再回去看一下該方法,最終會調用到CarNotificationListener.java裡面的onListenerConnected()方法。
以上注冊過程邏輯比較繞,用一張圖來總結一下:
發送過程比較簡單,按照系統提供的方法來發送即可,主要涉及NotificationChannel、Notification、NotificationManager這三個類,簡單看一下:
首先某個應用在發送通知前需要創建該應用對應的NotificationChannel,然後在通知中傳入對應channel ID就可以了,創建如下:
在創建NotificationChannel時需要傳入唯一的id、name和importance,創建如下:
創建完NotificationChannel後,再創建Notification,Notification創建採用的是Builder模式,主要涉及的內容比較多,創建如下:
Notification涉及的內容比較多,可以根據需要進行設定;
創建完Notification後,通過NotificationManger來進行發送就可以了:
執行完notify後續的邏輯處理過程,在接收環節進行分析;
發送時會調用到notify()方法:
跟隨調用關系,會調用到notifyAsUser()方法:
在notifyAsUser()會調用到NotificationManagerService中的enqueueNotificationWithTag()方法,先看一下fixNotification()方法:
需要注意一下:當應用targetSdkVersion大於22時,在創建Notification時需要傳入smallIcon,否則會拋異常導致發送不成功;接下來看一下enqueueNotificationWithTag()方法:
NotificationManagerService繼承了SystemService,在SystemServer中會進行啟動,在start()方法內部會執行publishBinderService來進行Binder注冊提供服務:
可以看到,enqueueNotificationWithTag()會調用到enqueueNotificationInternal(),該方法是真正的邏輯實現:
該方法中主要做了以下幾件事:
1.進行各種check來確保notification的合法性;
2.將Notification作為參數創建StatusBarNotification;
3.獲取Notification對應的channel id,根據channel id 來獲取應用對應的NotificationChannel,如果為空的話,就直接返回了,因此應用在發送notification前需要先創建對應NotificationChannel;
4.通過Handler post EnqueueNotificationRunnable來執行後續邏輯;
在EnqueueNotificationRunnable內部會將r(NotificationRecord)加入mEnqueuedNotifications進行管理,然後判斷該NotificationRecord是否已經存在過,最後執行PostNotificationRunnable;
PostNotificationRunnable的run()中主要處理邏輯如下:
1.從mEnqueuedNotifications中找到跟key對應的NotificationRecord;
2.通過indexOfNotificationLocked()看mNotificationList裡面是否已經包含該NotificationRecord,如果不存在,說明是新的record,需要加入mNotificationList進行管理;否則的話,將mNotificationList中index對應的NotificationRecord進行更新;
3.將要處理的NotificationRecord放入mNotificationsByKey進行管理;
4.執行mListeners.notifyPostedLocked(r, old)來進行通知;
5.在finally裡面將要處理的NotificationRecord從mEnqueuedNotifications裡面移除;
6.如果在加入後有取消操作,需要立刻執行取消操作,並將NotificationRecord從mDelayedCancelations中移除;
前面講到,在PostNotificationRunnable中會執行mListeners.notifyPostedLocked(r, old)進行通知,mListeners是NotificationListeners實例:
跟隨調用關系:
通過getServices()來找到已經注冊過的ManagedServiceInfo列表,最後執行notifyPosted();
在notifyPosted()內部通過info.service來找到對應的INotificationListener實例,對應NotificationListenerService內部的NotificationListenerWrapper,然後將StatusBarNotification封裝成StatusBarNotificationHolder,最後執行NotificationListenerWrapper的onNotificationPosted()方法:
最終會通過Handler來發送消息來進行處理;
onNotificationPosted(sbn, rankingMap)是在CarNotificationListener內部實現的;
在CarNotificationListener內部會將StatusBarNotification封裝成AlertEntry,然後執行notifyNotificationPosted():
一步一步調用:
先將alertEntry存入mActiveNotifications進行管理;然後執行發送NOTIFY_NOTIFICATION_POSTED消息;
該Handler是通過setHandler來賦值的,具體是在什麼地方呢?
這個需要回到最前面裡面了,前面說到NotificationViewController是在顯示環節進行分析,輪到NotificationViewController登場了;
NotificationViewController是在實例化,並執行enable()方法,先看一下構造方法:
在構造方法內部,會傳入CarNotificationView、CarNotificationListener、PreprocessingManager等實例,都是跟顯示有關的核心類;
1.CarNotificationView:負責處理通知顯示;
2.PreprocessingManager:負責管理通知,通過CarNotificationListener來獲取通知;
3.CarNotificationListener:跟NotificationManagerService間接交互的類;
可以看到Handler是在NotificationViewController裡面實現的,當有消息到來時,如果CarNotificationView顯示時執行updateNotifications()來直接顯示通知;不顯示時執行resetNotifications()來對通知進行管理;
以上就是Notification的整個工作過程,最後用一張流程圖來總結一下:
③ 手機上一直彈出「com.android.systemui」是怎麼回事怎麼解決
有可能是中毒,勸你殺毒檢測一下,這個是ROOT許可權管理錯誤。
解決方法:
1,需要先下載一個騰訊手機管家
2,打開後選擇安全防護--病毒查殺--病毒掃描--處理病毒
3,等處理完成後,再點體檢加速,清理一下手機垃圾,讓手機體驗非一般的感覺!
④ com.android.systemui已停止,怎麼解決
出現這個問題需要對手機進行恢復出廠設置的操作,以小米手機為例
一:打開設置
拓展資料
Android是一種基於Linux的自由及開放源代碼的操作系統,主要使用於移動設備,如智能手機和平板電腦,由Google公司和開放手機聯盟領導及開發。尚未有統一中文名稱,中國大陸地區較多人使用「安卓」或「安致」。Android操作系統最初由Andy Rubin開發,主要支持手機。2005年8月由Google收購注資。2007年11月,Google與84家硬體製造商、軟體開發商及電信營運商組建開放手機聯盟共同研發改良Android系統。隨後Google以Apache開源許可證的授權方式,發布了Android的源代碼。第一部Android智能手機發布於2008年10月。Android逐漸擴展到平板電腦及其他領域上,如電視、數碼相機、游戲機等。2011年第一季度,Android在全球的市場份額首次超過塞班系統,躍居全球第一。 2013年的第四季度,Android平台手機的全球市場份額已經達到78.1%。2013年09月24日谷歌開發的操作系統Android在迎來了5歲生日,全世界採用這款系統的設備數量已經達到10億台。
⑤ android 源碼 怎麼只編譯 systemui
Google提供的Android包含了原始Android的目標機代碼,主機編譯工具、模擬環境,下載的代碼包經過解壓後(這里是Android2.2的源碼包),源代碼的第一層目錄結構如下: -- Makefile -- bionic (bionic C庫) -- bootable (啟動引導相關代碼) -- build (存放系統編譯規則及generic等基礎開發包配置) -- cts (Android兼容性測試套件標准) -- dalvik (dalvik JAVA虛擬機) -- development (應用程序開發相關) -- external (android使用的一些開源的模組) -- frameworks (核心框架——java及C++語言) -- hardware (主要保護硬解適配層HAL代碼) -- libcore -- ndk -- device -- out (編譯完成後的代碼輸出與此目錄) -- packages (應用程序包) -- prebuilt (x86和arm架構下預編譯的一些資源) -- sdk (sdk及模擬器) -- system (文件系統庫、應用及組件——c語言) `-- vendor (廠商定製代碼) bionic 目錄 -- libc (C庫) -- arch-arm (ARM架構,包含系統調用匯編實現) -- arch-x86 (x86架構,包含系統調用匯編實現) -- bionic (由C實現的功能,架構無關) -- docs (文檔) -- include (頭文件) -- inet -- kernel (Linux內核中的一些頭文件) -- netbsd (?netbsd系統相關,具體作用不明) -- private (?一些私有的頭文件) -- stdio (stdio實現) -- stdlib (stdlib實現) -- string (string函數實現) -- tools (幾個工具) -- tzcode (時區相關代碼) -- unistd (unistd實現) `-- zoneinfo (時區信息) -- libdl (libdl實現,dl是動態鏈接,提供訪問動態鏈接庫的功能) -- libm (libm數學庫的實現,) -- alpha (apaha架構) -- amd64 (amd64架構) -- arm (arm架構) -- bsdsrc (?bsd的源碼) -- i386 (i386架構) -- i387 (i387架構?) -- ia64 (ia64架構) -- include (頭文件) -- man (數學函數,後綴名為.3,一些為freeBSD的庫文件) -- powerpc (powerpc架構) -- sparc64 (sparc64架構) `-- src (源代碼) -- libstdc++ (libstdc++ C++實現庫) -- include (頭文件) `-- src (源碼) -- libthread_db (多線程程序的調試器庫) `-- include (頭文件) `-- linker (動態鏈接器) `-- arch (支持arm和x86兩種架構) bootable 目錄 -- bootloader (適合各種bootloader的通用代碼) `-- legacy (估計不能直接使用,可以參考) -- arch_armv6 (V6架構,幾個簡單的匯編文件) -- arch_msm7k (高通7k處理器架構的幾個基本驅動) -- include (通用頭文件和高通7k架構頭文件) -- libboot (啟動庫,都寫得很簡單) -- libc (一些常用的c函數) -- nandwrite (nandwirte函數實現) `-- usbloader (usbloader實現) -- diskinstaller (android鏡像打包器,x86可生產iso) `-- recovery (系統恢復相關) -- edify (升級腳本使用的edify腳本語言) -- etc (init.rc恢復腳本) -- minui (一個簡單的UI) -- minzip (一個簡單的壓縮工具) -- mttils (mtd工具) -- res (資源) `-- images (一些圖片) -- tools (工具) `-- ota (OTA Over The Air Updates升級工具) `-- updater (升級器) build目錄 -- core (核心編譯規則) -- history (歷史記錄) -- libs `-- host (主機端庫,有android 「cp」功能替換) -- target (目標機編譯對象) -- board (開發平台) -- emulator (模擬器) -- generic (通用) -- idea6410 (自己添加的) `-- sim (最簡單) `-- proct (開發平台對應的編譯規則) `-- security (密鑰相關) `-- tools (編譯中主機使用的工具及腳本) -- acp (Android "acp" Command) -- apicheck (api檢查工具) -- applypatch (補丁工具) -- apriori (預鏈接工具) -- atree (tree工具) -- bin2asm (bin轉換為asm工具) -- check_prereq (檢查編譯時間戳工具) -- dexpreopt (模擬器相關工具,具體功能不明) -- droiddoc (?作用不明,java語言,網上有人說和JDK5有關) -- fs_config (This program takes a list of files and directories) -- fs_get_stats (獲取文件系統狀態) -- iself (判斷是否ELF格式) -- isprelinked (判斷是否prelinked) -- kcm (按鍵相關) -- lsd (List symbol dependencies) -- releasetools (生成鏡像的工具及腳本) -- rgb2565 (rgb轉換為565) -- signapk (apk簽名工具) -- soslim (strip工具) `-- zipalign (zip archive alignment tool) dalvik目錄 dalvik虛擬機 . -- dalvikvm (main.c的目錄) -- dexmp (dex反匯編) -- dexlist (List all methods in all concrete classes in a DEX file.) -- dexopt (預驗證與優化) -- docs (文檔) -- dvz (和zygote相關的一個命令) -- dx (dx工具,將多個java轉換為dex) -- hit (?java語言寫成) -- libcore (核心庫) -- libcore-disabled (?禁用的庫) -- libdex (dex的庫) -- libnativehelper (Support functions for Android's class libraries) -- tests (測試代碼) -- tools (工具) `-- vm (虛擬機實現) development 目錄 (開發者需要的一些常式及工具) -- apps (一些核心應用程序) -- BluetoothDebug (藍牙調試程序) -- CustomLocale (自定義區域設置) -- Development (開發) -- Fallback (和語言相關的一個程序) -- FontLab (字型檔) -- GestureBuilder (手勢動作) -- NinePatchLab (?) -- OBJViewer (OBJ查看器) -- SdkSetup (SDK安裝器) -- SpareParts (高級設置) -- Term (遠程登錄) `-- launchperf (?) -- build (編譯腳本模板) -- cmds (有個monkey工具) -- data (配置數據) -- docs (文檔) -- host (主機端USB驅動等) -- ide (集成開發環境) -- ndk (本地開發套件——c語言開發套件) -- pdk (Plug Development Kit) -- samples (演示程序) -- AliasActivity () -- ApiDemos (API演示程序) -- BluetoothChat (藍牙聊天) -- BrowserPlugin (瀏覽器插件) -- BusinessCard (商業卡) -- Compass (指南針) -- ContactManager (聯系人管理器) -- CubeLiveWall** (動態壁紙的一個簡單常式) -- FixedGridLayout (像是布局) -- GlobalTime (全球時間) -- HelloActivity (Hello) -- Home (Home) -- JetBoy (jetBoy游戲) -- LunarLander (貌似又是一個游戲) -- MailSync (郵件同步) -- MultiResolution (多解析度) -- MySampleRss (RSS) -- NotePad (記事本) -- RSSReader (RSS閱讀器) -- SearchableDictionary (目錄搜索) -- **JNI (JNI常式) -- SkeletonApp (空殼APP) -- Snake (snake程序) -- SoftKeyboard (軟鍵盤) -- Wiktionary (?維基) `-- Wiktionary**(?維基常式) -- scripts (腳本) -- sdk (sdk配置) -- simulator (?模擬器) -- testrunner (?測試用) `-- tools (一些工具)
⑥ 安卓手機游戲中的代碼如何獲得
您好
獲取游戲源代碼需要對APK進行反編譯,如果APK已經加密,無法通過反編譯的方法獲取源代碼
目前反編譯的軟體有很多,您可以在騰訊電腦管家中下載,推薦使用【改之理】,一款非常好用的反編譯軟體,傻瓜式操作,適合新手,您網路也能搜索到
希望可以幫到您,望採納
騰訊電腦管家企業平台:http://..com/c/guanjia/