1. 项目概述:从零构建你的第一个安卓应用
2003年安迪·鲁宾创立安卓系统时,可能没想到如今全球会有超过30亿台活跃设备运行这个绿色机器人标志的系统。作为移动开发领域的绝对霸主,安卓开发已成为程序员必备技能之一。这个教程将带你用最新版Android Studio(2023.3.1)完成首个具备完整交互功能的APP,从环境搭建到最终打包APK,全程避开我当年踩过的那些坑。
不同于其他教程假设你已经掌握Java基础,我会特别说明每个代码片段对应的编程概念。你最终将做出一个带按钮点击事件、页面跳转和简单数据传递的天气查询应用,虽然界面简陋,但包含了90%安卓应用都具备的核心要素。整个过程不需要任何付费工具,你的电脑只要能运行Win10或macOS Big Sur即可。
重要提示:安装Android Studio时务必确保磁盘剩余空间大于8GB,SDK和模拟器会占用大量存储。我见过太多新手卡在安装环节就因为C盘空间不足。
2. 开发环境配置
2.1 Android Studio安装详解
访问官网developer.android.com/studio下载时,你会看到两个版本:
- 包含Android SDK的完整包(约1GB)
- 仅IDE的基本包(建议选这个,后面单独下载SDK)
选择后者能避免默认安装过时的SDK版本。安装过程中有三个关键选项需要特别注意:
安装类型选择:勾选"Standard"模式会让IDE自动下载最新SDK,但可能包含你不需要的组件。我推荐"Custom"后手动勾选:
- Android SDK
- Android Virtual Device
- Performance(Intel HAXM或AMD Hypervisor)
SDK组件选择:至少勾选:
- Android SDK Platform 34(对应Android 14)
- Sources for Android 34(查看源码用)
- Android Emulator
- Android SDK Build-Tools 34.0.0
硬件加速配置:根据CPU型号选择:
- Intel处理器:启用HAXM
- AMD处理器:启用Hypervisor
- 苹果M系列:无需特别设置
安装完成后别急着创建项目,先到"Configure → SDK Manager"检查以下项目:
- SDK Platforms选项卡:确认Android 14已安装
- SDK Tools选项卡:确保"Android SDK Command-line Tools"已勾选
2.2 解决首次运行的典型问题
新手常遇到的三个"拦路虎"及解决方案:
问题1:Gradle构建卡在"Downloading gradle-x.x.x-all.zip"
- 原因:国内网络访问Gradle服务器不稳定
- 解决方案:
1. 手动下载对应版本zip包(版本号看报错信息) 2. 放入C:\Users\你的用户名\.gradle\wrapper\dists\gradle-x.x.x-all\一串随机字符\ 3. 重启Android Studio
问题2:模拟器启动黑屏
- 尝试以下步骤:
- 关闭Windows Hyper-V功能
- 在BIOS中开启VT-x虚拟化支持
- 删除现有AVD,新建时选择"x86_64"系统镜像
问题3:中文乱码
- 修改安装目录下
bin/idea.properties文件,追加:-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
3. 创建首个项目
3.1 项目模板选择
启动Android Studio后选择"New Project",你会看到各种模板:
- Empty Activity:最干净的单页面(推荐新手选这个)
- Basic Activity:带导航抽屉和悬浮按钮
- Bottom Navigation:底部Tab布局
我们选择"Empty Activity",注意三个关键配置项:
- Name:首字母大写的驼峰命名(如MyFirstApp)
- Package name:逆域名格式(com.yourdomain.appname)
- Save location:路径不要包含中文或空格
- Language:选Java(虽然Kotlin是趋势,但Java资料更丰富)
- Minimum SDK:选API 26(Android 8.0),覆盖90%以上设备
点击Finish后,Gradle会开始构建项目(可能需要几分钟)。构建完成后,主要目录结构如下:
app/ ├── manifests/ │ └── AndroidManifest.xml # 应用配置入口 ├── java/ │ └── com.../ │ ├── MainActivity.java # 主界面代码 ├── res/ │ ├── drawable/ # 图片资源 │ ├── layout/ # 界面XML文件 │ ├── mipmap/ # 应用图标 │ └── values/ # 颜色/字符串等资源3.2 认识关键文件
AndroidManifest.xml相当于应用的身份证:
<manifest ...> <application android:icon="@mipmap/ic_launcher" <!-- 应用图标 --> android:label="@string/app_name"> <!-- 应用名称 --> <activity android:name=".MainActivity" android:exported="true"> <!-- 允许其他应用启动 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>MainActivity.java的主干结构:
public class MainActivity extends AppCompatActivity { @Override // 当界面创建时调用 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 加载布局文件 // 在这里添加你的代码 } }activity_main.xml的典型内容:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>4. 构建天气查询应用
4.1 界面设计
修改res/layout/activity_main.xml,添加以下控件:
- 一个EditText用于输入城市
- 一个Button用于触发查询
- 一个TextView用于显示结果
- 一个ProgressBar用于加载状态
完整代码:
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <EditText android:id="@+id/cityInput" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入城市名称"/> <Button android:id="@+id/queryButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="查询天气"/> <ProgressBar android:id="@+id/loadingBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> <TextView android:id="@+id/resultText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:textSize="18sp"/> </LinearLayout>4.2 添加按钮逻辑
在MainActivity.java中实现点击事件:
public class MainActivity extends AppCompatActivity { private EditText cityInput; private Button queryButton; private ProgressBar loadingBar; private TextView resultText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化视图 cityInput = findViewById(R.id.cityInput); queryButton = findViewById(R.id.queryButton); loadingBar = findViewById(R.id.loadingBar); resultText = findViewById(R.id.resultText); // 设置按钮点击监听 queryButton.setOnClickListener(v -> { String city = cityInput.getText().toString().trim(); if (city.isEmpty()) { Toast.makeText(this, "请输入城市名称", Toast.LENGTH_SHORT).show(); } else { queryWeather(city); } }); } private void queryWeather(String city) { loadingBar.setVisibility(View.VISIBLE); resultText.setText(""); // 模拟网络请求 new Handler().postDelayed(() -> { loadingBar.setVisibility(View.GONE); String mockResult = city + " 天气:晴 25℃\n空气质量:良"; resultText.setText(mockResult); }, 1500); } }4.3 添加网络权限
真实的天气查询需要网络访问,在AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.INTERNET" />注意:Android 6.0+需要动态申请危险权限,但INTERNET属于普通权限,只需声明即可。
5. 调试与优化
5.1 使用Logcat查看日志
Android Studio底部的Logcat窗口是排查问题的利器。在代码中添加日志:
Log.d("WeatherApp", "开始查询城市:" + city);通过过滤器可以快速定位你的日志:
- 按标签过滤:tag:WeatherApp
- 按级别过滤:level:DEBUG
5.2 解决常见编译错误
错误:Cannot resolve symbol R
- 清理项目:Build → Clean Project
- 重建项目:Build → Rebuild Project
- 检查XML文件中是否有错误
错误:ActivityNotFoundException
- 检查AndroidManifest.xml是否声明了Activity
- 确认Activity的exported属性设置正确
5.3 内存泄漏预防
在Activity中使用Handler时要注意:
// 错误写法:匿名内部类会隐式持有Activity引用 handler.postDelayed(new Runnable() { @Override public void run() { // 如果Activity已销毁,这里会导致内存泄漏 } }, 10000); // 正确写法:使用静态内部类 private static class MyRunnable implements Runnable { private final WeakReference<MainActivity> activityRef; MyRunnable(MainActivity activity) { this.activityRef = new WeakReference<>(activity); } @Override public void run() { MainActivity activity = activityRef.get(); if (activity != null && !activity.isFinishing()) { // 安全操作 } } }6. 打包与发布
6.1 生成签名APK
- 点击Build → Generate Signed Bundle / APK
- 选择APK(新手建议先不选Android App Bundle)
- 创建新密钥库:
- 路径:建议放在项目根目录
- 密码:至少8位字符
- 别名:自定义名称
- 有效期:默认25年
- 选择构建类型:
- Debug:测试用(自动签名)
- Release:发布用
- 选择签名版本:
- V1(Jar Signature)必须勾选
- V2(Full APK Signature)建议勾选
6.2 测试安装
将生成的APK文件(通常在app/release/目录下)传输到手机安装。如果安装失败,检查:
- 手机是否开启了"允许未知来源应用安装"
- 是否与现有debug版本冲突(包名相同但签名不同)
- minSdkVersion是否高于手机系统版本
6.3 发布到应用市场
虽然我们这个练习项目还达不到上架标准,但了解基本流程:
- 注册开发者账号(Google Play需要一次性支付$25)
- 准备素材:
- 512x512像素应用图标
- 至少2张截图(1080x1920)
- 功能描述文案
- 在Google Play Console创建应用
- 上传签名的APK或AAB文件
- 填写内容分级问卷
- 提交审核(通常需要1-3天)
7. 进阶学习建议
完成这个基础项目后,你可以继续扩展:
连接真实天气API:
- 使用Retrofit库发起网络请求
- 解析JSON响应数据
- 添加网络状态检查
增加数据持久化:
- 使用SharedPreferences存储最近查询记录
- 学习Room数据库框架
优化UI体验:
- 添加下拉刷新功能
- 实现天气图标动画
- 支持主题切换
学习架构组件:
- ViewModel管理界面数据
- LiveData实现数据观察
- 使用Repository模式分离数据源
推荐的学习路线图:
- 先掌握Java核心语法(面向对象、集合、IO)
- 学习Android四大组件(Activity、Service、Broadcast、ContentProvider)
- 深入理解Fragment和ViewModel
- 掌握主流开源库(Retrofit、Glide、Room)
- 学习性能优化技巧(内存管理、启动优化)