前言:
在实现小米便签开源代码的部署需要准备做一些准备工作,其中包括开发环境的搭建,开源代码的部署,以及copy到自己电脑上代码运行是否存在一一些问题和问题的整改。
一,环境的搭建
1.1 配置jdk
运行小米便签代码jdk是不可少的,需先检查自己电脑是否配置jdk的操作为:WIN+R唤出电脑运行功能,输入cmd打开命令提示窗口后输入这一条指令:java -version如果配置了jdk就会显示它的版本号
如果你在输入时候没有显示该下内容就需要进行下载与配置jdk,下载地址为:Java Downloads | Oracle 中国https://www.oracle.com/cn/java/technologies/downloads/#jdk23-windows
配置环境变量
此电脑-右键点击属性-高级系统设置-环境变量-
变量名:JAVA_HOME 变量值:jdk的安装目录
变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
Path变量变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
随后上述步骤在cmd中输入java -version就会显示出jdk版本。
1.2 Android Studio下载
下载地址:Download Android Studio & App Tools - Android Developers
安装过程中可能有些同学有归类的习惯修改安装路径或者创建一个一个文件夹放进去
我这边建议就是在自己想创建的盘,创建一个
android文件夹子文件夹分别创建三个为:
1:Android Studio(用于安装软件的路径)
2 : AndroidSDK(用于存放SDK的文件夹)
3:Gradle(用于存放gradle的文件夹)
1.3 Gradle的配置
1.gradle的下载地址Gradle | Releases可根据自己需要的版本点击binary-only下载,下载自己需要的gradle的版本,解压后直接拉到3:Gradle的文件夹下面,
2.配置环境变量
变量名GRADLE_HOME变量值:gradle的安装路径
变量名GRADLE_USER_HOME变量值:gradle的路径
在path系统变量中新增:%GRADLE_HOME%\bin
3.验证gradle是否安装成功,打开cmd命令行输入gradle -v
环境配置都一切ok开始进行详细的Android studio的安装
官网直接下载
双击接受,开始下载
next
继续next
在这里这个安装路径可以换成自己上面创建的1的Android studio的文件夹(整理起来比较简洁),继续next
Install!
等待下载完成
next
finsh
不导入任何配置 ok
选择 dont’t send
next
这个警告是想让我们配置代理,不管,直接取消
继续next
这块这个sdk路径可以选择上面创建的那个SDK的文件夹,自定义一下
根据自己电脑上的默认4G就行,然后点击next
一直next下一步
将两个都点Accept接受然后Finish
现在下的老慢了,下不动只能等待,(要是真的等了好久都没动,可是直接关闭,先不进行下载直接进入)
More Actions点seeting
No proxy不选择用Android studio的代理,可以换一下这个阿里云的代理能够快一点;
http://mirrors.aliyun.com80
然后Apply-ok就完毕,
然后在下载自己需要的SDK版本,更改自己下载SDK的路径,就耐心的等待下载
2.1构建项目缓慢的问题
选择这个Empty Views Activity创建一个空项目,
如下配置,注意包名为net.micode.notes,因为原项目的开发语言是用Java的,故我们Language也选择Java:
进入后就会开始构建,大概率会构建失败,或者一等等好久没有反应最后还是失败,
因为此时的Gradle拉不下来
项目的构建是Android Studio的gradle,我们可以点到这个配置文件,切换地址
第六行这个gradle的地址是国外的东西。下载速度慢的要死,懒得喷 这里我们可以改一下地址换成
阿里云的地址:https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.9-bin.zip
直接复制把最后一句的8.9改成自己需要的gradle的版本,
然后在seetings gradle()的配置文件中找到repositories{ 这个地方添加上这串代码 )
maven { url=uri( "https://maven.aliyun.com/repository/central") }
maven { url=uri( "https://maven.aliyun.com/repository/public") }
maven { url=uri( "https://maven.aliyun.com/repository/google") }
maven { url=uri( "https://maven.aliyun.com/repository/gradle-plugin") }
这个时候就可以点锤子开始构建项目了就是从maven库里面下载就会快很多,
2.2小米便签项目原代码zip安装包
下载地址:https://codeload.github.com/MiCode/Notes/zip/master
3.将源码对应的文件复制到Android项目对应的及文件下
3.1首先把项目 Notes-master\src\net\micode\notes 下的包全部导入 Android Studio 的 net\micode\notes 下:
3.2 把 Notes-master\res 目录下的包全部导入 Android Studio 的 res 中:
重复的文件选择Overwrite:
3.3
开始把清单文件的内容导入:(把各个Activity标签包裹的内容套入即可)
最好导入完的清单 manifest 内容如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Notesmaster"
tools:targetApi="31">
<activity
android:name=".ui.NotesListActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/NoteTheme"
android:uiOptions="splitActionBarWhenNarrow"
android:windowSoftInputMode="adjustPan"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.NoteEditActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:theme="@style/NoteTheme"
android:exported="true">
<intent-filter >
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter >>
<intent-filter >
<action android:name="android.intent.action.INSERT_OR_EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<provider
android:name="net.micode.notes.data.NotesProvider"
android:authorities="micode_notes"
android:multiprocess="true" />
<receiver
android:name=".widget.NoteWidgetProvider_2x"
android:label="@string/app_widget2x2"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_2x_info" />
</receiver>
<receiver
android:name=".widget.NoteWidgetProvider_4x"
android:label="@string/app_widget4x4"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_4x_info" />
</receiver>
<receiver android:name=".ui.AlarmInitReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name="net.micode.notes.ui.AlarmReceiver"
android:process=":remote" >
</receiver>
<activity
android:name=".ui.AlarmAlertActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" >
</activity>
<activity
android:name="net.micode.notes.ui.NotesPreferenceActivity"
android:label="@string/preferences_title"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Holo.Light" >
</activity>
<service
android:name="net.micode.notes.gtask.remote.GTaskSyncService"
android:exported="false" >
</service>
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.NoteEditActivity" />
<!-- <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>
4. 错误1 :错误提示乱码
点击小锤子(Make Model '......')构建项目,然后会出现如下问题,但是错误提示乱码:
双击shift,然后搜索vmoption,然后点击Edit Custom VM Options...
然后在末尾补上代码 :
-Dfile.encoding=UTF-8:
重启项目后再点击绿色的小锤子构建项目,然后这时的报错信息就很清晰了:
5 依赖下载
源码依赖于一个httpcomponents-client组件,以执行网络服务,这里我们需要去下载依赖:
下载地址:https://dlcdn.apache.org//httpcomponents/httpclient/binary/httpcomponents-client-4.5.14-bin.zip
然后把我们下载好的zip包解压并且放在如下目录
在Android Studio导入依赖:
左上角File-Project Structure-Dependencies-+
填写绝对路径,这里我下载的依赖库路径是:
C:\android\Notesmaster\httpcomponents-client-4.5.14-bin\lib
导入后,我们会发现app目录下的build.gradle多了如下内容:
5.2 修改代码,否则会出现jar包冲突问题
将上述代码注释掉,然后替换代码
// implementation(fileTree(mapOf(
// "dir" to "D:\\Code\\AndroidCode\\Notesmaster\\httpcomponents-client-4.5.14-bin\\lib",
// "include" to listOf("*.aar", "*.jar"),
// "exclude" to listOf("")
// )))
//修改为如下代码:
implementation(files("C:\\android\\Notesmaster\\httpcomponents-client-4.5.14-bin\\lib\\httpclient-osgi-4.5.14.jar"))
implementation(files("C:\\android\\Notesmaster\\httpcomponents-client-4.5.14-bin\\lib\\httpclient-win-4.5.14.jar"))
implementation(files("C:\\android\\Notesmaster\\httpcomponents-client-4.5.14-bin\\lib\\httpcore-4.4.16.jar"))
注意!注意!注意!将这行的里面的代码地址换成刚才自己那个依赖包存放的地址从lib及其以前的都换成自己的位置因为我的地址是C:\android\Notesmaster\httpcomponents-client-4.5.14-bin\lib所以我的地址是从C盘开始的,改成自己的地址。
6 错误2 :找不到符号 notification.setLatestEventInfo...
这时,又会报如下错误:错误: 找不到符号 notification.setLatestEventInfo(......)
C:\Android\Notesmaster\app\src\main\java\net\micode\notes\gtask\remote\GTaskASyncTask.java:80: 错误: 找不到符号
notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
^
符号: 方法 setLatestEventInfo(Context,String,String,PendingIntent)
位置: 类型为Notification的变量 notification
定位到该GTaskASyncTask.java位置,注释掉这段代码
修改为一下代码:
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), PendingIntent.FLAG_IMMUTABLE);
} else {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesListActivity.class), PendingIntent.FLAG_IMMUTABLE);
}
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);
}
7.错误3:switch语句报错Constant expression required
再次构建项目,然后又遇到错误:switch语句报错Constant expression required
C:\Android\Notesmaster\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java:511: 错误: 需要常量表达式case R.id.menu_new_note:
然后一直显示找不到常量表达式
解决这个问题的方法很多你们也可以参考其余博主的博客来解决这个问题
【已解决】switch语句报错Constant expression required
报错原因:在JDK17中switch语句的条件表达式支持使用枚举类型,而这个特性还没被Android Studio支持
有多个解决方法大家可以在这个博主博客中进行解决这个问题
我这边推荐最简单的方法就是:在gradle.properties配置文件下添加如下代码
android.nonFinalResIds=false
8.错误4:files found with path ‘META-INF/DEPENDENCIES’ ...
又会出现错误
3 files found with path 'META-INF/DEPENDENCIES'.
Adding a packaging block may help, please refer to https://developer.android.com/reference/tools/gradle-api/8.3/com/android/build/api/dsl/Packaging for more information
这里我们需要解决重复包含文件的问题:
在build.gradle(Module:app)的android字段里面,加上这段代码,排除掉冲突的系统依赖包即可
packaging {
resources.excludes.add("META-INF/DEPENDENCIES");
resources.excludes.add("META-INF/NOTICE");
resources.excludes.add("META-INF/LICENSE");
resources.excludes.add("META-INF/LICENSE.txt");
resources.excludes.add("META-INF/NOTICE.txt");
}
10.成功部署
10.1 虚拟机的下载
点击右边的任务栏后点击加号
根据自己的喜好选择需要下载的虚拟机,Next-next-Finsh下载,此时虚拟机就安装成功了
至此,项目部署完成,我们点击 Make Module 这个小锤子 ,以及 Sync Project with Gradle Files 按钮,就可以准备运行 小米便签 APP 了。
10.2 错误5:可能有些人的会存在启动按钮是灰色的不知道是怎么回事,无法启动
解决方法:File点击Sync Project with Gradle Files就ok
10.3 错误6 :项目都构建好了,点了启动按钮却不能唤出虚拟机,运行不出来
出现rror running ‘app The emulator process for AVD Pixel 6 Pro API 34 has terminated.
或者就是左边显示,‘'app'xxxxx模拟器启动失败的一些英文,
错误原因:那可能是因为AVD的默认存放路径中有中文的用户名,导致运行出现问题,这边建议自己拿到电脑自己用户名尽量是数字或者英文,中文会导致一些错误,这个用户名也不要自己私自改成英文。建议找懂系统的人给你改。
这个问题可能会有少数人出现,因为每个人跟每个人的电脑配置操作不一样
解决方法:
方法1:我这边因为碰到过这个问题,我自己的解决方法是,使用自己的安卓手机连接USB线在自己手机上运行
手机开启开发者选项-打开USB调试-打开USB安装,这块则会显示自己的手机点击运行按钮则会用自己的手机调试
方法2:我不会所以只能推荐别的博客
Error running ‘app The emulator process for AVD Pixel 6 Pro API 34 has terminated.运行“应用”时出错 AVD 的仿真
11.软件的运行
如果没有遇到上面的两个问题在第十步的时候就会运行成功,
关于小米便签功能不完全的问题
在小米便签部署完后,我们运行了一下小米便签,尝试其功能,发现只有书写标签的功能,这是因为源码中在res.values包下的 styles.xml 设置有问题。
将上面截取代码改为
<style name="NoteActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
<item name="android:visibility">visible</item>
</style>
就可以看见其他功能
致谢
感谢如下博客提供的解决办法的思路: