關于Dalvik
Dalvik 是 Google 公司自己設計用于 Android 平臺的虛擬機佑惠。它可以支持已轉換為 dex(即Dalvik Executable)格式的Java應用程序的運行齐疙,dex格式是專為Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統(tǒng)贞奋。Dalvik 經過優(yōu)化,允許在有限的內存中同時運行多個虛擬機的實例轿塔,并且每一個 Dalvik 應用作為一個獨立的 Linux 進程執(zhí)行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉勾缭。
什么是smali
smali 基礎語法.xmind下載
Smali 和 Baksmali 分別是指 Android 虛擬機(Dalvik)所使用的一種.dex格式文件的匯編器,反匯編器俩由。
下載地址:https://bitbucket.org/JesusFreke/smali/downloads/?tab=downloads
反編譯dex
java -jar baksmali-2.2.1.jar d classes.dex
回編譯smail
java -jar smali-2.2.1.jar a out
smali文件的基本格式
每個smali 文件頭3行描述基本信息
.class <訪問權限> [修飾關鍵字] <類名>
.super <父類名>
.source <源文件名>
如下面的Demo
.class public Lcom/example/demo/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"
第一行“.class” 指定當前的類名 ,類名表示類似于 jni 技術的類
第二行“.super” 指定父類
第三行“.source” 指定當前類的源文件名兜畸,混淆后可能沒有值
如果類實現過接口
# interfaces
.implements Landroid/view/View$OnClickListener;
屬性
- 靜態(tài)屬性
# static fields
.field <訪問權限> static [修飾關鍵字] <字段名>:<字段類型>
"#"開頭為注釋,“.field” 后面的訪問權限為public膳叨、private、protected之一菲嘴,修飾關鍵字為 final... ,字段名與字段類型使用冒號“:”分隔,類似swift的變量聲明語法
var str:String = "hello"
具體示例
# static fields
.field private static final TAG:Ljava/lang/String; = "Activity"
實例屬性
# instance fields
.field <訪問權限> static [修飾關鍵字] <字段名>:<字段類型>
與靜態(tài)屬性相比少了static 關鍵字
方法
# direct methods
.method <訪問權限> [修飾關鍵字] <方法原型>
<.locals>
[.parameter]
[.prologue]
[.line]
<代碼體>
.end method
“.locals” 表示局部變量的個數
“.parameter” 方法的參數龄坪,肯存在多條
“.prologue” 代碼的開始處,混淆的代碼可能去掉改條
“.line” 知道在源代碼中的行號
虛方法在起始的注釋為“virtual methods”
- 靜態(tài)方法
.method public static getString()Ljava/lang/String;
.locals 1
.prologue
.line 58
const-string v0, ""
return-object v0
.end method
- 內部類
文件名 ”[外部類名]$[內部類名].smali“
匿名內部類 ”[外部類名]$[數字].smali“
AS中使用smali 進行調試步驟如下
1 安裝最新的 smaliidea 插件 https://github.com/JesusFreke/smali/wiki/smalidea
2健田、修改 AndroidManifest.xml 文件設置 android:debuggable="true"
3、反編譯 apk
apktool d demo.apk
- 4妓局、 重打包 重簽名
apktool d demo.apk
jarsigner -verbose -keystore demo.keystore -storepass 123456 -keypass 123456 -signedjar demo.-signed.apk demo.apk lesliekeystore
- 5 也可以用 signapk.jar 簽名
java -jar signapk.jar .testkey.x509.pem testkey.pk8 my.apk my_signed.apk
- 6、添加 Remote 調試
- 7局雄、debug 模式啟動應用
//adb shell am start -D -n packagename/ MainActivity存炮。
adb shell am start -D -n com.example.demo/.MainActivity
8炬搭、通過DDMS中的pid查看應用所在進程宫盔。
如果不用 DDMS可以通過adb shell執(zhí)行ps | grep packagename
命令查看pid。9灼芭、 端口轉發(fā)拿到進程 ID
adb forward tcp:8700 jdwp:pid
//如果DDMS開啟狀態(tài)般又,請關閉彼绷,否則會報錯倒源。
//2375是自己配的
adb forward tcp:5005 jdwp:2375
下面就可以設置斷點開始調試了
Android Studio調試環(huán)境的配置
- 1 將smali目錄(或在smali建一級父目錄后將該目錄導入)句狼,選擇Import Project(Eclipse ADT, Gradle)后選擇Create project from existing sources,一路Next腻菇。
- 2 成功導入工程后右鍵點擊 src 目錄,設定 Mark Directory As --> Sources Root昔馋。
- 3 配置遠程調試的選項,選擇 Run -->Edit Configurations糖耸,增加一個Remote調試的調試選項,端口選擇:8700邦危。
- 4 選擇File -->Project Structure 配置JDK。