1.下载Android Studio

官网地址:Android Studio

安装教程:Android Studio 安装教程

默认下载即可,选定好SDK的下载地址即可。

1.1配置 Gradle 地址(建议)

在下载之后,可以配置一下Gradle的地址,这样在后续import项目时,出错后,方便修改。

Settings -> Build -> Build Tools -> Gradle中可以修改Gradle的仓库地址
Gradle

2.项目 clone

小米便签项目仓库地址: 小米便签

git clone 或者直接直接下载压缩包都可

3. import 项目

此处不能新建项目,直接把文件放入Android Studio,会有你意想不到的报错~

使用import的方式,通过Gradle 的方式编译整个项目。

sync的过程中,会有各种各样、莫名其妙的报错,部分报错的解决办法,见第5部分的报错解决

import

出现如下图所示即为,sync成功
sync

3.1 Gradle 项目

gradle是基于Apache Maven概念的项目自动化构建开源工具。他是使用一种基于groovy的 特定领域语言来声明项目配置,抛弃了基于XML的各种繁琐配置。

gradle都是基于groovy的,但是由于其提供了一整套DSL,所以在开发gradle脚本时几乎脱离了groovy的感知。我们在这里将gradle当做一个独立的部署工具。

工作流程:

  • 解析setting.gradle文件然后去遍历根目录,检查子项目是否满足规定。
  • 解析每个子project的gradle,然后根据Task去构建项目之间的有向无环图。
  • 直接执行,涉及到刷新下载依赖,以及build构建发布包等等。

4.创建虚拟机,运行项目

sync结束后,点击右上角的build锤子按钮编译整个项目

出现如下图所示,即为编译成功

bulid

创建虚拟机,选择Device Manager

device

点击create device -> Pixel 2

create

选择好镜像,下载即可完成虚拟机的配置

mirror

运行项目即可看到小米便签

result

5.报错解决

5.1 Gradle xxxxx not found 或者 Connect time out

修改build.gradle:notes(全局的配置文件),添加google() 用于加速下载,’classpath’修改为所需要的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.1.3'
}
}

allprojects {
repositories {
google()
jcenter()
}
}

修改 gradle-wrapper.properties,distributionUrl改为自己需要的版本,将-all 同意修改为-bin

1
2
3
4
5
6
#Mon Nov 27 16:26:33 CST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

修改后,再次sync,若仍然报错not found ,则去gradle下载,找到自己对应的版本,下载后,放入你上面配置的gradle地址下\gradle\wrapper\dists下对应的gradle文件夹下面,将其中的其他文件删除,放入下载好的压缩包即可。

若再次报错,检查自己之前使用idea破解版时,使用的脚本,这些脚本执行后,会生成带中文路径的环境变量,导致报错。执行uninstall脚本文件,然后再次sync,此时大概率是没有问题了。

5.2 版本不匹配

版本不匹配问题在报错信息提示中,有明确的指示

1.JDK版本与Gradle不匹配

jdk
按照需要的版本修改jdk或者gradle,详见gradle官方配置文档。(推荐修改JDK)

2.compileSdkVersion与targetSdkVersion版本不一致

设置为一致即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apply plugin: 'com.android.application'

android {
namespace "net.micode.notes"
useLibrary 'org.apache.http.legacy'
compileSdkVersion 30
buildToolsVersion "34.0.0"

defaultConfig {
applicationId "net.micode.notes"
minSdkVersion 14
targetSdkVersion 30
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}

dependencies {
implementation files('D:\\Maven\\http-client\\httpclient-4.5.5.jar')
}

5.3 httpclient报错

此处报错问题是由于项目中缺少httpclient依赖,去maven仓库下载jar包,导入即可。

Files -> Project Structure -> Dependency

jar

5.4 switch case中 R.id 报错

将普通Android工程转成Library工程后,常量发生变化

1
2
3
4
//Library工程的R文件
public static int gift_pop_hide=0x7f04000f;
//普通工程的的R文件
public static final int abc_fade_in=0x7f040000;

由于Library工程的可以包含资源文件,编译会生成R文件,多个Library中可能出现id冲突的问题。为了解决这个问题谷歌将Library工程R文件才从静态常量变为非常量。

然而switch语句的case中 必须是常量,而此时的R.id.xxx为非常量,所以报错了。

修改switch语句为if else语句。Android studio中提供快速切换方法。如下:

选中“switch”,ALt+Enter同时选中,弹出对话框,选择“Replace ‘switch’ with ‘if’”

switch

5.5 Cannot resolve method ‘setLatestEventInfo’ in ‘Notification’

原因:在低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法;而在高于API Level 11的版本中setLatestEventInfo()函数已经被弃用了,于是我们需要根据现有的Android版本进行相应地重写该函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void showNotification(int tickerId, String content) {
PendingIntent pendingIntent;
if (tickerId != R.string.ticker_success) {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesPreferenceActivity.class), 0);

} else {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesListActivity.class), 0);
}


Notification.Builder builder = new Notification.Builder(mContext)
.setAutoCancel(true)
.setContentTitle(mContext.getString(R.string.app_name))
.setContentText(content)
.setContentIntent(pendingIntent)
.setWhen(System.currentTimeMillis())
.setOngoing(true);
Notification notification=builder.getNotification();
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
}

5.6 小米菜单栏无法显示

只需修改res/values/styles.xml最后一部分如下即可。

1
2
3
4
<style name="NoteActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
<!-- <item name="android:displayOptions" />-->
<item name="android:visibility">visible</item>
</style>