1. 程式人生 > >教你如何實現華為,小米,魅族等定製等系統應用間的跳轉,許可權管理,自啟動管理等與定製rom互動(也是基於反編譯研究成果有感怕忘記下來)

教你如何實現華為,小米,魅族等定製等系統應用間的跳轉,許可權管理,自啟動管理等與定製rom互動(也是基於反編譯研究成果有感怕忘記下來)

不用想的很高大上,菜鳥一枚不用多想, 研究了幾天的反編譯, 學到不少, 怕忘趕緊記一下.呵呵.

首先,先搞明白什麼叫反編譯, 它是一種逆向技術, 像一箱水果裝在箱子裡,從新疆客戶那邊運輸過來, 我們要想知道里面裝的是什麼水果並且吃掉它,就要先拆開箱子知道里面裝的是什麼,然後才能吃到這新疆新鮮的西瓜.

反編譯過程這裡大概一句帶過:apk-->dex-->jar-->java

用到:apktool 和java compiler

網上找到一篇比較適合新手的教程:http://blog.csdn.net/yelbosh/article/details/45250773(友情連結)

正文:

首先,基本的應用間跳轉是這樣的:

Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_LAUNCHER); //B的category屬性
ComponentName comp = new ComponentName("packagename","ActivityPath"); //第一個引數為B Activity的包名,第二個引數是B的路徑名.
intent.setComponent(comp);
//如有需要新增flag
int launchFlags = Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
intent.setFlags(launchFlags);
//在B應用中的intent-filter標籤內找到Action
intent.setAction("目標Activity 的 action");
startActivity(intent);

OK,介紹完應用間的普通跳轉,今天的部落格就到此為止.......了?No.

這幾天研究下了小米MIUI 7的安全中心 和華為的手機管家, 這兩款應用都是系統內建的APP.

為什麼反編譯這兩款app呢, 因為他們都是各自廠商定製性的功能類如許可權管理,自啟動管理等特殊應用,有時候我們app需要申請特殊許可權或系統不暴露許可權的時候,可以跟這些軟體要.而有時候開發為了簡單,涉及到需要許可權時,通常大部分程式直接跳轉到設定中心, 個人感覺使用者體驗不夠好, 因為有些使用者不會翻,特別是涉及到System_Alert_Window ,自啟動等等這些危險許可權和特殊許可權時, 很多爪機黨還真找不到,哈哈...所以砸門做這麼麻煩的工作說白了,就是提高了app的使用者體驗.

那麼我們開始吧,首先去到對應的廠商下載一個標準版的rom.  開啟找到對應的系統app,一般來說就在/system/app下  那麼接下來就裡面你想要的apk檔案拖拽出來,反編譯.拿到res檔案,和jar檔案. 這類檔案是分來的.那麼接下來第二步就是在你的開發環境中新建一個android專案, 將資原始檔站貼上到你的專案目錄下. 接下來的工作就是根據資原始檔找到對應的activity. 真心的覺得這個是比較耗時間和比較繁雜的,不過做過幾遍後感覺還是有點小技巧的.  

skill1: 用手機開啟apk對應的應用,進入到你想要跳轉的UI, 觀察UI上面的文字,圖片等資源座位依據,比如說actionbar上的title,那麼根據title進入到你新建的專案資源下,開啟string.xml, 搜尋對應的字串,然後複製string前的string-id. 完了跑到MainFest.xml下開啟搜尋,這時候,運氣好的就剛好搜搜到對應Activity的lable.那麼目的達到了. 另外,如果是eclipse專案的話,還可以通過控制元件id來找.去到R檔案裡面,跟根據你對應id的值,在根據id引用找到對應的activity也是可以的.比較簡單,這裡不詳細記錄.

skill2:這一步也是在第一步找不到的情況下退步處理, 比較繁雜,首先大概玩一遍應用,熟悉每一個介面,如果你比較叼就記下來每一個介面.然後進入到Mainfest.xml檔案下開啟刷activity標籤模式吧,這是有點小技巧,你可以mainfest用html開啟,開啟後將所有activity子標籤縮到activit標籤,方便查詢嘛.然後開啟刷activity模式, 看每一個activity的名字,猜測直到找到你認為最有可能的activity.雖然說這工作量有點大,有時候能有好三四十個activity,不過要能找到你最終的目標activity也是最好不過的.

好了, 找到activity了, 那麼接下來,就是去用java compiler 開啟jar檔案愉快的進入到程式碼環節,在你找到對應的activity裡面,先找到onCreate方法,在裡面找到跟intent相關的程式碼, 找這個的目的就是獲取activity的接收引數, 如果沒有那就用你找到的包名和activity全路徑,然後使用上面提到最簡單的方法開啟吧,這是一種情況, 第二種就是有傳參而往往都是這種情況,那麼就要仔細看intent接收的引數名和引數值了. 這一步就看個人閱讀程式碼能力, 運氣好一點apk沒有被混淆和加固,程式碼比較直觀,要是混淆和加固過,就呵呵噠了,慢慢來吧,在這裡如果有朋友有對應處理方法方便聯絡下我,非常thks.

OK,兩步達到,反編譯逆向過程就這麼簡單這麼嗨,反正我是非常爽的,不過,有一點比較苦逼的情況, 很多rom下的系統app都是將apk中的dex分離出來,那麼反編譯的時候找不到dex檔案,就只是在apk旁邊有看到一個odex,咋辦?樓主找了半天資料,終於找到了另外一種工具可以將odex和apk合併成包含classes.dex的apk檔案. <<批量合併apk與odex的工具>> ,工具裡面帶有教程.碰到的碼寶就用這個就行了.

OK,就說這麼多.剛入職幾天,做的軟體跟各種rom接觸比較深, 沒有人帶,還要帶人,靠自己慢慢成長吧, 向大神學習~