對某日頭條apk的反編譯和二次打包(二)

前一篇對某日頭條apk 的反編譯和二次打包介紹了Apk的反編譯和二次打包的流程,打包的apk使得其意見反饋按鈕失效。這片文章在此基礎(chǔ)上創(chuàng)建新的界面,點(diǎn)擊意見反饋之后進(jìn)入到自己創(chuàng)建的一個自定義的空調(diào)控制界面,在代碼修改層面更有參考意義。這里只是演示效果,不探討界面功能,其中這個自定義的空調(diào)界面是郭霖公眾號里介紹的一篇文章自定義View實(shí)戰(zhàn):空調(diào)遙控器,對自定義View的學(xué)習(xí)很有幫助,另外安利一下郭霖的公眾號,每天都有干貨。

demo apk 下載地址apk下載

工具

對某日頭條apk 的反編譯和二次打包文中介紹過的工具這里不再介紹。本文中主要用到了Android studio中的插件:java2smali,可以在android studio中搜索到,其功能是可以直接把java代碼編譯為smali,方便二次打包。

目標(biāo)

在某日頭條的apk中插入一個界面代碼,在其設(shè)置界面中點(diǎn)擊意見反饋進(jìn)入我們自己創(chuàng)建的界面。效果如下,點(diǎn)擊意見反饋進(jìn)入一個新的空調(diào)控制界面:

步驟

1. java到smali的轉(zhuǎn)變

在android studio中寫完代碼以后,github代碼地址有代碼,使用java2smali生成代碼的smali版本:

其中包括AirMoveView和DrawActivity兩個java文件的smali版本

由于匿名內(nèi)部類的原因,每個java文件生成了兩個smali文件。

2. Smali文件的修改

android反編譯-smali語法文中介紹了smali的語法,smali中的每個變量均使用路徑加類名的方式,因此我們需要修改相關(guān)的路徑。本文中把smali文件放置在com/ss/android/article/base/feature/mine/路徑下,與BaseSettingActivity放在同一個路徑。修改四個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是一個4字節(jié)的無符號整數(shù),其中,最高字節(jié)表示Package ID,次高字節(jié)表示Type ID,最低兩字節(jié)表示Entry ID。

Package ID相當(dāng)于是一個命名空間,限定資源的來源。Android系統(tǒng)當(dāng)前定義了兩個資源命令空間,其中一個系統(tǒng)資源命令空間,它的Package ID等于0x01,另外一個是應(yīng)用程序資源命令空間,它的Package ID等于0x7f。所有位于[0x01, 0x7f]之間的Package ID都是合法的,而在這個范圍之外的都是非法的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等等若干種,每一種都會被賦予一個ID。

Entry ID是指每一個資源在其所屬的資源類型中所出現(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)試程序。

另外一定要把編譯簽名安裝的幾個命令寫為一個腳本,方便安裝調(diào)試,不然每次去敲幾個命令很麻煩,即使有命令記錄當(dāng)需要多次調(diào)試時(shí)也很麻煩。

總結(jié)

本文中需要重要掌握的是R文件的生成規(guī)則,smali的基礎(chǔ)語法,只用掌握的基本知識才能在碰到問題時(shí)快速定位問題,解決問題。github地址:https://github.com/wutongke/Apktool_Test

推薦閱讀:

對某日頭條apk 的反編譯和二次打包

對某日頭條apk的反編譯和二次打包(二)

對某日頭條apk的反編譯和二次打包(三)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容