如何開啟小米,oppo,華為等手機的系統應用的指定頁面
如題,拿Oppo 手機做個示例,小米 華為也是如此。
在編寫Android應用的時候,我們經常會有這樣的需求,我們想直接開啟系統應用的某個頁面。比如在Oppo R9 手機上我們想開啟某個應用的通知管理介面如下圖
點選QQ圖示,跳轉到如下介面
同時我們在terminal中 通過 adb logcat |grep “ActivityManager” 我們可以看到Activity的相關資訊
I/ActivityManager( 902): START u0 {act=com.coloros.notificationmanager.app.detail cmp=com.coloros.notificationmanager/.AppDetailPreferenceActivity (has extras)} from uid 1000 from pid 31395 on display 0
D/ActivityManager( 902): Delay resumeKeyDispatchingLocked() to avoid deadlock.
I/ActivityManager( 902): [AppLaunch] Displayed Displayed com.coloros.notificationmanager/.AppDetailPreferenceActivity: +160ms
D/ActivityManager( 902): AP_PROF:AppLaunch_LaunchTime:com.coloros.notificationmanager/.AppDetailPreferenceActivity:160:27986714
D/ActivityManager( 902): ACT-IDLE_NOW_MSG from windowsVisible() for idle: ActivityRecord{293543ae u0 com.coloros.notificationmanager/.AppDetailPreferenceActivity t157}
通過日誌我們看到了設定QQ通知管理的Activity的包名和類名分別是
com.coloros.notificationmanager/.AppDetailPreferenceActivity.但是啟動這個Activity是需要附加Extras的,至少應用的包名是需要傳遞進去的,要不然憑什麼知道這就是設定QQ的通知許可權而不是微信的通知許可權呢。動動腳趾頭猜下 至少是傳遞了一個包名進去,但是具體的key我們是不得而知。怎麼辦!?我們想知道這個類到底傳了哪些key-value,以及這個Activity是否能被外部應用吊起,那隻能反編譯原始碼,到AppDetailPreferenceActivity.java中檢視到底傳遞了哪些key以及得到AndroidManifest.xml 檢視宣告的AppDetailPreferenceActivity exported 屬性是否為false。
1.1既然是反編譯,那首先我們要確定這個系統應用的APK到底在哪裡,連上手機,開啟terminal輸入以下命令
adb shell pm path com.coloros.notificationmanager
輸出如下
1.2 接下來的心情應該是興高采烈,躍躍一試,迫不及待的想要把apk pull到本地,進行反編譯,那麼我可以很負責任的告訴你,你高興的太早了,這樣根本無法反編譯出原始碼。不信且看
adb pull /system/app/notification_center/notification_center.apk ~/oppo
1.3這樣我們就把系統apk pull到本地了,先確認下apk中是否有dex檔案
unzip notification_center.apk
1.4.然後我在解壓後的資料夾想努力的找到classes.dex,最後震驚了,什麼鬼,apk 怎麼可以沒有classes.dex檔案,特麼的是在逗我嗎,真的不敢直視自己的才疏學淺, 反正事實就是這樣子了,就是沒有classes.dex,怎麼著吧。既然是這樣的話,那麼能拿到真正的apk嗎,答案當然是能。
到這裡我需要隆重介紹三個利器Lordroid、enjarify以及Apktool
,Lordroid 它能將系統優化過的odex 解碼成dex,就是利用它能夠將得到可以被反編譯的Apk、enjarify可以將apk反編譯成jar、Apktool可以獲取apk的資原始檔。具體使用請自行解決,不做過多介紹了。
正確開啟方式
2.1 把手機/system 拉取到電腦上
adb pull /system ~/system
這裡有三個比較重要的檔案或資料夾 build.pro、framework、priv-app。請注意!!!我們目標apk notification_center.apk不是說好的在 app資料夾裡面嗎,怎麼沒有拉取到呢。怎麼辦?再手動拉取一遍唄!
cd priv-app
rm -rf *
adb pull /system/app/notification-center .
這樣notification-center資料夾就被拉取下來了
2.2接下來開啟Lordroid主介面,cd Lordroid主目錄
java -jar Launcher.jar
2.3點選browse 選擇 ~/system(前面拉取Apk 的目錄) 目錄,如下提示找到priv-app 和framework目錄
2.4點選Deodex now!
2.5至此Deodex 已經成功,我們到priv-app/notification-center 中已經生成了一個notification-center.apk,再解壓看看是否有classes.dex
至此我們看到了classes.dex又重回apk的懷抱。可以按常規的方法去反編譯,此處省略xxx字,請自行腦補。
3.1 最後我們得到了notification-center.apk的jar包,用JD-GUI開啟,定位到AppDetailPreferenceActivity,查詢Extra關鍵字
會發現傳了”pkg_name” “app_name” “class_name”三個key。
3.2 那麼寫個demo 驗證下吧
private void startOppoNotification() { //Intent intent = new //Intent("com.coloros.notificationmanager.app.detail_ab//andon"); Intent intent = new Intent(); intent.setComponent(new ComponentName("com.coloros.notificationmanager", "com.coloros.notificationmanager.AppDetailPreferenceActivity")); intent.putExtra("pkg_name", "com.coohuaclient"); intent.putExtra("app_name", "酷劃鎖屏"); intent.putExtra("class_name", "com.coohuaclient.ui.activity.SplashActivity"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
3.3效果如下
理論上講有了這樣的方法,我們基本上可以直達任何應用的可以被外部訪問的介面了