安卓开发环境搭建
1 安卓开发环境搭建
################安卓开发环境介绍####################
做安卓开发,必须要会java,需要安卓sdk,使用java的语法,编写安卓程序,编写过程中,需要有编辑器,IDEA是做不到,谷歌公司提供的 AndroidStudio,开发的app运行---》真机,模拟器(mumu,AndroidStudio提供的模拟器)
-java
-安卓sdk
-AndroidStudio
-真机,模拟器
# 早期做安卓开发,开发app,需要使用eclipse+安卓sdk,自己搭建环境
# 目前做安卓开发,谷歌公司官方提供 AndroidStudio,可以直接下载安卓sdk,直接开发---》集成开发环境
# 写完的代码运行
-真机--》推荐--》买了piexl--》安卓手机---》#####不需要root######
-网易mumu,夜神
-AndroidStudio 自带模拟器
1.1 安卓集成开发环境
# 下载安卓andoridstudio
#### 下载地址:
# 历史版本下载
https://developer.android.google.cn/studio/archive?hl=zh-cn
#最新版本下载
https://developer.android.google.cn/studio
### 教程
https://developer.android.google.cn/studio/intro?hl=zh-cn
#### AndroidStudio 本质就是 jetbrains公司的产品,谷歌公司买了版权+安卓sdk,组成了这么一款集成开发环境,使用习惯,跟pycharm,idea,都是一样的,免费的
#### 项目构建工具
Gradle和Maven都是Java项目的构建工具,但它们有一些区别:
1. 语法:Gradle使用Groovy语言进行编写,而Maven使用XML。Groovy更加灵活易读,XML更加严谨易于重用。
2. 性能:Gradle比Maven更加高效快速,因为它使用了增量构建模式,只会重新构建被更改的模块,而Maven则需要重新构建整个项目。
3. 插件:Gradle的插件生态更加丰富和现代化,而Maven的插件相对较为传统。此外,Gradle的插件可以非常容易地编写和定制,而Maven的插件相对繁琐。
4. 维护:Maven有比较成熟的工具链和文档支持,而Gradle则相对较新,可能需要更多的自学
### java开发,javaee:javaweb开发,Maven使用XML
### andorid开发:Gradle使用Groovy语言进行编写
# Groovy介绍
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码
1.2 下载配置安装环境
## 把软件双击:android-studio-2022.3.1.19-windows.exe
-是否安装安卓虚拟机:我们以后都用真机
1.2.1 AndroidStudio安装
1.2.2 配置AndroidStudio
1.2.3 创建android项目
1 .2.4 手动创建项目
1.3 运行项目(真机,模拟器)
1.3.1 真机运行
# 手机开启开发者模式 & USB调试,并且用数据线和电脑连接。
# 当你一插线,手机上会提示授权
# 稍等片刻,此时在android studio中会读取到你的手机设备。
# 如果没有读取到,请在手机上【撤销USB调试授权】,然后再重新插入USB,重新授权。
# 运行第一个app
1.3.2 模拟器运行程序
# 以后不要用
2 安卓项目目录结构
2.1 安卓开发流程
2.2 安卓项目目录结构
2.2.1 安卓视图
├── .gradle #AndroidStudio 自动生成的文件,会自动修改它的,项目打包时也会删除(不用关注);
├── .idea # AndroidStudio自动生成的文件,会自动修改它的,项目打包时也会删除(不用关注);
├── app # 应用相关的东西都在里面,工作的核心目录
│ ├── build # 编译的产物。某些情况下,可以手动把它整个删掉。
│ ├── libs # 依赖包可以放这里,比如一些jar文件,so文件。
│ ├── src # 代码在这。非常重要。
│ │ ├── main
│ │ │ ├── java # 放Java代码的地方
│ │ │ ├── res
│ │ │ │ ├── drawable # 应用图标
│ │ │ │ ├── layout # Android布局文件夹
│ │ │ │ ├── mipmap # 适配不同分辨率的手机
│ │ │ │ ├── mipmap # 桌面图标
│ │ │ │ └── values # 颜色、样式、字符集配置文件夹
│ │ │ ├──AndroidManifest.xml#APP运行配置文件,用来配置权限:程序入口配置、应用程序主题、应用程序组件等
│ ├── .gitignore # 版本控制
│ ├── build.gradle # 非常重要,app的构建配置。俗称“app的gradle文件”。
│ └── proguard-rules.pro # 不管。这个是混淆配置。
├── gradle # 它是一个构建起配置文件
├── .gitignore # 整个工程的版本控制
├── build.gradle # 很重要。项目级的配置。俗称“项目gradle文件”
├── gradle.properties # 全局的gradle配置文件
├── gradlew # Linux/mac上执行gradle命令
├── gradlew.bat # Windows上执行gradle命令
├── local.properties # 本地配置文件,一般不上传
└── settings.gradle # gralde的项目级配置
### 注意:
src
-main
-java
-res
-layout
AndroidManifest.xml
build.gradle
3 第一个app--点击按钮切换美女图片
3.1 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<ImageView
android:layout_margin="10dp"
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="300dp"
android:src="@color/pink">
</ImageView>
<Button
android:id="@+id/button"
android:layout_marginTop="50dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击换美女">
</Button>
</LinearLayout>
</LinearLayout>
3.2 MainActivity
package com.justin.s9demo01;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button button01; // 用来接受页面中的button
private ImageView image; // 用来接受页面中的Image
private int id = R.drawable.a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 让这个java文件跟activity_main.xml对应上
//1 取到页面中的button和image
button01 = findViewById(R.id.button); // 去activity_main根据id找组件
image = findViewById(R.id.image);
image.setImageResource(this.id);
// 2 给按钮绑定事件,以后点击按钮,就会执行
button01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 点击一次,弹出个吐司
Toast.makeText(MainActivity.this, "换美女了", Toast.LENGTH_LONG).show();
// 点一下按钮,id变量,切换一下
if (id == R.drawable.a) {
id = R.drawable.b;
} else if (id == R.drawable.b) {
id = R.drawable.c;
} else {
id = R.drawable.a;
}
image.setImageResource(id);
}
});
}
}
3.3 res-drawable-放图片
4 显示网络图片--比较麻烦
# 安卓的网络加载,必须开启一个新的线程去做,主线程负责更新ui
# 1 手机要能上网
# 2 代理关闭
# 3 AndroidManifest.xml配置上网权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
package com.justin.s9demo01;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private Button button01; // 用来接受页面中的button
private ImageView image; // 用来接受页面中的Image
private int id = R.drawable.a;
private URL url = null;
private Bitmap bitmap = null;
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main); // 让这个java文件跟activity_main.xml对应上
// //1 取到页面中的button和image
// button01 = findViewById(R.id.button); // 去activity_main根据id找组件
// image = findViewById(R.id.image);
// image.setImageResource(this.id);
// // 2 给按钮绑定事件,以后点击按钮,就会执行
// button01.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
// // 点击一次,弹出个吐司
// Toast.makeText(MainActivity.this, "换美女了", Toast.LENGTH_LONG).show();
// // 点一下按钮,id变量,切换一下
// if (id == R.drawable.a) {
// id = R.drawable.b;
// } else if (id == R.drawable.b) {
// id = R.drawable.c;
// } else {
// id = R.drawable.a;
// }
//
// image.setImageResource(id);
// }
// });
//
//
// }
// 加载网络图片
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 让这个java文件跟activity_main.xml对应上
//1 取到页面中的button和image
button01 = findViewById(R.id.button); // 去activity_main根据id找组件
image = findViewById(R.id.image);
image.setImageResource(this.id);
// 2 给按钮绑定事件,以后点击按钮,就会执行
button01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 点击一次,弹出个吐司
Toast.makeText(MainActivity.this, "换美女了", Toast.LENGTH_LONG).show();
try {
url = new URL("https://lmg.jj20.com/up/allimg/tx28/03102423387976.png");
requestImage(url);
} catch (Exception e) {
Log.e("justin", e.toString());
}
}
});
}
private void requestImage(URL url) {
// 开启新线程加载网络图片
new Thread() {
@Override
public void run() {
try {
bitmap = BitmapFactory.decodeStream(url.openStream());
showImg();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
private void showImg() {
// 更新ui,必须在主线程中
runOnUiThread(new Runnable() {
@Override
public void run() {
image.setImageBitmap(bitmap);
}
});
}
}
5 逆向自己的app
# 1 把编译好的apk,拿出来
# 2 使用jadx打开
-找到com.justin.s9demo01.MainActivity
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析