android 环境搭建

参考链接open in new window

一、java 环境搭建

1.1 下载 java sdk

java sdk 下载地址open in new window下载jdk-8u391-windows-x64.exe

Alt text

1.2 安装 java

运行jdk-8u391-windows-x64.exe文件,一步一步安装

1.3 java 环境变量配置

JDK8 的环境变量配置分为以下两步:

首先在系统变量中, 新建变量名为 JAVA_HOME, 值为 JDK8 的安装路径例如:C:\Program Files\Java\jdk-1.8

然后在 Path 中, 借用变量 JAVA_HOME(也就是 JDK 的安装路径), 找到 JDK 的 bin 目录即可%JAVA_HOME%\bin

最好在Path中配置一个 JRE 的 bin 目录:C:\Program Files\Java\jre-1.8\bin

1.4 安装完之后验证

安装完成之后,输入 java 版本指令:

java -verison

结果为:

java version "1.8.0_391"
Java(TM) SE Runtime Environment (build 1.8.0_391-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.391-b13, mixed mode)

二、android 环境搭建

2.1 下载 android studio

android studio 下载地址open in new window,下载Android Studio Giraffe | 2022.3.1

Alt text

2.2 安装 android studio

下载完毕之后,运行android-studio-2022.3.1.20-windows.exe文件

Alt text

Alt text

Alt text

Alt text

2.3 SDK 的环境配置

新建系统变量ANDROID_HOME , 值为 SDK 的目录C:\Users\masec\AppData\Local\Android\Sdk

Alt text

Path点击新建输入%ANDROID_HOME%\platform-tools配置 SDK 的 platform-tools

Path点击新建输入%ANDROID_HOME%\tools配置 SDK 的 tools

Alt text

2.4 SDK 的验证

判断是否 sdk 配置成功,打开 cmd 命令框输入 adb

adb -version

结果为:

Android Debug Bridge version 1.0.41
Version 34.0.5-10900879
Installed as C:\Users\masec\AppData\Local\Android\Sdk\platform-tools\adb.exe
Running on Windows 10.0.19045

2.5 Gradle 版本与 Java 版本的兼容性

兼容性示例open in new window

执行 Gradle 需要 Java 版本在 8 到 19 之间。目前还不支持 Java 20 及更高版本。 Java 6 和 7 仍然可以用于编译,但不建议用于测试。Gradle 9.0 将不支持使用 Java 6 和 7 进行测试。 任何完全支持的 Java 版本都可以用于编译或测试。然而,最新的 Java 版本可能只支持编译或测试,而不支持运行 Gradle。 对于旧版本的 Gradle,请参见下表,哪个 Gradle 版本支持哪个 Java 版本

Alt text

2.6 Gradle 相关文件下载较慢的问题

 repositories {
//        google()
//        mavenCentral()
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/public' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
    }

gradle 下载太慢的问题,更换gradle-wrapper.properties文件中下载源:

例如目前使用 8.3 版本的 gradle,更换为国内腾讯的源https://mirrors.cloud.tencent.com/gradle

distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.3-all.zip

2.7 Gradle 相关文件(项目为 tabs)

2.7.1 setting.gradle(project setting)

/** pluginManagement*
 *
 * repositories Gradle uses to search or download the Gradle plugins and
 * their transitive dependencies. Gradle pre-configures support for remote
 * repositories such as JCenter, Maven Central, and Ivy. You can also use
 * local repositories or define your own remote repositories. The code below
 * defines the Gradle Plugin Portal, Google's Maven repository,
 * and the Maven Central Repository as the repositories Gradle should use to look for its
 * dependencies.
 *
 * Gradle用来搜索或下载Gradle插件及其传递依赖的存储库。
 * Gradle预先配置了对远程存储库的支持,比如JCenter、Maven Central和Ivy。
 * 您还可以使用本地存储库或定义您自己的远程存储库。
 * 下面的代码定义了Gradle Plugin Portal, 谷歌的Maven储存库,
 * 以及Maven中央储存库作为Gradle应该用来查找依赖的储存库
 */

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

/** dependencyResolutionManagement
 *
 * The dependencyResolutionManagement {repositories {...}}
 * block is where you configure the repositories and dependencies used by
 * all modules in your project, such as libraries that you are using to
 * create your application. However, you should configure module-specific
 * dependencies in each module-level build.gradle file. For new projects,
 * Android Studio includes Google's Maven repository and the Maven Central
 * Repository by default, but it does not configure any dependencies (unless
 * you select a template that requires some).
 *
 * 依赖性解决管理块用于配置库和依赖项项目中的所有模块,例如您正在使用的库创建应用程序。
 * 但是,您应该配置特定于模块的配置每个模块级构建中的依赖关系gradle文件。
 * 对于新项目,Android Studio包括谷歌的Maven仓库和Maven Central默认的存储库,
 * 但它不配置任何依赖项(除非你选择一个模板,需要一些)。
 */

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "tabs"
include(":app")
 

2.7.2 setting.gradle(Project:tabs)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

/**
 * Use `apply false` in the top-level build.gradle file to add a Gradle
 * plugin as a build dependency but not apply it to the current (root)
 * project. Don't use `apply false` in sub-projects. For more information,
 * see Applying external plugins with same version to subprojects.
 */

/**

* 在顶层构建中使用“apply false”添加gradle.gradle文件插件作为构建依赖,但不应用到当前(根)项目。
* 不要在子项目中使用“apply false”。欲了解更多信息,请参见将相同版本的外部插件应用于子项目。
*/

plugins {
    id("com.android.application") version "8.1.2" apply false
}

2.7.3 setting.gradle(Module:app)

/** plugins:
 *
 * The first section in the build configuration applies the Android Gradle plugin
 * to this build and makes the android block available to specify
 * Android-specific build options.
 *
 * 插件名称:"com.android.application"
 * 构建配置的第一部分应用Android Gradle插件到这个版本,并使android块可指定android特定的构建选项。
 */

plugins {
    id("com.android.application")
}

/** android{}:
 *
 * The android block is where you configure all your Android-specific
 * build options.
 *
 * android块是你配置所有android特定的地方构建选项。
 */

android {
    /** namespace:
     *
     * The app's namespace. Used primarily to access app resources.     *
     * 应用的命名空间。主要用于访问应用程序资源。
     */

    namespace = "com.masecho.tabs"

    /** compileSdk:
     *
     * compileSdk specifies the Android API level Gradle should use to
     * compile your app. This means your app can use the API features included in
     * this API level and lower.
     *
     * compileSdk指定Gradle应该使用的Android API级别编译你的应用程序。
     * 这意味着你的应用程序可以使用包含在此API级别或更低。
     */

    compileSdk = 33

    /** defaultConfig:
     *
     * The defaultConfig block encapsulates default settings and entries for all
     * build variants and can override some attributes in main/AndroidManifest.xml
     * dynamically from the build system. You can configure product flavors to override
     * these values for different versions of your app.
     *
     * defaultConfig块封装了所有的默认设置和条目构建变量,并可以
     * 覆盖main/AndroidManifest.xml中的一些属性动态地从构建系统。
     * 您可以配置要覆盖的产品口味这些值适用于不同版本的应用程序。
     */

    defaultConfig {

    /** applicationId:
     *
     * Uniquely identifies the package for publishing.
     *
     * 唯一标识要发布的包。
    */
        applicationId = "com.masecho.tabs"

    /** minSdk:
     *
     * Defines the minimum API level required to run the app.
     *
     * 定义运行应用程序所需的最低API级别。
     */
        minSdk = 21

    /** targetSdk:
     *
     * Specifies the API level used to test the app.
     *
     * 指定用于测试应用程序的API级别。
     */
        targetSdk = 33

    /** versionCode:
     *
     * Defines the version number of your app.
     *
     * 定义应用程序的版本号。
     */
        versionCode = 1

    /** versionName:
     *
     * Defines a user-friendly version name for your app.
     *
     * 定义应用程序的版本号。
     */
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    /**
     * The buildTypes block is where you can configure multiple build types.
     * By default, the build system defines two build types: debug and release. The
     * debug build type is not explicitly shown in the default build configuration,
     * but it includes debugging tools and is signed with the debug key. The release
     * build type applies ProGuard settings and is not signed by default.
     *
     * buildTypes块是您可以配置多个构建类型的地方。默认情况下,构建系统定义了两种构建类型:调试和发布。
     * 调试构建类型没有在默认构建配置中显式显示,但它包括调试工具,并与调试密钥签名。
     * 释放构建类型应用ProGuard设置,默认不签名。
     */

    buildTypes {
        release {
            /** isMinifyEnabled=true:
             *
             * Enables code shrinking for the release build type.
             *
             * 为发布版本构建类型启用代码压缩。
             */
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    buildFeatures {
        viewBinding = true
    }
}

dependencies {

    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.8.0")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1")
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
    implementation("androidx.navigation:navigation-fragment:2.5.3")
    implementation("androidx.navigation:navigation-ui:2.5.3")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}

三、android apk 构建

3.1 android apk 文件目录

Alt text

  • META-INF:版本信息
  • res:资源文件
  • AndroidManifest.xml:安卓配置文件
  • app-debug:存储apk文件的名字
  • classes.dex主包
  • classes2.dex分包
  • resources.arsc多语种结构

3.2 APK 构建流程

Alt text

3.3 gradle 的层级结构

Gradle 是一个强大的构建工具,用于自动化 Android 应用程序的构建过程。Gradle Wrapper 帮助项目管理 Gradle 版本,Closure 用于配置构建脚本,Project 代表构建单元,Task 表示构建步骤,Hooks 用于插入自定义逻辑,Plugin 扩展了 Gradle 的功能以支持不同类型的项目。

Alt text

  • Wrapper:Gradle Wrapper 是一个用于自动化 Gradle 安装和配置的工具。 它允许项目使用特定版本的 Gradle,而无需手动安装 Gradle 本身。 Gradle Wrapper 包括一个脚本和一个 JAR 文件,这两者允许项目使用指定版本的 Gradle。

  • Closure:在 Gradle 中,Closure(闭包)是一段代码块,通常用于配置 Gradle 构建脚本的任务或插件。 闭包使用 Groovy 语法编写,可以包含一组配置指令,以指导 Gradle 执行特定的任务

  • project:项目(Project)是 Gradle 构建的核心单位。 在 Android 项目中,通常有一个根项目和一个或多个子项目。 每个项目都有自己的构建脚本和任务。项目之间可以相互依赖,以构建 Android 应用程序的各个组件。

  • Task:任务(Task)是 Gradle 中的最小构建单元。任务代表构建过程中的一个步骤,如编译、打包、测试等。您可以在 Gradle 构建脚本中定义和配置任务,然后执行它们以完成特定的构建操作。

  • Hooks:Gradle 提供了一系列的 Hook 方法,用于在构建过程中插入自定义逻辑。这些 Hook 方法允许您在构建的不同阶段执行自定义操作,如在编译之前或之后执行某些任务。

  • Plugin:插件(Plugin)是 Gradle 的扩展模块,用于提供特定的构建功能。在 Android 开发中,通常会使用 Android Gradle 插件,它扩展了 Gradle 以支持 Android 项目的构建。除此之外,您还可以编写自定义插件,以扩展 Gradle 的功能以满足项目特定的需求。

3.4 gradle 环境配置

gradle 下载open in new window

加入系统环境变量GRADLE_HOME:D:\gradle\gradle-8.0

加入系统 path 的变量%GRADLE_HOME%\bin;

 gradle -v

# 输出结果:
------------------------------------------------------------
Gradle 8.0
------------------------------------------------------------

Build time:   13:15:21 UTC
Revision:     62ab9b7c7f884426cf79fbedcf07658b2dbe9e97

Kotlin:       1.8.10
Groovy:       3.0.13
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          17.0.6 (JetBrains s.r.o. 17.0.6+0-b2043.56-10027231)
OS:           Windows 10 10.0 amd64

至此 gradle 的命令行添加完毕

3.5 gradle 打包指令

# build->clean-> Project
# 清除所有build文件
gradle clean

# build->assembleDebug
gradle assembleDebug

gradle assembleRelease

查看所有任务

./gradlew tasks --all

编译并打 Release 的包:

./gradlew assembleRelease
# 简写为:
./gradlew aR

卸载 Release 模式包

./gradlew uninstallRelease

编译并打 Debug 包

./gradlew assembleDebug

编译 app module 并打 Debug 包

./gradlew install app:assembleDebug

Release 模式打包并安装

./gradlew installRelease

3.6 gradle 打包示例 Release

1.配置 gradle

android {
    namespace 'com.test.www'
    compileSdk 33

    defaultConfig {
        applicationId "com.test.www"
        minSdk 24
        targetSdk 33
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        release {
            keyAlias 'key0'
            keyPassword '12345678'
            storeFile file('test-keystore.jks')
            storePassword '12345678'
        }
    }

    buildTypes {
        release {
            // 混淆代码
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // 签名
            signingConfig signingConfigs.release

             // 设置生成的 APK 文件名
            applicationVariants.all { variant ->
                variant.outputs.all {
                    def versionCodeValue = variant.versionCode;
                    // 指定 APK 文件名,包括 versionCode
                    outputFileName = "your_custom_name_${versionCodeValue}.apk"

                }
            }
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

2.gradle 脚本中 variant

在 Gradle 构建脚本中使用 applicationVariants.all { variant -> ... } 时,variant 代表构建变种(Build Variant)。 Build Variant 是 Android Gradle 插件用于管理不同构建配置的一种概念。它通常包括以下属性和值:

  1. variant.name: 该构建变种的名称,通常是 debug(调试版本)或 release(发布版本),也可以包括其他自定义变种名称。

  2. variant.buildType: 构建类型,例如 debugrelease

  3. variant.productFlavors: 如果你的项目使用了产品风味(Product Flavors),这个属性将包含产品风味的信息。

  4. variant.applicationId: 应用的包名(package name)。

  5. variant.versionCode: 应用的版本号,通常在 defaultConfig 中定义。

  6. variant.versionName: 应用的版本名称,通常在 defaultConfig 中定义。

  7. variant.outputs: 包含有关构建输出的信息,例如输出的 APK 文件。

  8. 其他构建配置和属性,取决于你的项目结构和构建配置。

当你使用 applicationVariants.all { variant -> ... } 这样的闭包来遍历构建变种时,你可以访问上述属性并执行特定于每个构建变种的操作。这在自动化构建、版本控制和多渠道发布中非常有用。你可以根据不同的构建配置执行不同的任务或配置不同的输出文件名,等等。

3.gradle 脚本中 project

在 Gradle 构建脚本中,project 是一个核心对象,代表了当前构建的项目。project 对象提供了许多方法和属性,用于管理项目的配置、依赖、任务等。

以下是一些常见的用法和属性,涉及到 project 对象:

project.name: 获取项目的名称。

project.path: 获取项目的相对路径。

project.projectDir: 获取项目的根目录。

project.buildDir: 获取构建输出目录,通常是 build 目录。

project.tasks: 用于管理项目的任务。你可以通过 project.tasks 来创建、配置和执行 Gradle 任务。

project.dependencies: 用于管理项目的依赖关系。你可以使用 project.dependencies 来添加依赖、配置依赖的版本等。

project.ext: 用于存储项目的自定义属性。你可以使用 project.ext 来在构建脚本中定义和访问自定义属性。

project.allprojects 和 project.subprojects: 这些属性用于迭代所有项目和子项目。你可以使用它们来对多项目构建进行操作。

project.rootProject: 获取根项目,通常在多项目构建中使用。

project.afterEvaluate { ... }: 这是一个闭包,用于在项目的配置阶段之后执行一些操作。

project.repositories: 用于配置项目的仓库,以便获取依赖。

project.gradle: 获取全局 Gradle 对象,可以用于执行全局级别的操作。

project 对象是 Gradle 构建脚本的核心组成部分,它允许你与项目的各个方面进行交互,包括任务、依赖、属性、仓库等。你可以根据项目的需求使用 project 对象来自定义和管理构建过程。

生成 apk release:

./gradlew assembleRelease

生成 aab release:

./gradlew bundleRelease

四、android 更换图标

使用图标生成工具: 你也可以使用 Android Studio 的图标生成工具来更改图标:

打开图标生成器:

在 Android Studio 中,转到 File -> New -> Image Asset。 选择图标类型:

在弹出的窗口中,选择 Asset Type 为 Image。 然后选择你的图标图像文件。 设置图标:

在图标设置部分,你可以选择图标的名称和颜色等选项。 生成图标:

点击 Next 和 Finish,Android Studio 将会自动生成适配各种分辨率的图标文件,并将它们放置到相应的文件夹中。 更新清单文件:

最后,确保更新 AndroidManifest.xml 文件中的 android:icon 属性指向你新生成的图标文件名。

五 android product favor

配置打包不同的包名

buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
        release {
            // Caution! In production, you need to generate your own keystore file.
            // see https://reactnative.dev/docs/signed-apk-android.
            signingConfig signingConfigs.debug
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        }
    }

    flavorDimensions = ["environment"]

    productFlavors {
        // ...其他风味配置

        dev {
            dimension "environment"
            applicationId "com.masecho.mshop.dev"
            resValue "string", "app_name", "mshopDev"
            signingConfig signingConfigs.release
            // 开发环境的配置
        }

        prod {
            dimension "environment"
            applicationId "com.masecho.mshop"
            resValue "string", "app_name", "mshop"
            signingConfig signingConfigs.release
            // 生产环境的配置
        }
    }

打包为不同的指令

生成 apk release:

# 生成dev-apk
./gradlew assembleDevRelease
# 生成Prod-apk
./gradlew assembleProdRelease

生成 aab release:

# 生成dev-aab
./gradlew bundleDevRelease

# 生成Prod-aab
./gradlew bundleProdRelease

六 android env 配置环境变量

1.安装react-native-dotenv cross-env

yarn add -D react-native-dotenv cross-env

2.配置 babel.config.js

plugins: [
  ["module:react-native-dotenv"], //添加 ['module:react-native-dotenv']
];

3.增加 .env

默认为 dev 模式

app_mode = dev;

package.json添加 scripts

{
  "scripts": {
    "run-android:dev": "cross-env app_mode=dev&& react-native run-android --port 8081 --mode devdebug --appIdSuffix dev --main-activity com.masecho.mshop.MainActivity",
    "run-android:test": "cross-env app_mode=test&& react-native run-android --port 8082 --mode testdebug --appIdSuffix test --main-activity com.masecho.mshop.MainActivity",
    "run-android:prod": "cross-env app_mode=prod&& react-native run-android --port 8083 --mode proddebug --main-activity com.masecho.mshop.MainActivity",
    "------------------------------------------------------": "-",
    "start:dev": "cross-env app_mode=dev&&react-native start --port 8081 --reset-cache",
    "start:test": "cross-env app_mode=test&&react-native start --port 8082 --reset-cache",
    "start:prod": "cross-env app_mode=prod&&react-native start --port 8083 --reset-cache"
  }
}
Contributors: masecho