adb 命令的使用
先通过usb或者wifi连接真机,推荐用usb
# 安卓设备列表
adb devices
adb devices 显示device unauthorized
adb kill-server
adb start-server
# 进入安卓shell
adb shell
# 安卓日志
adb logcat
adb logcat -s keyword
#把文件推送进安卓设备
adb push
#打印AndroidManifest.xml
#adb shell dumpsys activity top
#adb shell dumpsys package packagename
adb install XXX.apk
adb uninstall packagename
#拉取安卓文件到本地
adb pull android-path local-path
#推送本地文件到安卓
adb push local-path android-path
adb shell pm clear package_name
网易模拟器 adb connect 127.0.0.1:7555
smlia基本语法
# smali常用语法
.field private isFlag:z 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 12 此方法位于第12行
invoke-super 调用父函数
const/high16 v0, 0x7fo3 把0x7fo3赋值给v0
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
条件跳转分支:
"if-eq vA, vB, :cond_**" 如果vA等于vB则跳转到:cond_**
"if-ne vA, vB, :cond_**" 如果vA不等于vB则跳转到:cond_**
"if-lt vA, vB, :cond_**" 如果vA小于vB则跳转到:cond_**
"if-ge vA, vB, :cond_**" 如果vA大于等于vB则跳转到:cond_**
"if-gt vA, vB, :cond_**" 如果vA大于vB则跳转到:cond_**
"if-le vA, vB, :cond_**" 如果vA小于等于vB则跳转到:cond_**
"if-eqz vA, :cond_**" 如果vA等于0则跳转到:cond_**
"if-nez vA, :cond_**" 如果vA不等于0则跳转到:cond_**
"if-ltz vA, :cond_**" 如果vA小于0则跳转到:cond_**
"if-gez vA, :cond_**" 如果vA大于等于0则跳转到:cond_**
"if-gtz vA, :cond_**" 如果vA大于0则跳转到:cond_**
"if-lez vA, :cond_**" 如果vA小于等于0则跳转到:cond_**
APK加载流程
Davlivk虚拟机(安卓里处理dex的虚拟机)加载dex文件
Java层Dex加载流程:
BootClassLoader —> PathClassLoader ----> DexClassLoader(通常在这步hook)
Native层(java层框架的底层和硬件进行交互,C写的)Dex加载流程:
libdvm.so (是Davlivk虚拟机里一个很重要的文件 编译 system.img)
OpenDexFileNative(libdvm.so里一个很重要的做解析加载的函数)
点击图标后,app加载流程
(PS:首先application实现的方法是attachBaseContext,后面才是onCreate)
APP四大组件
1、Activity:
一个Activity通常就是一个界面
<activity android:name="">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
2、Service:
后台服务,播放音乐,数据处理等
3、Broadcase receiver
异步接收广播
4、Content provider:
内容共享