2.1 Android 相关基础介绍
2.1.1 系统架构
Linux内核层
HAL硬件抽象层
系统运行库层
第一部分:与标准Linux中一样的使用C/C++编写的原生库文件
包括提供媒体库支持的libopengl.so,提供数据库存储功能的libsqlite3.so
第二部分:Android特有的使用C/C++编写的原生库文件
类似于Java中的JVM,被称为Android Runtime
在系统运行过程中,每一个APP进程都有一个自己的Android Runtime实例,用于支持所有Java相关代码的加载与执行
应用框架层
相当于Linux层级的so文件,用于给Android的Java层提供API支持
应用层
App所在的层级,包括系统自带的应用(称为系统应用)以及后续用户自己所安装的应用(称为普通应用)
2.1.2 Android 四大组件
活动(Activity)
可以理解为界面,一个Activity就是一个界面
服务(Service)
相当于Windows上的一个后台进程
广播接收器(Broadcast Receiver)
用于响应来自其他应用程序或者系统的广播消息
内容提供者(Content Provider)
用于进程间的交互,通常通过请求从一个应用程序向其他应用程序提供数据
2.2 从 Hello World 开始了解 Android 的开发流程
2.2.1 第一行代码 Hello World 的开发流程
新建项目
配置项目名称、包名、保存路径、语言和最低支持的SDK版本
Android Studio 工具栏 点击▶️ 运行APP(Shift+F10)
2.2.2 Hello World 分析和完善
修改
activity_main.xml
视图文件将TextView控件修改改成Button控件,并给这个控件分配一个id,代号为check
修改前后的
activity_main.xml
对比<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> - <TextView + <Button + android:id="@+id/check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
修改
MainActivity.java
代码文件修改前后的
MainActivity.java
对比package com.cnlnn.demo01; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 调用父类的onCreate()函数 setContentView(R.layout.activity_main); // 调用setContentView()函数加载了在src/main/layout目录下定义的activity_main.xml作为MainActivity对应的界面;一个Activity就是一个界面,R.layout.activity_main是activity_main.xml文件的唯一标志id + Button bt_check = findViewById(R.id.check); // 通过findViewByID()函数将按钮控件与bt_check变量绑定;R.id是前缀,check是刚才在界面描述文件中定义的id + bt_check.setOnClickListener(new View.OnClickListener() { // 添加点击事件响应 + @Override + public void onClick(View v) { + Log.i("cnlnn", "Hello world from bt_check") // Log是日志打印类;调用Log.i()函数打印日志,第一个参数为日志标签,第二个参数为日志内容 + } + }); } }
2.3 安卓逆向过程中的常用命令
2.3.1 常用Linux命令介绍
- cat
- touch和echo
- grep
- ps
- netstat
- lsof
- top
2.3.2 Android特有的adb命令介绍
查看当前处于前台的Activity
adb shell dumpsys activity top
查看包信息(包括四大组件信息以及MINE等相关信息)
adb shell dumpsys package 包名
查看App使用的数据库信息(包括执行操作的查询语句等信息都会被打印出来)
adb shell dbinfo 包名
截图
adb shell screencap -p 路径
在屏幕选中的输入框内输入文字(不支持中文)
adb shell input text 文字
pm命令
adb shell pm 命令
Android中packageManager的命令行,用于管理package的命令,示例:
列出所有安装的apk包名
adb shell pm list packages
安装apk文件
adb shell pm install 手机存储中的apk安装包路径
am命令
adb shell am 命令
am命令是一个重要的调试工具,主要用于启动或停止服务、发送广播、启动Activity等,示例:
以Debug模式启动App
adb shell am start-activity -D -N 包名/类名
将电脑的apk安装到手机
adb install 电脑中的apk安装包路径
从电脑推送文件到手机
adb push 电脑中的文件路径 手机中的目录路径
从手机获取文件到电脑
adb pull 手机中的文件路径 电脑中的目录路径
查看Android中日志的输出
adb logcat
参考文章
平台架构 | Android 开发者 | Android Developers
转载请注明来源,欢迎对文章中的引用来源进行考证,文章可能具有时效性,欢迎指出任何有错误、已失效或不够清晰的表达 ,可通过[邮件](mailto:cnlnnn@qq.com)联系垃圾堆主人