前一篇對某日頭條apk 的反編譯和二次打包介紹了Apk的反編譯和二次打包的流程舒帮,打包的apk使得其意見反饋按鈕失效瑞凑。這片文章在此基礎(chǔ)上創(chuàng)建新的界面末秃,點(diǎn)擊意見反饋之后進(jìn)入到自己創(chuàng)建的一個(gè)自定義的空調(diào)控制界面,在代碼修改層面更有參考意義籽御。這里只是演示效果练慕,不探討界面功能,其中這個(gè)自定義的空調(diào)界面是郭霖公眾號(hào)里介紹的一篇文章自定義View實(shí)戰(zhàn):空調(diào)遙控器技掏,對自定義View的學(xué)習(xí)很有幫助贺待,另外安利一下郭霖的公眾號(hào),每天都有干貨零截。
demo apk 下載地址apk下載
工具
對某日頭條apk 的反編譯和二次打包文中介紹過的工具這里不再介紹麸塞。本文中主要用到了Android studio中的插件:java2smali,可以在android studio中搜索到涧衙,其功能是可以直接把java代碼編譯為smali哪工,方便二次打包奥此。
目標(biāo)
在某日頭條的apk中插入一個(gè)界面代碼,在其設(shè)置界面中點(diǎn)擊意見反饋進(jìn)入我們自己創(chuàng)建的界面雁比。效果如下稚虎,點(diǎn)擊意見反饋進(jìn)入一個(gè)新的空調(diào)控制界面:
步驟
1. java到smali的轉(zhuǎn)變
在android studio中寫完代碼以后,github代碼地址有代碼偎捎,使用java2smali生成代碼的smali版本:
其中包括AirMoveView和DrawActivity兩個(gè)java文件的smali版本
由于匿名內(nèi)部類的原因蠢终,每個(gè)java文件生成了兩個(gè)smali文件。
2. Smali文件的修改
android反編譯-smali語法文中介紹了smali的語法茴她,smali中的每個(gè)變量均使用路徑加類名的方式寻拂,因此我們需要修改相關(guān)的路徑。本文中把smali文件放置在com/ss/android/article/base/feature/mine/路徑下丈牢,與BaseSettingActivity放在同一個(gè)路徑祭钉。修改四個(gè)smali文件中的變量為正確的路徑,如下所示:Github地址中有完整的代碼己沛,可以去下載學(xué)習(xí)慌核。
3. 資源文件和id
界面一般是需要xml文件來做布局的,因此要把相應(yīng)的xml布局文件放置在res/layout路徑下申尼。此處注意xml文件中的自定義控件也要更改路徑為com/ss/android/article/base/feature/mine/
如果認(rèn)為放置以后就可以直接打包運(yùn)行垮卓,那你就too young 了。Android R文件生成中介紹了android 中R文件的生成規(guī)則师幕,我們需要根據(jù)根據(jù)規(guī)則把xml中的id寫入R文件中扒接,具體路徑是com/ss/android/article/news/R$id。一定要參照Android R文件生成提到的規(guī)則正確寫们衙,以下引用自文章:
作者:hi大頭鬼hi
鏈接:https://www.zhihu.com/question/19730414/answer/67288581
資源ID是一個(gè)4字節(jié)的無符號(hào)整數(shù)钾怔,其中,最高字節(jié)表示Package ID蒙挑,次高字節(jié)表示Type ID宗侦,最低兩字節(jié)表示Entry ID。
Package ID相當(dāng)于是一個(gè)命名空間忆蚀,限定資源的來源矾利。Android系統(tǒng)當(dāng)前定義了兩個(gè)資源命令空間,其中一個(gè)系統(tǒng)資源命令空間馋袜,它的Package ID等于0x01男旗,另外一個(gè)是應(yīng)用程序資源命令空間,它的Package ID等于0x7f欣鳖。所有位于[0x01, 0x7f]之間的Package ID都是合法的察皇,而在這個(gè)范圍之外的都是非法的Package ID。前面提到的系統(tǒng)資源包package-export.apk的Package ID就等于0x01,而我們在應(yīng)用程序中定義的資源的Package ID的值都等于0x7f什荣,這一點(diǎn)可以通過生成的R.java文件來驗(yàn)證矾缓。
Type ID是指資源的類型ID。資源的類型有animator稻爬、anim嗜闻、color、drawable桅锄、layout琉雳、menu、raw友瘤、string和xml等等若干種翠肘,每一種都會(huì)被賦予一個(gè)ID。
Entry ID是指每一個(gè)資源在其所屬的資源類型中所出現(xiàn)的次序商佑。注意,不同類型的資源的Entry ID有可能是相同的厢塘,但是由于它們的類型不同茶没,我們?nèi)匀豢梢酝ㄟ^其資源ID來區(qū)別開來。
所以在該文件中的id不能隨意寫晚碾,前幾位要保持一致抓半,后邊的Entry ID要按順序?qū)?/b>,本文中的新加id如下圖:
另外layout的xml布局文件也要在com/ss/android/article/news/R$layout;中寫:
同樣要注意規(guī)則格嘁。
4.小技巧
一般來說我們是沒法截獲release版本的apk的log數(shù)據(jù)的笛求,但是我們自己寫的那部分代碼是可以在運(yùn)行時(shí)是可以看到log的,可以幫助我們調(diào)試程序糕簿。
另外一定要把編譯簽名安裝的幾個(gè)命令寫為一個(gè)腳本探入,方便安裝調(diào)試,不然每次去敲幾個(gè)命令很麻煩懂诗,即使有命令記錄當(dāng)需要多次調(diào)試時(shí)也很麻煩蜂嗽。
總結(jié)
本文中需要重要掌握的是R文件的生成規(guī)則,smali的基礎(chǔ)語法殃恒,只用掌握的基本知識(shí)才能在碰到問題時(shí)快速定位問題植旧,解決問題。github地址:https://github.com/wutongke/Apktool_Test
推薦閱讀: