Android开发
浏览 2897 | 评论 0 | 字数 10249
硝基苯
2022年06月09日
  • 前言:
    为了学好Android逆向以及搞一个属于自己的apk后门,笔者决定从开发入手,参考书籍为《第一行代码》(第二版),因为第三版中使用的是Kotlin语言,而问过多个大佬国内APK的现状及未来发展趋势,笔者认为学习用Java来开发Android更为合理,一来让自己能多了解Java,二来也适应了国内的大环境

    代码截图中的注释将会对学习有极大帮助(虽然上传后图片会被压缩,但是还是能看得清的

    环境搭建

    1.JDK环境安装
    2.Android Studio集成开发环境(https://developer.android.com/studio
    AVD manager用于创建安卓模拟器
    86713-ssebccgdwn.png
    选择相应型号并下载对应镜像即可
    96619-ypw2pltk92.png
    3.Cygwin安装:该工具可以模拟UNIX命令,且WIN10增加了Bash on Ubuntu on windows所以可以二选一
    Bash on Ubuntu on windows开启操作(Win11)
    97431-9amyy9maxc5.png
    99414-hyfqvqpycyu.png
    随后再Microsoft store上安装ubuntu,运行Ubuntu。
    在终端输入bash后即可
    56371-bbpeh7gzrr.png

    前置知识

    Android四大组件:

    • Activity:主要作用使展示一个界面并和用户交互
    • Service:后台执行计算任务,执行任务的结果可以和外界进行通信
    • BroadcastReceiver:信息的传递
    • ContentProvider:主要应用于应用之间的数据共享场景

    开始

    Helloword
    91113-7d5r11vntxb.png
    创建项目、选择项目类型界面、启动安卓虚拟机,随后点击三角(锤子是用来编译的)
    47223-lq4tnf8gm3.png
    一段时间后手机上就会运行该程序且apk会装到手机上
    21000-o0f93lzyaf.png

    项目结构

    76461-ifn9dp5qhn.png
    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 这一个模块。通常情况下,模块的引入是自动完成的,需要我们手动修改这个文件的场景可能比较少。

    app目录下的结构

    46577-2fbtek62g17.png
    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初始化时调用
    20034-mq7sh73u2vj.png
    记得要引入这个包,在Logcat中可以看到Log信息

    Activity

    页面布局layout
    86199-sb2a8jf0ef.png
    调用该布局
    10808-2us8ty464i6.png
    注册活动(此时并未配置著活动,程序不知道要先启动哪个活动)
    24126-jwc0g1gr7bs.png
    配置主活动:在activity标签下加入<intent-filter>标签并添加俩句声明

                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>

    62573-p7u1bl8jg5.png

    在活动中使用Toast

    Toast能点击以后出现短信息弹窗,一段时间后消失
    60114-s7shhuoq04m.png
    在活动中使用menu
    创建菜单项
    37603-yxbbde79ac9.png
    引入菜单项,让菜单项在页面显示
    48817-vbbmwe9d15d.png
    实现功能
    33343-9h7622sryk6.png

    销毁活动

    安卓开发中,很多情况下要销毁当前活动,举个例子,比如登陆注册,注册成功后应该销毁注册页面,不然当你按返回键会返回注册页面,影响用户体验。
    finish()
    65385-ksb5hje3mac.png

    使用Intent

    点击应用图标之后进入到该应用的主活动,可以通过Intent从主活动跳转到其他活动

    显式Intent

    创建出一个活动,定义一个按钮为Button2
    02366-2jwioy2f4n3.png
    设置样式
    00468-wou627ytrot.png
    在主活动的Button1中使用Intent来启动该活动
    97509-afv8bckwmgc.png
    模拟器中点击Button1将会跳转到SecondActivity活动

    隐式Intent

    AndroidMainfest注册activity组件,设置隐式intent
    默认category
    26818-70ba7u7hhhe.png
    当我们创建一个活动时,Android Studio会在AndroidMainfest.xml自动注册
    77147-phawdxidcrg.png
    在主活动中添加触发隐式Intent
    52258-z4jgt8b8lw.png
    增加category
    每个Intent只能指定一个action,但能指定多个category
    添加category
    54339-l2hafjiys0t.png
    在AndroidMainfest.xml中的SecondActivity中声明响应该category
    46802-eqi8b9iq4w.png

    使用隐式Intent启动其他程序活动

    调用系统浏览器
    65720-exa695cm07h.png
    在<intent-filter>标签中配置<data>标签,指定当前活动能响应什么类型数据
    当<data>标签中指定的内容与Intent中携带的Data完全一直才能响应该Intent
    42650-a47tnzc45tn.png
    通过其他活动响应Intent
    创建活动
    53285-0xjndbgrwb6g.png
    创建样式
    59354-p1g8vfpa35d.png
    注册ThirdActivity,ThirdActivity能够响应一个打开网页的Intent
    37727-y26osh969vi.png
    因为这个Intent有直接调用系统浏览器也有ThirdActivity
    所以出现选择
    77465-k1spjtqzhwl.png
    选择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”);

    在启动活动时传递数据

    21682-8khryd3cc2s.png
    接收数据
    77243-a20kmydsmkq.png
    因为是用log输出,所以
    18881-8q944qk3sb.png

    返回数据给上一个活动

    startActivityForResult()在活动销毁时能够返回一个结果给上一个活动
    用startActivityForResult启动活动
    31997-7uis4j1ras6.png
    在SecondActivity设置返回数据,点击button2返回数据并销毁活动
    12572-2weeeh798y8.png
    startActivityForResult会回调上一个活动的onActivityResult
    46454-1jhnpd5y7j7.png
    最终,点击button2会跳回FirstActivity界面且输出
    92860-cim096dt5sr.png
    也可用back键来返回数据
    51827-rbdb33995j.png

    本文作者:硝基苯
    本文链接:https://www.c6sec.com/index.php/archives/679/
    最后修改时间:2022-06-09 13:05:42
    本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
    评论已关闭
    评论列表
    暂无评论