前言:
为了学好Android逆向以及搞一个属于自己的apk后门,笔者决定从开发入手,参考书籍为《第一行代码》(第二版),因为第三版中使用的是Kotlin语言,而问过多个大佬国内APK的现状及未来发展趋势,笔者认为学习用Java来开发Android更为合理,一来让自己能多了解Java,二来也适应了国内的大环境
代码截图中的注释将会对学习有极大帮助(虽然上传后图片会被压缩,但是还是能看得清的
1.JDK环境安装
2.Android Studio集成开发环境(https://developer.android.com/studio)
AVD manager用于创建安卓模拟器
选择相应型号并下载对应镜像即可
3.Cygwin安装:该工具可以模拟UNIX命令,且WIN10增加了Bash on Ubuntu on windows所以可以二选一
Bash on Ubuntu on windows开启操作(Win11)
随后再Microsoft store上安装ubuntu,运行Ubuntu。
在终端输入bash后即可
Android四大组件:
Helloword
创建项目、选择项目类型界面、启动安卓虚拟机,随后点击三角(锤子是用来编译的)
一段时间后手机上就会运行该程序且apk会装到手机上
01 . .gradle 和.idea
这两个目录下放置的都是Andr oid Studio 自动生成的一些文件,我们无须关心,也不要去
手动编辑。
02 . app
项目中的代码、资源等内容都是放置在这个目录下的,我们后面的开发工作也基本是在这
个目录下进行的,待会儿还会对这个目录单独展开讲解。
03 . build
这个目录主要包含了一些在编译时自动生成的文件,你也不需要过多关心。
04 . gradle
这个目录下包含了gradle wrapper 的配置文件,使用gradle wrapper 的方式不需要提前
将gradle 下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle 。
Andr oid Studio 默认就是启用gradle wrapper 方式的,如果需要更改成离线模式,可以
点击Andr oid Studio 导航栏→File→Settings→Build, Ex ecution,
Deployment→Gradle ,进行配置更改。
05 . .gitignore
06 . build.gradle
这是项目全局的gradle 构建脚本,通常这个文件中的内容是不需要修改的。稍后我们将会
详细分析gradle 构建脚本中的具体内容。
07 . gradle.properties
这个文件是全局的gradle 配置文件,在这里配置的属性将会影响到项目中所有的gradle 编
译脚本。
08 . gradlew 和gradlew .bat
这两个文件是用来在命令行界面中执行gradle 命令的,其中gradlew 是在Linux或Mac 系统
中使用的,gradlew .bat 是在Windows 系统中使用的。
09 . HelloW orld.iml
iml文件是所有IntelliJ IDEA项目都会自动生成的一个文件(Andr oid Studio 是基于IntelliJ
IDEA开发的),用于标识这是一个IntelliJ IDEA项目,我们不需要修改这个文件中的任何
内容。
10 . local.properties
这个文件用于指定本机中的Andr oid SDK路径,通常内容是自动生成的,我们并不需要修
改。除非你本机中的Andr oid SDK位置发生了变化,那么就将这个文件中的路径改成新的
位置即可。
11 . settings.gradle
这个文件用于指定项目中所有引入的模块。由于HelloWorld 项目中只有一个app 模块,因
此该文件中也就只引入了app 这一个模块。通常情况下,模块的引入是自动完成的,需要我们手动修改这个文件的场景可能比较少。
01 . build
这个目录和外层的build 目录类似,也包含了一些在编译时自动生成的文件,不过它里面的
内容会更加复杂,我们不需要过多关心。
02 . libs
如果你的项目中使用到了第三方jar 包,就需要把这些jar 包都放在libs目录下,放在这个目
录下的jar 包会被自动添加到项目的构建路径里。
03 . androidT est
此处是用来编写Andr oid Test 测试用例的,可以对项目进行一些自动化测试。
04 . java
毫无疑问,java 目录是放置我们所有Java 代码的地方(Kotlin 代码也放在这里),展开该
目录,你将看到系统帮我们自动生成了一个MainActivity 文件。
05 . res
这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片、布局、字
符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在drawable
目录下,布局放在layout 目录下,字符串放在values 目录下,所以你不用担心会把整个res
目录弄得乱糟糟的。
06 . AndroidManifest.xml
这是整个Andr oid 项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明。
07 . test
此处是用来编写Unit Test 测试用例的,是对项目进行自动化测试的另一种方式。
08 . .gitignore
这个文件用于将app 模块内指定的目录或文件排除在版本控制之外,作用和外层
的.gitignor e 文件类似。
09 . app.iml
IntelliJ IDEA项目自动生成的文件,我们不需要关心或修改这个文件中的内容。
10 . build.gradle
这是app 模块的gradle 构建脚本,这个文件中会指定很多项目构建相关的配置,我们稍后
将会详细分析gradle 构建脚本中的具体内容。
11 . proguard-rules.pro
这个文件用于指定项目代码的混淆规则,当代码开发完成后打包成安装包文件,如果不希
望代码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。
报错输出
Log.v()。用于打印那些最为琐碎的、意义最小的日志信息。对应级别verbose ,是
Android 日志里面级别最低的一种。
Log.d()。用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。
对应级别debug ,比verbose 高一级。
Log.i()。用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分
析用户行为的数据。对应级别info,比debug 高一级。
Log.w()。用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修
复一下这些出现警告的地方。对应级别warn ,比info高一级。
Log.e()。用于打印程序中的错误信息,比如程序进入了catch语句中。当有错误信息打
印出来的时候,一般代表你的程序出现严重问题了,必须尽快修复。对应级别error ,比
warn 高一级。
onCreate在Activity初始化时调用
记得要引入这个包,在Logcat中可以看到Log信息
页面布局layout
调用该布局
注册活动(此时并未配置著活动,程序不知道要先启动哪个活动)
配置主活动:在activity标签下加入<intent-filter>标签并添加俩句声明
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Toast能点击以后出现短信息弹窗,一段时间后消失
在活动中使用menu
创建菜单项
引入菜单项,让菜单项在页面显示
实现功能
安卓开发中,很多情况下要销毁当前活动,举个例子,比如登陆注册,注册成功后应该销毁注册页面,不然当你按返回键会返回注册页面,影响用户体验。
finish()
点击应用图标之后进入到该应用的主活动,可以通过Intent从主活动跳转到其他活动
创建出一个活动,定义一个按钮为Button2
设置样式
在主活动的Button1中使用Intent来启动该活动
模拟器中点击Button1将会跳转到SecondActivity活动
AndroidMainfest注册activity组件,设置隐式intent
默认category
当我们创建一个活动时,Android Studio会在AndroidMainfest.xml自动注册
在主活动中添加触发隐式Intent
增加category
每个Intent只能指定一个action,但能指定多个category
添加category
在AndroidMainfest.xml中的SecondActivity中声明响应该category
调用系统浏览器
在<intent-filter>标签中配置<data>标签,指定当前活动能响应什么类型数据
当<data>标签中指定的内容与Intent中携带的Data完全一直才能响应该Intent
通过其他活动响应Intent
创建活动
创建样式
注册ThirdActivity,ThirdActivity能够响应一个打开网页的Intent
因为这个Intent有直接调用系统浏览器也有ThirdActivity
所以出现选择
选择Browser就是浏览器打开,选择ActivityTest则启动ThirdActivity来响应打开网页
Uri.parse()可以调用的协议
1,调web浏览器
Uri myBlogUri = Uri.parse(“http://xxxxx.com”);
returnIt = new Intent(Intent.ACTION_VIEW, myBlogUri);
2,地图
Uri mapUri = Uri.parse(“geo:38.899533,-77.036476”);
returnIt = new Intent(Intent.ACTION_VIEW, mapUri);
3,调拨打电话界面
Uri telUri = Uri.parse(“tel:100861”);
returnIt = new Intent(Intent.ACTION_DIAL, telUri);
4,直接拨打电话
Uri callUri = Uri.parse(“tel:100861”);
returnIt = new Intent(Intent.ACTION_CALL, callUri);
5,卸载
Uri uninstallUri = Uri.fromParts(“package”, “xxx”, null);
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);
6,安装
Uri installUri = Uri.fromParts(“package”, “xxx”, null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);
7,播放
Uri playUri = Uri.parse(“file:///sdcard/download/everything.mp3”);
returnIt = new Intent(Intent.ACTION_VIEW, playUri);
8,调用发邮件
Uri emailUri = Uri.parse(“mailto:xxxx@gmail.com”);
returnIt = new Intent(Intent.ACTION_SENDTO, emailUri);
9,发邮件
returnIt = new Intent(Intent.ACTION_SEND);
String[] tos = { “xxxx@gmail.com” };
String[] ccs = { “xxxx@gmail.com” };
returnIt.putExtra(Intent.EXTRA_EMAIL, tos);
returnIt.putExtra(Intent.EXTRA_CC, ccs);
returnIt.putExtra(Intent.EXTRA_TEXT, “body”);
returnIt.putExtra(Intent.EXTRA_SUBJECT, “subject”);
returnIt.setType(“message/rfc882”);
Intent.createChooser(returnIt, “Choose Email Client”);
10,发短信
Uri smsUri = Uri.parse(“tel:100861”);
returnIt = new Intent(Intent.ACTION_VIEW, smsUri);
returnIt.putExtra(“sms_body”, “yyyy”);
returnIt.setType(“vnd.android-dir/mms-sms”);
11,直接发邮件
Uri smsToUri = Uri.parse(“smsto://100861”);
returnIt = new Intent(Intent.ACTION_SENDTO, smsToUri);
returnIt.putExtra(“sms_body”, “yyyy”);
12,发彩信
Uri mmsUri = Uri.parse(“content://media/external/images/media/23”);
returnIt = new Intent(Intent.ACTION_SEND);
returnIt.putExtra(“sms_body”, “yyyy”);
returnIt.putExtra(Intent.EXTRA_STREAM, mmsUri);
returnIt.setType(“image/png”);
startActivityForResult()在活动销毁时能够返回一个结果给上一个活动
用startActivityForResult启动活动
在SecondActivity设置返回数据,点击button2返回数据并销毁活动
startActivityForResult会回调上一个活动的onActivityResult
最终,点击button2会跳回FirstActivity界面且输出
也可用back键来返回数据
本文作者:硝基苯
本文链接:https://www.c6sec.com/index.php/archives/679/
最后修改时间:2022-06-09 13:05:42
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!