安卓开发环境搭建

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

posted @   simon_T  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示