安卓逆向(一)

四大组件

Activity

生命周期

四种启动模式

四种模式可以在清单文件的节点下通过android:launchMode来进行配置

  1. standard模式:在这种模式下,activity默认会进入启动它的activity所属的任务栈中,这也是默认的一种模式
  2. singleTop模式:栈顶复用模式。如果新acitivty 位于任务的栈顶的时候,activity不会被重新创建,同时它的onNewIntent方法会被回调
  3. singleTask模式:栈内复用模式。只要activity在一个栈中存在,那么多次启动此activity不会被重新创建单例,系统会回调onNewIntent。这种模式可以称为单例模式,只会存在一种,有则直接从栈中调用,没有则创建并且压入栈中
  4. singleInstance模式:单实例模式。这种模式的activity只能单独的位于一个任务栈中,这种与singleTask有点类似,其实也是有则直接调用,没有则创建并且放入栈中,只不过singleTask是可以和其他的Activity放在同一个栈中,singleInstance则是只会将创建的Activity放在一个栈中,并且这个栈中只会有这一个Activity实例

Service

通过start方法开启服务

  • 创建一个类继承Service
public class MyService extends Service{
    public MyService(){
        
    }
    
    @Override
    public IBinder onBind(Intent intent){
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
  • 在清单文件中注册这个服务

    <service
             android:name=".MyService"
             android:enabled="true"
             android:exported="true">
    </service>
    
  • 通过startService方法启动服务

    Intent intent = new Intent(this,MyService.class);
    startService(intent);
    
  • 当不用服务的时候通过stopService()方法停止该服务

    stopService(intent);
    

特点:通过start方法启动的service一旦服务开启就跟调用者(开启者)没有任何关系了,开启者退出了,开启者挂了,服务还在后台长期的运行,开启者不能调用服务里面的方法。

通过bind的方式启动服务

  • 创建一个类继承Service

    public class MyService extends Service{
        public MyService(){
            
        }
        
        @Override
        public IBinder onBind(Intent intent){
            throw new UnsupportedOperationException("Not yet implemented");
        }
    }
    
  • 在清单文件中注册这个服务

    <service
             android:name=".MyService"
             android:enabled="true"
             android:exported="true">
    </service>
    
  • 通过bindService方法启动服务

    Intent intent = new Intent(this,MyService.class);
    bindService(Intent,ServiceConnection,int);
    
  • 当不用服务的时候通过unbindService()方法停止该服务

    unbindService(ServiceConnection);
    

    特点:使用bind方法启动的服务,调用者挂了,服务也挂了,调用者可以调用服务中的方法

BroadcastReceiver

无序广播

无序广播是完全异步的,在同一时刻在逻辑上是能够被所有的接收者接收到的,传递的效率高,缺点是接收者不能处理结果传给下个接收者,并且服务终止广播的传播

Context.sendBroadcast()

广播的生命周期就是在处理完onReceive时,系统将认定他不是一个活动的对象了,就是杀掉他,由于广播的生命周期很短,所以不建议在onReceive中执行一些耗时操作

创建一个广播的步骤:

  • 创建一个类继承BroadcastReceiver,并且重写其onReceive方法

    public class MyBroadcastReceiver extends BroadcastReceiver{
        
        @Override
        public void onReceive(Context context,Intent intent){
            if(intent.getAction().equals("test")){
                
            }
        }
    }
    
  • 在清单文件中注册(静态注册)

    <receiver android:name=".broadcast.MyBroadcastReceiver">
    	<intent-filter>
        	<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
            <action android:name="test"/>
        </intent-filter>
    </receiver>
    

    或者动态注册

    registerReceiver(new MyBroadcastReceiver(),new IntentFilter("test"));
    
  • 加上权限

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    
  • 发送广播

    Intent intent = new Intent("test");
    sendBroadcast(intent);
    

有序广播

ContentProvider

主要的作用是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。

dalvik

dalvik字节码

  1. dalvik寄存器

    32位,64位时使用两个相邻的寄存器存储

  2. 寄存器的命名法

    • v命名:

      • 局部变量寄存器:v0-vn
      • 参数寄存器:vn-vn+m
    • p命名:

      • 参数寄存器 p0 - pn
      • 变量寄存器 v0 - vn
  3. dex文件反汇编工具

    .java编译成.class再编译成.dex 最后反编译得到samli文件

    ​ .java -> .class -> .dex -> .samli

    • dx.jar将.class打包成.dex

      ​ 命令:dx --dex --output=./xxx.class

    • Baksmali.jar将.dex反编译成smali

      ​ 命令:java -jar baksmali.jar.smali打包成.dex -o smali out/ classes.dex

    • Smali.jar将.smali打包成.dex

      ​ 命令:java -jar smali.jar smali out/ -o classes.dex

  4. dalvik字节码类型

    Dalvikjava
    Bbyte
    Cchar
    Sshort
    Iint
    Jlong
    Ffloat
    Ddouble
    Zboolean
    Vvoid
    Ljava 类类型
    [数组类型
  5. 字段

    字段格式:类型(包名+类名)->字段名称+字段类型

  6. 方法

Lpackage/name/ObjectName;->MethodName(Ⅲ)Z

(Ⅲ)Z:这部分表示的是方法的签名信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值