Android Studio小米便签部署

前言:

       在实现小米便签开源代码的部署需要准备做一些准备工作,其中包括开发环境的搭建,开源代码的部署,以及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>

就可以看见其他功能

 

致谢

感谢如下博客提供的解决办法的思路:

参考博客1

参考博客2

 

### 小米便签应用中的UI部分开源代码及注释 对于小米便签应用程序的开发,通常会采用Vue.js框架及其配套组件库来构建用户界面。基于提供的参考资料[^2]和[^3],可以推测该类项目可能使用的前端技术栈。 #### 使用Vue.js构建的小部件示例 考虑到`mint-ui`, `vant`等都是针对移动端优化过的Vue组件库,在实现笔记类APP时可能会用到这些资源。下面是一个简单的卡片式布局例子: ```vue <template> <div class="note-card"> <!-- 卡片头部 --> <header class="card-header"> <span>{{ note.title }}</span> <button @click="deleteNote">删除</button> </header> <!-- 主体内容区 --> <main class="card-body">{{ note.content }}</main> <!-- 底部操作栏 --> <footer class="card-footer"> <time :datetime="note.date">{{ formatDate(note.date) }}</time> </footer> </div> </template> <script> export default { props: ['note'], methods: { deleteNote() { /* 删除逻辑 */ }, formatDate(dateString) { const options = { year: 'numeric', month: 'long', day: 'numeric' }; return new Date(dateString).toLocaleDateString(undefined, options); } } } </script> <style scoped> .note-card { ... } .card-header {...} .card-body{...}.card-footer{...}; </style> ``` 此模板定义了一个具有标题、正文以及创建时间显示区域的基础记事本条目样式,并提供了基本交互功能如点击按钮触发事件处理程序以移除记录项。同时通过CSS设置视觉效果使得页面更加美观易读。 为了提高用户体验并确保跨平台兼容性,开发者往往会利用成熟的第三方库来进行快速迭代开发工作;而关于具体如何集成上述提到的各种工具,则取决于实际应用场景和个人偏好等因素决定。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值