缘起

  之前在玩一款 VR 游戏:一起来捉妖。这款游戏是使用地图进行游戏的。无奈网上找了各种工具,要么付费,要么不好使。想想自己就是个程序猿,于是乎决定自己开发一个。现在游戏基本放弃了,但是为了游戏而学到的技术不能丢,现在直接开源:https://gitee.com/zcshou/gogogo

代码我会一直维护(趁机多学习学习),遇到的问题我也会不断更新在这篇文章中。

  其实,这篇文章很早就在博客的草稿箱中,不知为何 CSDN 一直审核不过。提交审核也没有显示审核不过的具体原因!文章就是一个分享我的一个安卓开发经历,没有啥违规吧!?怪哉,怪哉!

初识 Android Studio

  作为一名嵌入式软件工程师,对于移动开发可以说知之甚少,于是乎各种 Google 搜索补课。经过了解,Android 开发最开始使用 Eclipse + ADT,后来在 Android 官网找到一篇博客说,Google 将结束对 Eclipse + ADT 的开发以及停止支持,把重心完全转移到Android Studio。那我就从 Android Studio。

  其实,在 Android Studio 刚发布的时候,我就了解过这个 IDE。当初听说谷歌发布了新的开发工具,出于好奇就下载了看了看。只是本人并不是做安卓开发的,安装后还要从谷歌下载一堆东西,感觉好麻烦也就没有做太多的了解。如今还是得继续学习一下。

  由于我也是个移动开发的外行,因此本文并不会系统说明如何进行 Android 开发,当然,我也没有这个能力。所以,以下文章就是记录我第一次搞 APP 的一些记录。记录一下我遇到的问题及处理方法。还有就是,由于是初学,往往是一旦有问题就需要各种头脑风暴,一不留神就跑没影了!!!

头脑风暴: 头脑风暴这个方法是怎么来的?谁创建的?

头脑风暴: Google 最近又搞了一个 Fuchsia OS,目前用途还不详,先去了解一下!

安装

  安装很简单,下载安装包,直接一路下一步即可!貌似 Windows 的一个最大的优点就是软件安装可以一路下一步,很少要考虑各种使用命令行从各种软件仓库进行安装!

  根据我这段时间的使用,Android 每次更新都可能出现一些列的问题,我们很有必要重点关注以下地址的内容:https://developer.android.google.cn/studio/releases

头脑风暴: Python 软件仓库?Node.js 软件仓库?Nuget 软件仓库?Linux 发行版的软件仓库?

配置

  这里所谓的配置主要是指更改 Android Studio 下载的各种文件的位置。如果我们不进行配置,Android Studio 会把我们需要的各种文件都放到系统盘的用户目录下。其中很多内容都会占用大量存储空间,而我之前装系统时分配的系统盘只有 100G,目前空间比较紧张(现在的开发工具是真的占空间,Visual Studio、Android Studio 就占了好几个 G,还没算他们下载的各种 SDK 和 工具),因此我选择将这些下载的内容放到一个指定的目录下。

  1. 修改默认的 Android Studio 的配置文件及其使用的各种配套工具的位置

    1. .android:这个文件夹里会有模拟(AVD,Android Virtual Device Manager)的相关文件,空间还是很大的。

      这个需要直接建立环境变量,如下图所示:

    2. .AndroidStudio:这个文件夹是 Android Studio 的配置文件夹,主要存放一些AndroidStudio设置和插件和项目的缓存信息

      这里的修改需要直接修改 Android Studio 安装目录下的配置文件:idea.properties,如下图所示:

      注意: 在后续 Android Studio 版本升级时,默认会覆盖该文件,所以,升级后需要重新修改该文件!!否则,导致 Android Studio 在升级后的第一次启动会提示找不到相关文件。

    3. .gradle:这个文件夹是构建工具 Gradle 的配置文件夹,也会存储一些项目的构建缓存信息,如下所示:

      打开 Android Studio,菜单:File->Settings,如下图所示的对话框中进行修改
      2. 修改下载的 Android SDK 的位置。这个直接在下载 SDK 时指定位置即可。

Android SDK

  要使用 Android Studio 进行 APP 的开发,必须先下载对应的 Android SDK 及配套的 SDK 工具。具体方法是:File -> Settings,如下图所示的位置选择需要的 SDK 及工具:

Gradle

  Android Studio 构建 APP 时,还需要使用 Gradle。大体了解了一下,就是一个构建工具。估计和 CMake 之类的类似吧!但是不知道为啥,这个玩意下载也是贼慢!解决方法可以直接从网上自己下载,然后放到 Android Studio 对应的下载目录下。 但是需要注意对应的文件夹名字!

  Gradle 不止下载慢的一批,编译一个 APP 也是够慢的!而且每次升级 Android 版本都要同步更新 Gradle 插件版本以及 Gradle 版本。下图是 Google 官方给出的两者的对应关系:

其实不止上面他俩有版本的对应关系,他俩与 Android Studio 的版本也有对应关系。

头脑风暴: Gradle、Cmake、Xmake、Makelist 这些有啥区别和联系。

Android Studio 的项目

  学习的第一步当然是建立一个默认的项目,看看它是怎么管理项目的。打开 Android Studio 建立第一个项目,主界面菜单内容是真多,看的眼花缭乱。
  接下来就是是各种 Google 搜索,了解 Android Studio 基本的使用方法。经过了解 Android Studio 中项目的基本结构大体就是下面这样了:

其中还有好多内容,后面慢慢了解。

说实话,百度的搜索结果真是一言难尽。Google 的第一个大多数就是解决方法,百度却是广告等一堆没用的。

Java SDK

  根据我的了解,Android 的开发其实是可以用很多种开发语言的。其中就可以直接使用 C / C++ 来开发 APP,使用 C / C++ 需要在 Android SDK 中下载 NDK,现在叫 NDK(Side by side)。但是,网上直接使用 C / C++ 来开发的示例、介绍文章比较少,无异于增加了我的开发难度,因此果断放弃。

  后来,JetBrains 开发了一门兼容 Java 的新的开发语言 Kotlin。随着 Google 和 Oracle 的官司不断, Google 果断宣布将 Kotlin 作为 Android 的官方开发语言。但是,虽然说与 Java 100% 兼容,但是,好多语法都有变化,对于我来说学起来还是有些费劲的,而且,目前 Kotlin 的 APP 还不是很多(在我搞这个 APP 的时候,Kotlin 刚出没多久),因此,放弃使用 Kotlin。

  最后决定采用 Java 进行 APP 的开发。Android APP 开发需要安装 Java SDK。同样,我对于 Java 并不了解,平时基本只用 C / C++,偶尔会用 C# 或者 Qt 开发一些小工具来辅助自己的开发工作。于是乎又是各种 Google 搜索 Java 与 Android 关系的资料。以下 3 点介绍取自于知乎网友(https://zhuanlan.zhihu.com/p/378582001):

  1. Java SE(Java Platform,Standard Edition):Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
  2. Java EE(Java Platform,Enterprise Edition):这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。
  3. Java ME(Java Platform,Micro Edition):这个版本以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

头脑风暴: Java vm 与 Android Dalvik 有啥区别与联系

  在安装 Java SDK 时我也遇到了一个大坑。一开始决定使用 Java 之后,就先去 Oracle 官网下载 Java SDK,结果直接下载了最新的 Java SE 16,然后编译用 Android Studio 建立的示例程序都是各种错误。。。后来才知道,每一个 Android 版本都对应一个 Java 版本,必须配合使用。

  目前,Android APP 的开发绝大部分还在使用 Java 8,部分开始过度到 Java 11。于是又下载了 Java 8 安装,为了担心有其他影响,我直接卸载了 Java 16,此时,终于可以正常编译一些示例 APP 了。后来了解到了一些 Java 11 的语法改进感觉挺好,Android 开发也开始支持 Java 11 了,于是又下载 Java SE 11 进行了安装(同时保留了Java 8),在 APP 开发中,指定使用了 Java 11。

定位 APP

原理

大体了解了一下定位 APP 的开发原理。无非就是以下四个:

  1. 自己编译安卓系统,然后适配各手机,为所欲为!
  2. 获取 ROOT 权限,然后使用 xposed 拦截定位相关的 API,篡改定位数据。
  3. 使用 VirtualAPP、太极之类的的虚拟环境,虚拟一个设备,在里面虚拟环境中为所欲为!
  4. 使用 Android 提供的测试 API 进行修改

四种方法的难易程度也是依次降低的!

  • 第一种:一般人就别想了,不一般人也别想了!
  • 第二种:现在最新的 Android 手机厂商都已经限制 ROOT 权限了,难度越来越大!
  • 第三种:VirtualAPP 目前由开源转为了收发模式,原来的开源版不再支持最新的 Android 10。收费版倒是很不错!太极修改定位仍然需要 ROOT 权限
  • 第四种:难度最简单

头脑风暴: 最近有网友分析了最新版的 VirtualAPP 源代码,已经可以支持 Android 11 了,是时候再去好一波羊毛了。用不用先不管,先把分析的源码保存到自己的仓库再说。

  知道了上面的实现原理接下来就是开始搞了。从头开始貌似有些难啊!抓紧去开源社区找了找。发现了不少大佬开源了一些实现方法,只是功能都不完善,仅仅是介绍了如何使用而已!在此,先感谢下面的这个几个网友:

  1. https://github.com/Hilaver/MockGPS
  2. https://github.com/bxxfighting/together-go
  3. https://github.com/P72B/Mocklation

示例不仅仅以上几个,还有很多这里就不列举了。参照以上的示例,新建工程,开始一点点写代码内容!

头脑风暴: 国内基本搜不到相关示例,再去国外找几个抄一抄吧!

百度地图

  开发初期,纠结到底是使用百度地图,还是高德地图,还是腾讯地图,在参考了各种示例之后,绝对采用百度地图。使用百度地图开发,开发者在使用 SDK 之前需要获取百度地图移动版开发密钥(AK),该 AK 与百度账户相关联。百度官网有详细的步骤:https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak。参照步骤一步一步来即可。其中有个比较麻烦的就是要获取签名信息!Android APP 必须要有签名才可以发布。这个得专门一个章节来说。

头脑风暴: 百度地图会不会自动给我弹出广告,让我去莆田系看病!要不要竞价才能使用地图的全部功能?

头脑风暴: 我的 APP 的秘钥指纹都在百度登记了,我的位置不就是直接暴露给它了?它会不会拿我的位置做大数据分析,然后有针对性的推送广告?

头脑风暴: 得去了解一下高德和腾讯是不是也是同样的使用套路

初始化百度地图

  从权限的配置开始,到地图的初始化,官网有很详细的步骤:https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/showmap,我就是按照这个步骤来搞的。

初始化定位

  刚开始比较纳闷,百度地图 SDK 和 百度定位 SDK 不是一个东西么?后来经过了解才知道,百度地图是由地图和定位两部分组成的,地图负责呈现我们看到的地图,定位负责是地图上显示的位置。

  定位 SDK 的初始化配置,官网也有详细步骤:https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/location,安装这个步骤操作即可。

摇杆的实现

  关于游戏摇杆,网上有很多网友搞了示例,有的设置做成了库,以供大家使用。我当初也搜集了很多摇杆的实现,但是没有一个是符合我需求的。无奈只能参考各位网友的代码,自己实现了一个:

摇杆由两部分组成:方向控制部分 + 功能按钮部分。其中的方向控制部分我目前实现了两种:按钮和圆形,。可以根据喜好选择使用哪一种来使用(APP 设置中添加了一个设置项)。

  按键方向控制使用了 layout 布局来搞,圆形方向控制则直接使用代码来绘制的,目前还不会(也不知道能不能)直接通过 layout 布局来实现。

  最开始,我先实现了一个按钮方向控制,因为这种比较简单,每个按钮一个点击事件,负责处理方向。在实际使用中,发现方向的控制不够灵活,只能固定的方向,而后有搞了后面这个圆形的方向控制,方向根据角度自动计算,这样就可以灵活的处理各种方向了。

  最后再用一个类处理这两种类型的方向控制以及摇杆的功能按钮就可以了。这个类就用到了 Android 的悬浮窗的设置。同时,要使用悬浮窗必须还要请求权限。

LOG 记录

  第一次写 Android APP,问题一大堆,总是时不时有崩溃!最开始,在我的华为手机上用的好好的,结果后来换了个小米,安装、打开、闪退。。。一上来就凉凉崩溃了。。。一搜索才知道,国内这些手机厂商推出的安卓都是自己瞎胡搞的,APP 需要适配各家的手机系统!!!我就一个摔坏的华为,一个屌丝小米。。。

  在了解的过程中,发现有许多现成的日志库,可以实时记录 APP 的运行状态,如果出现了问题,就可以从日志中查找原因。于是又是各种 Google,发现还真不少:Logger、xlog、微信Mars-xlog、Klog 等等。

  直接查看各个日志库的手册,看看哪个用起来最简单,哪个更新比较活跃。最终经过一份对比,我选择了 xlog 来记录 APP 中的各种信息。配置一下就可以直接在所有文件中直接调用了:

  其实最开始我看好多人分享的代码中,经常有 log.ilog.elog.d 等这些东西,后来经过了解才知道,这个其实是 Android 官方提供的 Log 库,我们可以用它来输出很多调试信息。只不过,这个有些简陋,很多人就搞了一些功能更强大的日志库。

文件分享

  在添加完日志之后,紧接着就是要实现分享。因为文件是放在 APP 的安装目录中的,用户一般没有权限看到这个目录,也因此不能获取到这个文件。而且如果让用户来主动找文件发送给作者,也太麻烦了!

  在 Android 官网搜了一下,Android 原生就有分享功能,直接使用原生的分享非常简单,官方教程:https://developer.android.google.cn/training/secure-file-sharing?hl=zh_cn 。按照官网的实现之后就是下面这样了:

方向传感器

  百度地图+定位配置完成后,发现定位的指针不会随着方向变化而变化。经过搜索才知道需要添加对于方向传感器的静态操作。找了很多网友分享的方法,基本都是下面这样的:

 ...省略...
mSensorManager=(SensorManager) context.getSystemService(Context.SENSOR_SERVICE);if(mSensorManager!=null){//获得方向传感器mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);}if(mSensor!=null){mSensorManager.registerListener(this, mSensor,SensorManager.SENSOR_DELAY_UI);//第三个参数为经度}...省略...@Override
public void onSensorChanged(SensorEvent event) {//如果事件返回的类型是方向传感器if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){float x=event.values[SensorManager.DATA_X];//如果变化大于一度if(Math.abs(x-lastX)>1.0){//通知主界面进行回掉if(mOnOrientationListener!=null){mOnOrientationListener.onOrientationChanged(x);}}lastX=x;}
}

经过我的测试,根本就无效!!由于 Sensor.TYPE_ORIENTATION 被 Google 标记为 过时,也有的文章中直接将 Sensor.TYPE_ORIENTATION 换成了 Sensor.TYPE_ACCELEROMETER,实际也是不行的。

经过我在 Android 官网传感器介绍(https://developer.android.com/guide/topics/sensors/sensors_overview)中的不断摸索,以及在 Google 上不断搜索,最终找到解决方法:需要同时使用 Sensor.TYPE_ACCELEROMETERSensor.TYPE_MAGNETIC_FIELD 。具体代码如下:

...省略...
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);// 获取传感器管理服务
if (mSensorManager != null) {mSensorAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);if (mSensorAccelerometer != null) {mSensorManager.registerListener(this, mSensorAccelerometer, SensorManager.SENSOR_DELAY_UI);}mSensorMagnetic = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);if (mSensorMagnetic != null) {mSensorManager.registerListener(this, mSensorMagnetic, SensorManager.SENSOR_DELAY_UI);}
}
...省略...
@Override
public void onSensorChanged(SensorEvent sensorEvent) {if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){mAccValues = sensorEvent.values;}else if(sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){mMagValues = sensorEvent.values;}SensorManager.getRotationMatrix(mR, null, mAccValues, mMagValues);SensorManager.getOrientation(mR, mDirectionValues);mCurrentDirection = (float) Math.toDegrees(mDirectionValues[0]);    // 弧度转角度if (mCurrentDirection < 0) {    // 由 -180 ~ + 180 转为 0 ~ 360mCurrentDirection += 360;}
}

开发环境问题

Compatible side by side NDK version was not found.

  这个是由于默认没有安装 NDK,Android Studio 给出的一个提示,项目不使用 NDK 其实没啥影响。强迫症患者,可以考虑安装 NDK。
  具体:菜单 Tools --> System Settings --> SDK manager–> Android SDK–> SDK tools–> show package detail -->找到 NDK(side by side) ,下载并安装即可。

NDK was located by using ndk.dir property.

  Build 的时候提示如下的警告:NDK was located by using ndk.dir property. This method is deprecated and will be removed in a future release. Please delete ndk.dir from local.properties and set android.ndkVersion to [21.3.6528147] in all native modules in the project. https://developer.android.com/r/studio-ui/ndk-dir。我记得 Google 在刚推出 Android Studio 时, NDK 的结构并不是现在这个样子。后来 Google 对 NDK 进行了一次大的更新!这个可以在 Android 官方文档中找到。

英文说得很明白,使用 ndk.dir 指定 NDK 的位置的方法过时了,推荐下面的方法:

注意:如果有多个模块(Module),则每个模块都需要单独添加!

Note: Recompile with -Xlint:deprecation for details.

在编译项目的时候,总是会出现如下的警告:

上面的这两句话说的很明白,这个问题是由于我们的源码中使用了一些已经过时的API。详细信息可以使用 -Xlint:deprecation 参数来查看。那么具体咋么用呢?如下:

项目的 build.gradle 文件中加入:

allprojects {gradle.projectsEvaluated {tasks.withType(JavaCompile) {options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"}}
}

然后重新编译我们的源码,我们就可以查看到底用了哪些过时的 API 的详细信息

注意:以上的提示在中文系统中是乱码:

解决方法:

No version of NDK matched the requested version 21.0.6113669. Versions available locally: 21.3.6528147

  最近项目升级了最新的 Gradle 插件 classpath 'com.android.tools.build:gradle:4.0.1',在编译项目的的时候出现了如下错误:

项目并没有使用 NDK,不知道是不是与百度地图的 SDK 中的 .so 文件有关系。解决方法:

  1. 根据上面的提示,选择安装 NDK 21.0.6113669 这个版本,重新编译 APP。
  2. 修改 android/app/build.gradle 文件中配置
     android {ndkVersion '21.3.6528147'}
    
  3. 如下配置项目使用的 NDK:
  4. 在系统环境变量中配置 ANDROID_NDK_HOME。这样 Android Studio 就会默认使用 ANDROID_NDK_HOME 指定的 NDK

[CXX1101] NDK at D:\Android\android-sdk\ndk\23.0.7599858 did not have a source.properties file

  这个问题是由于没有正确安装 23.0.7599858 这个版本的 NDK,直接从 SDK Manager 中安装即可!我之所以出现这个问题是由于,我有两台电脑,在其中一台改代码时,顺便更改了程序中 NDK 的版本,换另一台电脑后,Git 同步代码之后,就忘了 NDK 这回事,实际我这台电脑并没有安装这个版本的 NDK。

未完待续…

参考

互联网

Android 之一 Android Studio 安装、配置等新手入门 + 百度地图定位 + 移动摇杆 的实现相关推荐

  1. 新手入门百度地图开发的(0,0)坐标问题

    对于大部分人来讲,由于百度地图资料众多,过度依赖搜索引擎等等原因.新接触百度地图开发工作其实并不容易.今天说说关于坐标(0,0)的问题. 首先仍然介绍坐标系,我们先不管采用的和wgs84还是gcj02 ...

  2. Android Studio新手–下载安装配置–零基础入门–基本使用–调试技能–构建项目基础–使用AS应对常规应用开发

    转自:http://blog.csdn.net/yanbober/article/details/45306483 目标:Android Studio新手–>下载安装配置–>零基础入门–& ...

  3. android studio安装教程完整,Android Studio 安装配置方法完整教程【小白秒懂】

    1.安装包下载 安装包我们可以在官网下载,但为了让大家更方便,点击链接直接保存就好啦!! 2.Android Studio 安装- 打开安装包,点next - 点next - 这步要注意了,这里填安装 ...

  4. Android studio安装配置

                                   Android studio安装配置 https://v.qq.com/x/cover/p4av5do5d07igfk/h1406hyum ...

  5. Android开发之百度地图定位

    Android开发之百度地图定位 一.效果图 二.下载百度地图SDK 1.打开[百度地图](https://lbsyun.baidu.com/index.php?title=%E9%A6%96%E9% ...

  6. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!...

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  7. android 百度地图定位辅助教程

    这里使用讲解的是androidStudio下开发android应用,实现百度地图定位功能的辅助教程. 登入百度地图API官方网站http://lbsyun.baidu.com/ 在主页中选择开发-&g ...

  8. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  9. unlegal android,百度地图定位 Cordova 插件 cordova-plugin-baidumaplocation

    软件介绍 百度地图定位Cordova插件,支持Android,IOS 可以在此地址查看example 基于百度地图Android版定位SDK(v7.1)以及百度地图IOS SDK (v3.2.1) 一 ...

最新文章

  1. 【MyBatis学习13】MyBatis中的二级缓存
  2. oracle易忘函数用法(3)
  3. python识别验证码ocr_Python 验证码识别-- tesserocr
  4. cobar mysql cluster_Cobar使用文档(可用作MySQL大型集群解决方案)
  5. (WPF) DataGrid之绑定
  6. Java 8 新特性之Stream API
  7. gitlab 安装gitlabrunner 无法连接tiller_谈一谈GitLab Runner是个什么东东?
  8. Glide加载相同地址图片,不缓存
  9. shell学习之-sed用法解析_Shell脚本之sed的使用
  10. linux系统运行application,[分享]分享曾经做过的一个嵌入式系统application框架 | 勤奋的小青蛙...
  11. 第一本书应考虑哪些细节?
  12. 应用程序错误电脑黑屏_werfault应用程序错误黑屏|Win7解决werfault.exe应用程序错误方法...
  13. [转载]Swift GYB
  14. 幼麟棋牌技术分享系列:H5棋牌游戏加载速度优化
  15. 华为、微软、戴尔等企业将参加“多哈智慧城市博览会”
  16. UE4使用委托实现Actor之间的通信
  17. C语言习题答案【7】(仅参考)
  18. 关于Linux系统重启过慢问题解决方案
  19. HOTPPTer | PPT资源导航 | PPT设计素材导航
  20. 【Python】利用百度地图API获取多方式行程时间

热门文章

  1. 网络工程师成长日记417-西安如家酒店无线覆盖技术支持
  2. 「Android」 详细全面的基于vue2.0Weex接入过程(Android视角)
  3. 最近学习linux-c的编程
  4. JS实现html国际化二
  5. 移动隐藏邮箱并删除默认邮箱数据库
  6. kafka java客户端编程
  7. MySQL Commons
  8. java继承 子类重写父类方法
  9. 在Linux系统centos上安装RAR
  10. [java]apache server与 tomcat 的区别以及整合