1、apktools
apktool.jar apktool.bat
#apktool.bat d app.apk //反編譯apk,在當前目錄生成app文件夾
可以修改res/ smali/文件,主要針對layout等xml
#apktool.bat b -o out/app1.apk //重新生成apk,沒有經過簽名
#系統簽名
java -jar signapk.jar platform.x509.pem platform.pk8 ppt1.apk SignApk/ppt1.apk
2、dex2jar-2.0、jd-gui-windows-1.4.0
#d2j-dex2jar.bat classes.dex //當前目錄生成classes-dex2jar.jar
jd-gui.exe 打開classes-dex2jar.jar
通過觀察classes-dex2jar.jar裏面某個class,對應apktool反編譯出來的smali,這時修改該smali文件,然後重新rebuild。
setTextSize(15.0F)
.line 134
const/high16 v2, 0x41700000 # 15.0f
invoke-virtual {v1, v2}, Landroid/widget/Button;->setTextSize(F)V
Bitmap bmp_old = BitmapFactory.decodeResource(getResources(), R.drawable.himi_old);
RectF rectf_old_two = new RectF(0, 50, bmp_old.getWidth() * 2, 120 + bmp_old.getHeight() * 2);
canvas.drawBitmap(bmp_old, null, rectf_old_two, paint);
給定一個相同的資源ID,在不同的設備配置之下,查找到的可能是不同的資源。
這個查找過程對應用程序來說,是完全透明的,這個過程主要是靠Android資源管理框架來完成的,而Android資源管理框架實際是由AssetManager和Resources兩個類來實現的。其中,Resources類可以根據ID來查找資源,而AssetManager類根據文件名來查找資源。事實上,如果一個資源ID對應的是一個文件,那麼Resources類是先根據ID來找到資源文件名稱,然後再將該文件名稱交給AssetManager類來打開對應的文件的。
Resources.arsc://decodeResourcesFull
而Resources.arsc這個文件是存放在APK包中的,他是由AAPT工具在打包過程中生成的,他本身是一個資源的索引表,裏面維護者資源ID、Name、Path或者Value的對應關係,AssetManager通過這個索引表,就可以通過資源的ID找到這個資源對應的文件或者數據。
可以看到每個資源文件在R中都是一個class,每個資源項名稱都分配了一個id,id值是一個四字節無符號整數,格式是這樣的:0xpptteeee,(p代表的是package,t代表的是type,e代表的是entry),最高字節代表Package ID,次高字節代表Type ID,後面兩個字節代表Entry ID。
根據資源的id值定位resources.arsc中的數據:
aapt d resources XXX.apk
resource <Resource ID> <Package Name>:<Type>/<Name>: t=<DataType> d=<Data> (s=<Size> r=<Res0>)
Resource ID R.java中的資源ID
Package Name 資源所在的的包
Type 資源的類型
Name 資源名稱
DataType 數據類型,按照以下枚舉類型取值
Data 資源的值,根據dataType進行解釋
Size 一直爲0x0008
Res0 固定爲0x00
classes.dex //decodeSourcesSmali
與Resources.arsc類似,有methods,field等