智能终端与移动应用开发-实验一
[TOC]
智能终端与移动应用开发:实验一
创建安卓HelloWorld工程,仔细观察工程结构
工程结果截图

创建工程
- 打开 Android Studio,选择 start a new Android Studio project
- 选择项目模版:选择 Phone and Tablet 中的 Basic Activity
- 配置这个项目:
Name: demoLanguage: JavaMinimum SDK: API 29: Android 10.0(Q)—— 最低版本要求,安卓10,豪横,哈哈。
- 点击 Finish,项目开始自动创建。
安安静静等着CPU狂转。 - 在
/Users/sevdaisy/AndroidStudioProjects/Demo就是刚刚创建好的工程
个人VSCode死忠粉 + 不是很喜欢Android Studio
我想试试在VSCode上完成最基础的安卓开发配置
能实现安卓工程的编辑,预览,测试即可。
更多其他功能再去Android Studio上去做
VS code 的 Android 基础配置
插件安装
- adelphes.android-dev-ext 必需 Android 基础
- dannark.androidlauncher 次要 安卓模拟器
- flimberger.android-system-tools 不懂,装着玩玩儿
建立 Task.json
- F1唤出VSCode命令栏,选择
>Tasks: configure Default Build Task配置默认生成任务 - 选择
创建task.json,再选择Others - 自动打开新建的
task.json,用下列代码复写这个文件
{"version":"2.0.0","tasks":[{"label":"AppSignKey","type":"shell","command":"keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias","windows":{"command":"cd gitoscandroid; del my-release-key.jks; keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias"},"group":"test","presentation":{"reveal":"always"}},{"label":"CleanApp","type":"shell","command":"${workspaceRoot}/gradlew clean","windows":{"command":"${workspaceRoot}\\gradlew.bat clean"},"group":"test","presentation":{"reveal":"always"}},{"label":"BuildDebugApp","type":"shell","command":"${workspaceRoot}/gradlew assembleDebug","windows":{"command":"${workspaceRoot}\\gradlew.bat assembleDebug"},"group":"test","presentation":{"reveal":"always"}},{"label":"InstallDebugApp","type":"shell","command":"${workspaceRoot}/gradlew installDebug","windows":{"command":"${workspaceRoot}\\gradlew.bat installDebug"},"group":"test","presentation":{"reveal":"always"}},{"label":"InstallReleaseApp","type":"shell","command":"${workspaceRoot}/gradlew installRelease","windows":{"command":"${workspaceRoot}\\gradlew.bat installRelease"},"group":"test","presentation":{"reveal":"always"}}]} |
- 上述
JSON提供了AppSignKey通过命令行生成签名文件CleanApp通过命令行清除生成目录BuildDebugApp通过命令行编译调试APPInstallDebugApp通过命令行把调试APP安装到手机或虚拟机InstallReleaseApp通过命令行安装签名后的发布APP
测试 task 是否正常 :: AppSignKey
- F1唤出VSCode命令栏,选择
>Tasks: Run Test Task运行测试任务 - 选择任务:
AppSignKey - 需要在VSCode的终端交互输入一堆信息
- 据说最关键的是设置的那个密码
- 我此次设置的是
zyy20201010 - 据说签名发布的时候需要用到
- 成功后应该在项目根文件夹生成一个
my-release-key.jks文件
测试 task 是否正常 :: BuildDebugApp
- 直接报错:
JAVA_HOME is not set and no 'java' command could be found in your PATH. - 那咱就不用它默认的
gradle了,自己装一个gradle来耍耍。顺便配一下阿里源
安装 Gradle
使用
Homebrew安装brew install gradle如果网络出问题的话:
- 自己根据命令行中展示的资源网址,去下载资源
- 切换到Homebrew的下载缓存目录
$HOME/Library/Caches/Homebrew/downloads - 用下好的文件代替下了一点点的**.incomplate文件**
- 记得
^c终止另一边正在“爬山”的brew install gradle
% ls | grep gradle-6.5.1-all.zip |
配置Gradle
cd $HOME/.gradle |
重测task 是否正常 :: BuildDebugApp
- 更改 VScode配置文件
task.json中的gradlew为which gradle的值 - 新的task.json如下
{"version":"2.0.0","tasks":[{"label":"AppSignKey","type":"shell","command":"keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias","windows":{"command":"cd gitoscandroid; del my-release-key.jks; keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias"},"group":"test","presentation":{"reveal":"always"}},{"label":"CleanApp","type":"shell","command":"/usr/local/bin/gradle clean","windows":{"command":"${workspaceRoot}\\gradlew.bat clean"},"group":"test","presentation":{"reveal":"always"}},{"label":"BuildDebugApp","type":"shell","command":"/usr/local/bin/gradle assembleDebug","windows":{"command":"${workspaceRoot}\\gradlew.bat assembleDebug"},"group":"test","presentation":{"reveal":"always"}},{"label":"InstallDebugApp","type":"shell","command":"/usr/local/bin/gradle installDebug","windows":{"command":"${workspaceRoot}\\gradlew.bat installDebug"},"group":"test","presentation":{"reveal":"always"}},{"label":"InstallReleaseApp","type":"shell","command":"/usr/local/bin/gradle installRelease","windows":{"command":"${workspaceRoot}\\gradlew.bat installRelease"},"group":"test","presentation":{"reveal":"always"}}]} |
- 重新用 **F1 **
>Tasks: Run Test Task选择 BuildDebugApp - 等了一会儿,EveryThing is OK,成功
设置任务快捷键
~/Library/Application Support/Code/User/keybindings.json中添加如下内容
{"key":"F6","command":"workbench.action.tasks.runTask","args":"InstallReleaseApp"},{"key":"F7","command":"workbench.action.tasks.runTask","args":"BuildDebugApp"},{"key":"F8","command":"workbench.action.tasks.runTask","args":"CleanApp"},{"key":"F9","command":"workbench.action.tasks.runTask","args":"AppSignKey"}, |
配置调试文件launch.json
注意这里添加”preLaunchTask”: “InstallDebugApp”,意思是在执行Android launch之前,先安装app
{"version":"0.2.0","configurations":[{"type":"android","request":"launch","name":"Android launch","appSrcRoot":"${workspaceRoot}/gitoscandroid/src/main","apkFile":"${workspaceRoot}/gitoscandroid/build/outputs/apk/debug/app-debug.apk","adbPort":5037,"preLaunchTask":"InstallDebugApp"},{"type":"android","request":"attach","name":"Android attach","appSrcRoot":"${workspaceRoot}/gitoscandroid/src/main","adbPort":5037,"processId":"${command:PickAndroidProcess}"}]} |
使Java语法插件生效 失败
# 在 app/.classpath 中添加下面这行 |
痛定思痛,决定了解一波 Andoid + Gradle
先说结论:
- 用VSCode直接在安卓项目内完成包的调用,别想了。
- 用VScode完成安卓的代码编写,Gradle运行,包括编译和安装apk等,都没有问题
- 之后的开发中,平时的编辑就使用VScode,等需要查询包函数的时候,再去AS的界面临时查询一下函数。
Android 工程结构

- 文件夹 app
- Java项目本体
- 如果用
Gradle来创建Java项目:gradle init --type java-application - 可以看到创建完的项目,和这个 app文件夹 长得一模一样
- 所以这个文件夹的结构,就是标准的,Java-applicationJava应用 的结构
- 包括,源码,外部包,静态资源,编译生成可执行文件,gradle自动编译脚本文件,Java项目基础配置,等文件。
- 文件夹 gradle 和 .gradle
- 安卓是用
Gradle这个工具来辅助工程的构建的。 - gradle文件夹 是
Gradle的本地支持文件,是这个项目的Gradle引擎本体 - .gradle隐藏文件夹 是
Gradle生成的本地编译文件,可以理解为Gradle编译缓存
- 安卓是用
- 文件夹 build,编译生成文件,不重要,不用管它。
- 文件夹 .idea .vscode .setting,都是IDE配套的辅助配置文件,也不重要。
- 比较特殊的是 .idea,因为安卓项目的官方支持IDE是Android Studio
- .idea 就是给 Android Studio 和 Intellij IDEA 用的配置文件
- 很多包的依赖配置都是写在这个 .idea 里的
- 依赖具体下载和路径配置都是由
Gradle负责,生成在 .idea 里的
- 项目根目录下还有林林总总的配置文件,不再赘述
Gradle
- 在 W3Cschool 学习了两天的【Gradle教程,Gradle用户指南中文版,Android Gradle用户指南】
- 安卓项目使用的插件是
com.android.application,和普通Java项目的Gradle插件java,application是冲突的。 - Gradle 每在一个项目启动的时候都会去尝试下载 Gradle 所需版本的 min/all .zip文件。
- 官网的链接在国内下载是挺慢的,偶尔还容易失败
gradle/wrapper/gradle-wrapper.properties是相关的配置文件- distributionUrl 是,将要下载的目标gradle.zip
- 将这个distributionUrl在浏览器中打开,下载保存到本地的固定位置。然后复制下载到本地的ZIP文件的绝对路径
- 更新distributionUrl的值为 “file://%s” % ( absolute_path_of_zip )
- 就可大大加速gradle的Server Connect
# gradle/wrapper/gradle-wrapper.properties 文件内容 |
- Java文件的依赖配置,最原生的方式就是
.classpath文件。Gradle可以帮忙来填充这个文件的内容。从而实现依赖的自动配置。 - Gradle 的 插件
'java'/'application',提供的 task:build 就是特别老实地填充.classpath文件内容。 - 而安卓用的Gradle插件
'com.android.application',和上述插件是冲突的,同时它十分倔强的修改并保持.classpath为神奇的短短几行,别说配置kind:lib了,它连kind:src都不肯配!我一改,它一运行task,就给改回去。 - 这就是为什么在VSCode的安卓插件和JavaPak插件都在的时候仍无法实现包引用定位的核心问题。
- 或许,其实可以有办法配置的吧,比如,重写
'com.android.application'提供的task:build什么的,相关的gradle语法支持我是查到了,但是,不想再搞了,算了算了。 - 最后,重复一下结论:
- 用VSCode直接在安卓项目内完成包的调用,别想了。
- 用VScode完成安卓的代码编写,Gradle运行,包括编译和安装apk等,都没有问题
- 之后的开发中,平时的编辑就使用VScode,等需要查询包函数的时候,再去AS的界面临时查询一下函数。
- 不喜欢 Android Studio 的原因,除了很多配置和热键的重新学习/配置成本太高之外,最重要的原因就是,它的原生界面实在是太丑了
- 但是发现一个网站的IDEA主题支持,还是蛮好的!!网站链接
- 我喜欢这两个:
编写Java,完成指定需求
需求截图

核心源代码
/** |
分析与回顾
先说缺点
- 类
ChineseNode和 类EnglishNode还是有相当一部分代码重复,属于冗余的。 - 主类
Week1中,static的修饰有些过于滥用的嫌疑,包括A() B() C() ArrayList<ChineseNode> wordMap_B都有滥用了static的嫌疑。只是一开始开发时写的顺手了后面懒得改。 - 关于如何实现多线程,额,不知道自己这个写法是否OK,心里稍稍有点没谱。
- 严格来说,部分的try-catch代码仍是可以优化的
- 比如,如果发现没有asset文件夹,要不要自动创一个,或者程序可以怎么报错然后再退出。
再说优点
- 整个项目的结构设计还是非常令我自己满意的。
- 项目整体采用【src,bin,lib,asset】的分块设计
- lib中放jieba分词的jar/rar包,这个包网上不是很好找,
- 我保留了一个自己的链接。下载链接
- asset中放静态资源Z01-example.txt、以及ABC三个函数各自生成的结果文件
- 核心业务逻辑:读取文件,解码信息,数据清洗,结果保存
- 读取文件内容,使用了
try-with-resouce的写法,简单方便安全易读。 - 解码信息,核心在于判断这个
char到底是什么字符。- 这部分功能专门抽离为类静态函数
checkLetter() - 首先调用了官方函数
Character.isLetter(),过滤了标点符号 - 其次通过简单方便易读的
if-elseif-...就可以添加对中文汉字的归类规则和对英文52个字母的归类规则 - 后期再想添加规则补丁,也就是添加 elseif语句 的事情,简单方便易读
- 这部分功能专门抽离为类静态函数
- 数据清洗,为了方便,设计了专门的【类
ChineseNode,类EnglishNode】- 美中不足就是这两个类的代码有些冗余,可以写个父类
MyNode - 数据的去重部分,使用了,arraylist 转 hashset 再转 arraylist 的写法
- hashSet 判断元素是否相同,需要同时重写
equals()和hashCode()函数 - 良好的习惯是,重写了
equals(),就应该重写相应的hashCode()
- hashSet 判断元素是否相同,需要同时重写
- 方便是方便了,不知道会不会特别影响性能。
- 主要是,都是List对象,我选择相信官方代码的性能(还是对这些List类的源码不够熟悉)
- 美中不足就是这两个类的代码有些冗余,可以写个父类
- 结果输出,
- 尝试了
(new ArrayList).forEach(),和,以lambda表达式(闭包函数)为函数参数的写法 - 新奇,有趣,方便,好玩。
- 尝试了