100天精通Andriod逆向——第6天:Andriod 开发入门
Posted Amo Xiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天精通Andriod逆向——第6天:Andriod 开发入门相关的知识,希望对你有一定的参考价值。
目录
学习逆向也需要具备一定的开发知识,是否做过开发决定你一定程度逆向的上限
本小节简单了解一个 andriod app 是如何诞生的
前置知识:https://blog.csdn.net/xw1680/article/details/126117653
一、创建 android 应用程序
Android Studio 安装完成后,如果还没有创建项目,将进入到欢迎对话框。在该对话框中,可以创建新项目、打开已经存在的项目、导入项目等。在 Android Studio 中,一个 project(项目) 相当于一个工作空间,一个工作空间中可以包含多个 Module(模块),每个 Module 对应一个 Android 应用。下面将通过一个具体的实例来介绍如何创建项目,即创建第一个 Android 应用。
说明:在首次创建项目时,需要联网加载数据,所以此时需要保证电脑可以正常连接互联网。
1.1 在屏幕上输出文字 Hello World
在 Android Studio 中创建项目,名称为 第一个 Android 应用
,具体步骤如下:
1、在 Android Studio 的欢迎对话框中,单击 New Project 按钮
2、进入选择创建 Activity 类型对话框,在该对话框中,将列出一些用于创建 Activity 的模板,我们可以根据需要进行选择,也可以选择不创建 Activity(即选择 Add No Activity),这里我们选择创建一个空白的 Activity,即 Empty Activity,如下图所示:
3、在下图所示的 New Project
界面中输入以下内容:
- Name(应用名称):FirstAndroidProject 应用名称将显示在系统的程序组界面中,此处命名为:FirstAndroidProject
- Package name(包名称):com.amoxiang.firstandroidproject,包名称可以采用默认值,也可以自己重新命令,一般为
com.****.****
的格式 - Save location(存储路径):E:\\Code\\andriod_project\\FirstAndroidProject 存储路径为项目文件的存储位置
- Language(开发语言):开发语言默认为 Kotlin(Kotlin 是简化的 Java 表达形式),在新版本的 Android Studio 中,Google 推荐使用 Kotlin 作为 Android 的开发语言,新手建议选择 Java 作为开发语言,这里选择 Java
- Minimum SDK(最低运行版本):最低运行版本根据需要选择,表明当前应用运行的最低 Android 版本要求;其他参数可以采用默认值。最后单击
Finish
按钮完成应用项目的创建。
单击 Finish 按钮,将显示下图所示的创建进度对话框(第一次加载时间可能会比较长,请耐心等待),创建完成后,该对话框自动消失,同时打开该项目。
4、同步完成后,默认显示 MainActivity.java 文件的内容,如下图所示:
说明:在使用 Android Studio 创建一个项目时,默认会创建一个名称为 app
的 Module(一个 Module 就是一个 Android 应用),展开 app
结构如下图所示:
说明:在使用 Android Studio 创建过一个项目后,再次创建项目时,需要在已经打开的项目中,选择 File →New→ New Project 菜单项,打开创建新项目对话框,如下图所示:
二、Android 项目结构
在 Android Studio 中,提供了下图所示的多种项目结构类型:
其中,最常用的是 Android 和 Project。由于 Android 项目结构类型是创建项目后默认采用的,所以这里我们就使用这种结构类型。
2.1 manifests 节点
manifests 节点用于显示 Android 应用程序的配置文件。通常情况下,每个 Android 应用程序必须包含一个 AndroidManifest.xml
文件,位于 manifests 节点下。它是整个 Android 应用的全局描述文件。在该文件内,需要标明应用的名称、使用图标、Activity 和 Service 等信息,否则程序不能正常启动。例如,第一个Android应用
中的 AndroidManifest.xml
文件代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.amoxiang.firstandroidproject">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.FirstAndroidProject"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
AndroidManifest.xml 文件中的重要元素及说明如下表所示:
元素 | 说明 |
---|---|
manifest | 根节点,描述了 package 中所有的内容 |
xmlns:android | 包含命名空间的声明,其属性值为 http://schemas.android.com/apk/res/android,表示 Android 中的各种标准属性能在该 xml 文件中使用,它提供了大部分元素中的数据 |
package | 声明应用程序包 |
application | 包含 package 中 application 级别组件声明的根节点,一个 manifest 中可以包含零个或者一个该元素 |
android:icon | 应用程序图标 |
android:label | 应用程序标签,即为应用程序指定名称 |
android:theme | 应用程序采用的主题,例如,第一个 Android 应用 创建的项目默认采用 @style/Theme.FirstAndroidProject |
activity | 与用户交互的主要工具,它是用户打开一个应用程序的初始页面 |
intent-filter | 配置 Intent 过滤器 |
action | 组件支持的 Intent Action |
category | 组件支持的 Intent Category,这里通常用来指定应用程序默认启动的 Activity |
注意:在 Android 程序中,每一个 Activity 都需要在 AndroidManifest.xml 文件中有一个对应的 <activity> 标记。
2.2 java 节点
java 节点用于显示包含了 Android 程序的所有包及源文件(.java),例如, 第一个Android应用
项目的 java 节点展开效果如下图所示:
默认生成的 MainActivity.java 文件的关键代码如下:
package com.amoxiang.firstandroidproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
从上面的代码可以看出,Android Studio 创建的 MainActivity 类默认继承自 AppCompatActivity 类(继承自 AppCompatActivity 类的 Activity 将带有 Action Bar),并且在该类中,重写了 Activity 类中的 onCreate() 方法,在 onCreate() 方法中通过 setContentView(R.layout.activity_main) 方法设置当前的 Activity 要显示的布局文件。
说明:这里使用 R.layout.activity_main 来获取 layout 目录中的 activity_main.xml 布局文件,这是因为在 Android 程序中,每个资源都会在 R.java 文件中生成一个索引,而通过这个索引,开发人员可以很方便的调用 Android 程序中的资源文件。
应用 Android Studio 创建的项目,R.java 文件位于新创建应用的
<应用名称>build\\generated\\source\\r\\debug\\<包路径> 目录下
R.java 文件是只读文件,开发人员不能对其进行修改,当 res 包中资源发生变化时,该文件会自动修改。
2.3 res 节点
该节点用来显示保存在 res 目录下的资源文件,当 res 目录中的文件发生变化时,R 文件会自动修改。在 res 目录中还包括一些子目录,下面将对这些子目录进行详细说明。
1、drawable子目录。 drawable 子目录通常用来保存图片资源(如 PNG\\JPEG\\GIF图片、9-Patch 图片或者 Shape 资源文件等)
2、layout子目录。 layout 子目录主要用来存储 Android 程序中的布局文件,在创建 Android 程序时,会默认生成一个 activity_main.xml 布局文件。例如,第一个Android应用
项目的 layout 子目录的结构如下图所示:
在 Android Stuido 中打开 activity_main.xml 布局文件的代码如下图所示:
activity_main.xml 布局文件中的重要元素及说明如下表所示:
元 素 | 说 明 |
---|---|
ConstraintLayout | 布局管理器 |
xmlns:android | 包含命名空间的声明,其属性值为 http://schemas.android.com/apk/res/android,表示 Android 中的各种标准属性能在该 xml 文件中使用,它提供了大部分元素中的数据,该属性一定不能省略 |
xmlns:tools | 指定布局的默认工具 |
android:layout_width | 指定当前视图在屏幕上所占的宽度 |
android:layout_height | 指定当前视图在屏幕上所占的高度 |
TextView | 文本框组件,用来显示文本 |
android:text | 文本框组件显示的文本 |
技巧:开发人员在指定各个元素的属性值时,可以按下 <Ctrl+Alt + Space>
快捷键来显示帮助列表,然后在帮助列表中选择系统提供的值,如下图所示:
另外,Android Studio 提供了可视化的布局编辑器来辅助用户开发布局文件,如下图所示。在该编辑器内,可以通过拖动组件实现界面布局。
3、mipmap子目录。 mipmap 子目录用于保存项目中应用的启动图标。为了保证良好的用户体验,需要为不同的分辨率提供不同的图片,并且分别存放在不同的目录中。通常情况下,Android Studio 会自动创建 mipmap-xxxhdpi(超超超高)、mipmap-xxhdpi(超超高)、mipmap-xhdpi(超高)、mipmap-hdpi(高) 和 mipmap-mdpi(中) 等5个目录,分别用于存放超超超高分辨率图片、超超高分辨率图片、超高分辨率图片、高分辨率图片和中分辨率图片。并且会自动创建对应5种分辨率的启动图标文件(ic_launcher.webp) 以及 mipmap-anydpi-v26 目录中的两个自适应图标文件,如下图所示:
说明:由于从 android 7.1.1 开始系统中应用图标为圆形图标,所以为了让其他版本的系统正常使用高版本开发的应用。mipmap 子目录中将自动生成圆形与方形两种图标。
4、values子目录。 values 子目录通常用于保存应用中使用的字符串、样式和颜色资源。例如,第一个Android应用
的 values 子目录的结构如下图所示:
在开发国际化程序时,这种方式尤为方便。strings.xml 文件的代码如下:
<resources>
<string name="app_name">FirstAndroidProject</string>
<!-- <string name="app_name">第一个Android应用</string>-->
</resources>
2.4 Gradle Scripts
Gradle Scripts 文件夹中主要是项目的编译配置脚本文件,主要包含以下文件:
- build.gradle:该文件分为项目级和模块级两种,用于描述工程的编译规则。
- proguard-rules.pro:用于描述 java 文件的代码混淆规则。
- gradle.properties:用于配置编译工程的命令行参数,一般无须改动。
- settings.gradle:配置哪些模块在一起编译。初始内容为
include ':app'
,表示只编译app模块。 - local.properties:项目的本地配置,一般无须改动。该文件是在工程编译时自动生成的,用于描述开发者本机的环境配置,如SDK的本地路径、NDK的本地路径等。
三、使用 Android 模拟器
Android 模拟器是 Google 官方提供的一款运行 Android 程序的虚拟机,可以模拟手机/平板电脑等设备。作为 Android 开发人员,不管你有没有基于 Android 操作系统的设备,都可能需要在 Android 模拟器上测试自己开发的 Android 程序。
说明:AVD 是 Android Virtual Device 的简称。通过它可以对 Android 模拟器进行自定义的配置,能够配置 Android 模拟器的硬件列表、模拟器的外观、支持的 Android 系统版本、附加 SDK 库和存储设置等。开发人员配置好 AVD 以后就可以按照这些配置来模拟真实的设备。
由于启动 Android 模拟器需要配置 AVD,所以在运行 Android 程序之前,首先需要创建 AVD。创建 AVD 并启动 Android 模拟器的步骤如下:
1、单击 Android Studio 工具栏
图标,显示 AVD 管理器对话框,如下图所示:
2、单击 Create Virtual Device… 按钮,将弹出 Select Hardware
对话框,在该对话框中,选择想要模拟的设备。例如,如果我们要模拟 3.2寸HVGA
的设备,那么可以选择 32" HVGA slider(ADP1)
,如下图所示:
3、单击 Next 按钮,将弹出选择系统镜像对话框,在该对话框中,下载系统镜像,如下图所示,这里选择它即可。
说明:如果没有可选择的系统镜像,也可以单击 Download 下载需要的其他版本的系统镜像
4、单击 Next 按钮,将弹出验证配置对话框,在该对话框的 AVD Name 文本框中输入 AVD 名称,这里设置为 Pixel1,其他采用默认,如下图所示:
5、单击 Finish 按钮,完成 AVD 的创建。AVD 创建完成后,将显示在 AVD Manager 对话框中,如下图所示:
说明:在上图所示的 AVD Manager 对话框中,单击右三角按钮,可以启动 AVD;单击按钮铅笔,可以编辑当前 AVD 的配置信息;单击按钮下三角,将弹出下图所示的快捷菜单,通过该菜单可以实现查看 AVD 的详细配置、删除 AVD 或者停止已经启动的模拟器等操作;单击按钮 create…,可以再创建新的AVD。
6、单击右三角按钮,即可启动 AVD。第一次启动将显示如下图所示界面:
四、运行 Android 应用
创建 Android 应用程序后,还需要运行查看其显示结果。要运行 Android 应用程序,可以有两种方法,一种是通过 Android 提供的模拟器来运行应用;另一种是在电脑上连接手机,然后通过该手机来运行应用。
4.1 使用模拟器运行 Android 应用
使用模拟器来运行 Android 应用适用于没有 Android 手机,或者测试各系统版本下应用的兼容性的情况。在 Android Studio 中,通过模拟器运行 第一个Android应用
的具体步骤如下:
1、启动模拟器
2、在工具栏中找到 app 下拉列表框,选择要运行的应用(这里为app)
3、再单击右侧右三角的按钮,启动模拟器,并运行程序。启动完毕后,在模拟器中将显示刚刚创建的应用,运行效果如下图所示:
4.2 连接手机运行 Android 应用
接下来我们学习如何连接手机运行 Android 应用。该方法更加符合用户场景,易于发现一些与硬件有关的问题,但是一般手机的系统很难与最新的 SDK 版本统一,所以对于一些 SDK 的新特性还是需要使用模拟器测试。
通过手机来运行 第一个Android应用
,具体步骤如下:
1、将 Android 系统的手机通过 USB 连接线连接到电脑上
2、开启 USB 调试。对于不同的手机,显示的是否允许 USB 调试的方式可能不同,只要根据自己的手机提示进行选择就可以
3、返回到 Android Studio 中,在工具栏中,找到 app 下拉列表框,然后单击要运行的项目(这里为app),选中表格中显示的已经运行的 Google Pixel 手机,再单击 右三角
运行按钮,即可在手机上运行该应用。
4、项目运行后,在手机上将显示运行效果,如下图所示:
五、Android 应用程序的调试
Android Studio 窗口包含了 Terminal、Build、Logcat 等视图,在窗口底部可以进行视图切换。其中, Terminal 视图用于在命令行方式下执行 Android 平台提供的一些命令;Build 视图用于查看项目的编译和构建信息;Logcat 视图用于查看 Android 设备运行的日志信息。
5.1 Logcat 视图
在开发过程中会遇到各种各样的问题,需要开发人员耐心调试。一般程序错误可以使用 Android Studio 中的 Logcat 视图查看错误,例如前面创建的程序,如果将 onCreate() 方法修改成如下代码:
package com.amoxiang.firstandroidproject; //指定包
//导入AppCompatActivity类
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;// //导入Bundle类
public class MainActivity extends AppCompatActivity
//该方法在创建Activity时被回调,用于对该Activity执行初始化
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Object object = null; //新添加的第1行代码
object.toString();//新添加的第2行代码
setContentView(R.layout.activity_main);
同 Java 语言一样,这段代码在运行时会发生 NullPointException 异常。启动程序在手机运行时,可在 Logcat 视图中查看错误语句及原因,如下图所示:
5.2 使用 Log 日志信息
Android SDK 提供了 Log 类来获取程序运行时的日志信息,该类位于 android.util
命名空间中。Log 类提供了一些方法,用来输出日志信息,如下表所示。
开发人员可以使用这些方法输出程序的中间结果,输出的信息可在 Logcat 视图中查看。
5.3 使用断点调试
使用 Logcat 视图输出信息的方式调试程序是非常古老的程序调试方法,而且经常导致程序代码混乱,所以建议使用 Android Studio 内置的 Java 调试器调试 Android 程序。使用 Java 调试器可以设置程序断点,实现程序单步执行,在调试过程中执行查看变量和表达式的值等调试操作。Android 程序与一般的 Java 程序的调试方法基本相同,这里不再赘述。
以上是关于100天精通Andriod逆向——第6天:Andriod 开发入门的主要内容,如果未能解决你的问题,请参考以下文章
100天精通Andriod逆向——第2天:Android基础知识和jadx的使用
100天精通Andriod逆向——第2天:Android基础知识和jadx的使用
100天精通Andriod逆向——第5天:app逆向流程简介
100天精通Andriod逆向——第5天:app逆向流程简介