Android反編譯odex而後從新打包

#Android反編譯odex而後從新打包

最近不知道怎麼回事,忽然把我那刷了氧OS的root了,而後就開始好奇起來氫OS所帶有的那些本地化的東西,好比通話錄音就是典型的一個之一。其中也作了不少的嘗試,XDA上有人說把/system/build.prop裏面的"persist.sys.oem.region"的值改爲「CN」,我嘗試了一下確實能夠,可是有的APP出現了崩潰卡死的問題,我發現改了後設置裏面系統版本變成了氫OS,而後三大金剛鍵都變成了又返回在右邊了,短信默認的都出現了氫的卡片效果,電話設置裏面也有了通話錄音,一切都成了氫OS的樣子,可是反作用是好多的第三方APP出新了不能運行崩潰等各類問題。
因而又把build.prop改爲了本來的樣子,而後開始了反編譯的探索之旅,因而就有了這篇博客,好多中文的博客寫的都過期了,真的是好幾天各類挖坑填坑爬坑的結果。本文的反編譯是在Android7.1.1環境下在mac操做系統下操做的
好了廢話說完了,一些概念諸如爲何有odex,odex之於apk裏面的dex,下面開始正文
***
修改這種系統預裝的app而後再打包理論上須要通過如下步驟html

odex -> smali files -> dex -> jar -> modify smali files -> dex -> apk(包括class.dex的apk)

一開始我就是按照這個步驟來的,由於odex依賴的系統版本比較高,好多中文博客介紹的都是過期的工具,致使中間遇到了太多太多的坑。由於我弄的這個apk是控制電話接通後的童話的那個邏輯的,因此每次弄好了還要把apk複製到手機裏面,而後再複製到/system/priv-app裏面,而後改權限,還要保存以前的備份等的東西而後再重啓手機,再撥打電話嘗試,因此操做步驟極其繁瑣。應該有更好的方法,只不過目前還懶的去發現。java

  1. odex -> smali files: 這一步是使用的smali工具,我用的是baksmali-2.2.1.jar,其基本的命令爲

    java -jar baksmali-2.2.1.jar deodex OPInCallUI.odex -b ./framework/arm64/boot.oat -o OPInCallUI
    deodex參數,指定要操做的文件名爲「OPInCallUI.odex」
    -b參數,指定bootclasspath,也就是要把手機rom的/system/framework裏面的文件直接拷貝到電腦上的當前工做目錄
    -o參數,指定輸出的smali文件的目錄
  2. smali files -> dex: 這一步用的仍是smali工具,不過jar文件變了,爲smali-2.2.1.jar,使用的基本命令爲

    java -jar smali-2.2.1.jar assemble OPInCallUI -o classes_o.dex
    assemble參數,指定smali files的文件夾所在
    -o參數,指定輸出的文件名爲「classes_o.dex」
  3. dex -> jar: 這一步用的是dex2jar工具,使用的基本命令爲

    ./dex2jar-2.0/d2j-dex2jar.sh classes_o.dex -o classes_o.jar
    意思是把「classes_o.dex」轉成「classes_o.jar」
  4. modify smali files: 這一步使用的工具主要會有不一樣,可是JD-GUI是少不了的,它能直接查看jar裏面的class文件所對應的源代碼,有了源碼,看一些邏輯就方便了太多了啊。
    jclasslib是查看java字節碼的一個工具。其實這個地方基本用不到看java的字節碼,而主要看smali(即Dalvik opcodes)文件 。
    smali文件用普通的文本編輯器查看修改就能夠了,可是須要先了解一下基本的語句,這是對照表。其實第2和第3步的主要目的就是看java的源碼,幫助更好的理解,若是你感受看smali跟看java是同樣的,那就能夠省略2和3步了
  5. modify smali files -> dex: 這一步是使用的仍是smali工具,不過要用smali-2.2.1.jar,其基本的命令爲

    java -jar smali-2.2.1.jar assemble OPInCallUI -o classes.dex
  6. dex -> apk(包括class.dex的apk): 把第五步生成的classes.dex用壓縮工具放在在手機"/system/priv-app/OPIncallUI"提取的OPInCallUI.apk裏。這裏我比較推薦BetterZip,能夠去編輯壓縮文件,製做壓縮文件的時候還能夠排除.DS_Store的影響。
  7. 把修改後的apk放回到"/system/priv-app/"裏面,重啓手機測試一下吧
    ***

注意:android

  1. boot.oat依賴的時候要拷貝全面,要否則就會報錯git

    Error occurred while loading class path files. Aborting.
    org.jf.dexlib2.analysis.ClassPathResolver$ResolveException: Error while loading oat file ./boot.oat
    具體的有篇文章,介紹了boot.oat和boot.art等的關係。初探boot.art與boot.oatgithub

  2. 減小中間環節,我查過各類資料後總結出來流程應該是這個樣子的
    app


    odex -> smali files -> dex -> jar -> modify jar -> dex -> apk(包括class.dex的apk)

    後來發現這個坑實在是太深了,有的時候用低版本的baksmali的時候就會報大量的錯誤

    org.jf.dexlib2.analysis.AnalysisException: Could not resolve the method in class Ljava/lang/reflect/Method;
    以此順延下去,確定打包的程序不能運行了。
    而後步驟多了出錯的地方就更多了,定位起問題來就更麻煩了。編輯器

  3. 安利一個Google的工具吧android-classyshark,用來查看apk的包資源,類方法名等的工具,簡直利器。再加一個插件intellij-java2smali,很方便的把java轉成smali查看
    ***ide

其實此次反編譯的初衷來源於想讓個人一加3T手機的氧OS可以像氫同樣擁有通話錄音的功能。而後經歷的種種,還受oos-call-recording項目的影響,還問了厚臉皮的問了做者原理。如今我也自建了一個項目,會上傳我微改的系統的APP,使氧OS的系統APP擁有氫OS的功能,而又不失去氧OS更新快的特色。項目的地址爲https://github.com/ysk666666/OxygenOS-SystemAppModified工具

相關文章
相關標籤/搜索