Android FrameWork学习(一)Android 7 0系统源码下载 编译

最近计划着研究下 Android 7.0 的系统源码,之前也没做过什么记录,这次正好将学习的内容记录下来,方便以后复习巩固。

既然要学习我们的系统源码,那我们第一步要做的就是下载源码并进行编译了。


#硬件环境要求

###1. 编译环境 按照官方的说法,编译 Android 2.3.x 及以上版本的系统源码需要 64 位的系统运行环境来支持,而编译 2.3.x 以下的版本则需要 32 位的系统运行环境。

###2. 硬盘空间 官方建议最好预留 100G 的磁盘空间来下载源码,150G 的磁盘空间用来编译源码,如果使用了 ccache(一个高速编译缓存工具,可以大幅加快 gcc 的编译速度),那么则需要更大的空间来支持。

所以尽可能地保证自己的磁盘空间够大吧,之前就因为磁盘空间预留不够导致源码编译过程中空间不足,狠狠地把自己坑了一把。

###3. 内存空间 如果你是在虚拟机上跑 linux,官方建议至少需要 16G 的内存空间,我的机器只有 8G 的内存空间跑虚拟机,目前跑起来也没太大问题,就是编译源码的过程非常漫长,不知道是否跟内存大小有关。


#软件环境要求 ###1. 操作系统

Android 系统的源码的编译支持 Linux 跟 Mac OS 两种操作系统,一般情况下,Android 系统源码都是在 Linux Ubuntu 系统上进行开发与测试的,所以如果你准备使用 Linux 系统来进行源码编译,那一般推荐安装 Ubuntu 版本的 Linux。

下面列出了各 Android 版本与编译系统版本的对应关系

Linux:

Android 版本GNU/Linux
Android 6.0 (Marshmallow) - Android最新版本Ubuntu 14.04 (Trusty)
Android 2.3.x (Gingerbread) - Android 5.x (Lollipop)Ubuntu 12.04 (Precise)
Android 1.5 (Cupcake) - Android 2.2.x (Froyo)Ubuntu 10.04 (Lucid)

Mac OS

Android 版本Mac OS (Intel/x86)
Android 6.0 (Marshmallow) - Android最新版本Mac OS v10.10 (Yosemite) or later with Xcode 4.5.2 and Command Line Tools
Android 5.x (Lollipop)Mac OS v10.8 (Mountain Lion) with Xcode 4.5.2 and Command Line Tools
Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat)Mac OS v10.6 (Snow Leopard) or Mac OS X v10.7 (Lion) and Xcode 4.2 (Apple's Developer Tools)
Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich)Mac OS v10.5 (Leopard) or Mac OS X v10.6 (Snow Leopard) and the Mac OS X v10.5 SDK

###2.JDK 版本要求 不同的Android版本编译也需要对应的 JDK 环境,这里列出了各版本之间的对应关系

|Android 版本|JDK 版本(Ubuntu)|JDK 版本(Mac OS)| |---|---| |Android 目前最新版本| OpenJDK 8| jdk 8u45 or newer| |Android 5.x (Lollipop) - Android 6.0 (Marshmallow)|OpenJDK 7|jdk-7u71-macosx-x64.dmg| |Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat)|Java JDK 6|Java JDK 6| |Android 1.5 (Cupcake) - Android 2.2.x (Froyo)|Java JDK 5|  |


#搭建编译环境

根据上面列出的软硬件要求,我们可以根据自己要编译的 Android 版本以及自己的设备来选择合适的系统及JDK,接下来我们就来说说如何搭建编译环境。

这里我们主要针对Android 7.0的需要的编译环境分别对 Linux 和 Mac OS 进行配置:

###设置 Linux 系统编译环境 ####1.安装 JDK

Android 7.0目前需要 openJDK 8的 JDK 环境

#####Ubuntu 15.04+ 如果你的系统是 Ubuntu 15.04 及以上版本的话,直接运行如下指令即可直接安装:

$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
复制代码

#####Ubuntu 14.04 如果你使用的是 Ubuntu 14.04 版本,现在并没有专门针对14.0.4可用的 open jdk8 的包,

但是 Ubuntu 15.04 OpenJDK 8 的包可以在 14.0.4 上成功地运行,所以我们下载 Ubuntu 15.04 OpenJDK 8 的安装包来手动安装:

  1. 从 archive.ubuntu.com上依次下载下面列出的64位的 open JDK 8 的.deb安装包 openjdk-8-jre-headless_8u45-b14-1_amd64.deb  openjdk-8-jre_8u45-b14-1_amd64.deb openjdk-8-jdk_8u45-b14-1_amd64.deb

  2. 安装 .deb 包 先运行 apt-get 指令更新软件列表

sudo apt-get update
复制代码

接着依次对上面下载的三个 deb 文件运行如下指令进行安装:

sudo dpkg -i 下载的文件地址
复制代码

最后运行 apt-get -f 指令修复安装依赖的包

sudo apt-get -f install
复制代码
  1. 更新系统默认使用的 JDK 版本 如果你的系统安装了多个版本的 JDK,可以通过下面的指令执行切换,会弹出可选的 JDK 版本,根据你的需要选择对应的版本就可以了:
sudo update-alternatives --config java
sudo update-alternatives --config javac
复制代码

####2.安装所需要的工具包

#####Ubuntu 14.04

我们编译过程中会用到下面的依赖包,执行如下指令统一安装:

sudo apt-get install git-core gnupg flex bison gperf build-essential \zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \libgl1-mesa-dev libxml2-utils xsltproc unzip
复制代码

####3.设置源码编译输出路径 默认情况下,编译好的系统源码会在源码所在目录的out文件夹下, 如果你希望调整输出目录的路径,可以执行下面的指令指定输出目录:

export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>
复制代码

####4.设置 USB 接口访问设备 在linux下,默认情况是不允许普通用户直接通过 USB 接口来访问设备的.

推荐方法是以根用户身份在 /etc/udev/rules.d/51-android.rules 路径创建文件。

我们可以通过如下指令来实现(注意用你的系统username替换指令中的):

wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
复制代码

###设置 Mac OS 系统编译环境 Mac OS 的文件系统默认情况下保留了大小写实际上却又不区分大小写。 目前的git指令无法支持这样的文件系统,会导致一些莫名其妙的错误,所以在 Mac OS 上编译 Android 系统源码,我们必须先创建一块区分大小写的磁盘镜像。

####创建一块区分大小写的磁盘镜像 这里我们直接通过命令行来创建:

hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
复制代码

该指令会在系统根目录下生成一个 android.dmg 或是 android.dmg.sparseimage 文件,一旦挂载,将被作为支持 Android 开发所需格式的驱动镜像分区。

如果之后你需要更大的空间,你可以通过下面的指令进行空间调整:

hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
复制代码

你还可以在 ~/.bash_profile 文件中,添加帮助函数来挂载跟取消挂载:

# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }#如果创建dmg文件时生成的是android.dmg.sparseimage文件,则使用
function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
复制代码
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }
复制代码

之后我们就可以通过执行 mountAndroid 指令来执行挂载镜像,通过 umountAndroid 指令来取消挂载。

####安装 JDK #####安装工具依赖包 ######1. 安装 xcode 命令行工具

$ xcode-select --install
复制代码

对于老版本的 Mac OS 系统(10.8或者10.8之前的),我们需要到苹果开发者站点进行下载安装. 如果你还没有注册成为苹果开发者,你需要先注册一个苹果账号来进行下载.

######2. 到 macports.org 上下载对应Mac OS版本的 macports (类似于Linux下的 apt-get,用来帮助你安装其他应用程序)

注意:确保 /opt/local/bin 在路径 /usr/bin 前,如果没有,在 ~/.bash_profile 文件中进行添加

export PATH=/opt/local/bin:$PATH
复制代码

注意:如果根目录下没有 .bash_profile 文件,那就手动创建一个

#####3. 通过 macports 安装 make , git 以及 GPG

$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
复制代码

如果使用的是 Mac OS X v10.4 版本的系统,还需要安装 bison :

$ POSIXLY_CORRECT=1 sudo port install bison
复制代码

注意:如果是编译 Android 4.0.x 及以下版本的系统,gmake 3.8.2 版本存在一个 bug,需要还原到 gmake 3.8.1


###优化编译环境(可选)

####设置 ccache

我们可以自由选择是否开启 ccache 编译工具。

ccache 是一个高速编译缓存工具,它通过将头文件高速缓存到源文件之中而改进了构建性能,因而通过减少每一步编译时添加头文件所需要的时间而提高了 C\C++ 的构建速度。

从编译的全过程来看,不使用 ccache 的情况下,编译过程中会多次解析相同的头文件,浪费了处理器周期,更重要的是浪费了开发者的时间,因为他们要等待这一过程的完成。在一个团队中,这一影响可能会更为明显,因为团队成员可能会反复编译解析相同的头文件。

所以,一般对于专门用来编译系统的服务器或是大容量的生产环境,这个功能比较有用,它可以加速重新编译的速度。

注意:如果你只是个人开发者,不是专门的编译服务器,不需要进行增量构建的话,那么使用 ccache 可能会因为高速缓存缺失而降低你的构建速度。

####开启 ccache 要开启 ccache,在源码树的根路径下执行下面的指令:

$ export USE_CCACHE=1
$ export CCACHE_DIR=/<path_of_your_choice>/.ccache
$ prebuilts/misc/linux-x86/ccache/ccache -M 50G
复制代码

缓存的大小一般设置为50G-100G

接着在 .bashrc (或者 etc/profile )中添加下面的指令

export USE_CCACHE=1
复制代码

默认情况下,缓存会存在home根目录的 ~/.ccache 中,但是如果你使用的是NFS或者其他的非本地文件系统,那么你同样需要在 .bashrc 指定缓存目录地址

在 Mac OS 的系统中,你需要将 linux-x86 替换成 darwin-x86:

prebuilts/misc/darwin-x86/ccache/ccache -M 50G
复制代码

当编译的 Android 系统是4.0.x或者更老的版本,ccache 的缓存路径会有所不同

prebuilt/linux-x86/ccache/ccache -M 50G
复制代码

这个设置会一直存储在 CCACHE_DIR 中。

在Linux上,你可以通过以下指令开启对 ccache 的监听:

$ watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s
复制代码

#下载源码 编译环境配置好之后,我们就可以开始下载我们的源码了

###安装 Repo Repo 是 google 用 python 写的一个脚本工具,Android 使用 git 作为代码管理工具,一个 Android 系统由 N 多个 git 库构成,如果手动进行一个个下载,那简直是一件非常痛苦的事,而 repo 就是用来对这些 git 库进行维护管理跟下载的。

通过 Repo 工具,我们可以轻松地完成 Android 系统源码的下载。

#####1.在系统 home 根路径下创建bin目录并且添加到 path 路径中:

#创建bin目录
$ mkdir ~/bin#把bin目录的路径添加到PATH中
$ PATH=~/bin:$PATH
复制代码

#####2.下载 repo 工具并设置其可执行

#curl 是个开源文件传输工具,在这里是把远程的 repo 文件下载到指定的 ~/bin/repo 路径
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo#修改 repo 对所有人可执行
$ chmod a+x ~/bin/repo
复制代码

###初始化 Repo 客户端

######1.创建一个空目录用来存放我们的 Android 系统源码,名字自己随便定

#创建名为 WORKING_DIRECTORY 的目录
$ mkdir WORKING_DIRECTORY#进入到创建的目录中
$ cd WORKING_DIRECTORY
复制代码

######2.初始化 repo 仓库

从主干 master 下载源码,目前最新版本

$ repo init -u https://android.googlesource.com/platform/manifest
复制代码

如果需要下载某个特定版本系统的分支,可以在上述命令后加 -b 版本分支号,这里我指定 Android 7.0 的版本分支

$ repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.0_r7
复制代码

具体的版本分支号可以到这个地址查看(需要翻墙): Android系统个版本分支号

######3.同步源码到本地 这时执行 sync 指令便可以自动下载源码到本地了

$ repo sync
复制代码

###使用国内镜像下载源码 由于国内网络的问题,上述操作的源码下载需要翻墙才能进行,速度会受到很大影响,几十G的系统源码可能需要花上上周的时间才能下完,

因此我们可以选择国内的镜像进行源码下载:

清华大学的镜像站 参照页面上的描述对上面的指令稍作调整便可以了,站点上写得比较详细,这里我们就不作赘述了。

根据网速的不同,一般一天之内能够下载完毕。

对于下载下来的源码,我们并不能直接刷到我们的目标设备上或者是使用模拟器运行,我们必须对源码进行编译生成对应的 image 二进制镜像文件, 当然你也可以直接从官网下载对应系统版本的镜像文件(需翻墙):  Google's Nexus driver page Binaries Preview for Nexus Devices

这里我们还是自己来编译下源码,熟悉下整个编译过程。


#源码编译

首先我们通过命令行进入到源码目录中,我这里目录的名称是aosp

cd aosp
复制代码

###清空输出目录 为了确保我们编译生成的文件不受之前 build 构建的文件影响,我们在源码目录中执行下面的指令,该指令会清空 out 输出目录中的所有文件

$ make clobber
复制代码

###设置编译环境 首先我们通过源码 build 目录中的 envsetup.sh 脚本文件初始化我们的编译环境,执行

$ source build/envsetup.sh
复制代码

$ . build/envsetup.sh
复制代码

这两个指令的效果是一样的,会初始化一些有用的命令工具

我们后面执行的一些指令必须在初始化 envsetup之后才能执行

###选择编译目标

接着我们通过 lunch 指令来选择我们需要编译的目标 执行lunch指令

$ lunch
复制代码

会弹出可选目标项:

所有的构建目标由 BUILD-BUILDTYPE 的形式组成: BUILD 对应 codename

这是官方提供的一份对照表:

|Device| Code name| Build configuration |---|---| |Pixel XL |marlin |aosp_marlin-userdebug| |Pixel|sailfish |aosp_sailfish-userdebug| |HiKey| hikey| hikey-userdebug| |Nexus 6P| angler |aosp_angler-userdebug| |Nexus 5X |bullhead |aosp_bullhead-userdebug| |Nexus 6 |shamu |aosp_shamu-userdebug| |Nexus Player |fugu| aosp_fugu-userdebug| |Nexus 9 |volantis (flounder) |aosp_flounder-userdebug| |Nexus 5 (GSM/LTE) |hammerhead |aosp_hammerhead-userdebug| |Nexus 7 (Wi-Fi) |razor (flo) |aosp_flo-userdebug| |Nexus 7 (Mobile) |razorg (deb) |aosp_deb-userdebug| |Nexus 10 |mantaray (manta) |full_manta-userdebug| |Nexus 4 |occam (mako) |full_mako-userdebug| |Nexus 7 (Wi-Fi) |nakasi (grouper)| full_grouper-userdebug| |Nexus 7 (Mobile)| nakasig (tilapia)| full_tilapia-userdebug| |Galaxy Nexus (GSM/HSPA+)| yakju (maguro)| full_maguro-userdebug| |Galaxy Nexus (Verizon) |mysid (toro) |aosp_toro-userdebug| |Galaxy Nexus (Experimental) |mysidspr (toroplus) |aosp_toroplus-userdebug| |Motorola Xoom (U.S. Wi-Fi) |wingray |full_wingray-userdebug| |Nexus S| soju (crespo)| full_crespo-userdebug| |Nexus S 4G |sojus (crespo4g) |full_crespo4g-userdebug|

BUILD_TYPE 对照表:

构建类型用途
user有限的访问权限,主要用于发布正式产品,没有 root 跟调试权限
userdebug跟 user 类型差不多,但是多了 root 跟 debug 调试权限
eng拥有各种调试工具的开发版设置,拥有 root 跟 debug 权限

如果作为开发使用的话,那我们一般都是选 -eng

这里我自己是准备在模拟器上运行编译的 image 镜像,并且我电脑的 cpu 是 intel x86 的,所以我选择了 6. aosp_x86-eng

我们可以根据自己的需要选择对应的 cpu 类型。

注意:我们知道,Android 官方的模拟器速度很慢, Intel 特意提供了一个叫 HAXM 的虚拟硬件加速技术,全称为:Intel Hardware Accelerated Execution Manager.

只要你的 CPU 是 intel 的产品并且支持 VT(virtualization Technology)就可以使用 HAXM 技术将你的模拟器的速度提升至真机的水平。

目前 Intel 只提供了 windows 版和 MAC 版,Linux 系统只有通过安装 KVM 来达到这个效果。

#####安装 KVM 首先我们检测下自己的 cpu 是否支持 hardware virtualization(硬件虚拟化)

egrep -c '(vmx|svm)' /proc/cpuinfo
复制代码

输出的值如果是大于 0 的,则表明你的 cpu 支持

如果你使用的是 vmware 虚拟机安装的 linux,注意要设置下虚拟机的 cpu 来支持硬件虚拟化,先关闭虚拟机,然后右键虚拟机=》设置,选中 cpu,勾选虚拟化 Intel VT 项,这样就能支持 KVM 了。

对于 Ubuntu 10.0.4 以上的版本,我们通过下面的指令安装 KVM 即可

sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
复制代码

如果在安装 KVM 的过程中有什么疑问的话,可以访问下面这个网址查找方法:https://help.ubuntu.com/community/KVM/Installation

这样,在编译完目标 intel cpu 的镜像文件后,我们运行模拟器就会自动进行加速了。

#编译源码 好了,一切就绪,我们可以开始编译我们的源码了, 我们在源码路径下通过 make -jN 指令来进行源码编译,这里的 N 一般建议设置为 cpu 核心线程数的 1-2 倍。

$ make -j4
复制代码

一般情况下,我们等待源码编译完成就可以了,不过从 Android 7.0 N 开始,make 指令默认会开启 Jack 编译工具链来进行 Java 代码的编译,这个过程中可能会出现一些问题。

#####什么是 Jack 编译工具链 (The Jack toolchain)? 我们知道,我们平时编译 Android 代码的时候会先将 Java 代码编译成 .class 文件,最终再转换成 .dex 文件,如图:

而 Jack 编译工具链则跳过了编译成 .class 文件这一过程,直接将 Java 代码编译成 .dex文件

它的优势:

  • 完全开放源码 源码均在 AOSP 中,合作伙伴可贡献源码
  • 加快编译源码 Jack 提供特殊的配置,减少编译时间:pre-dexing ,增量编译和Jack编译服务器.
  • 支持代码压缩,混淆,重打包和 multidex
  • 不在使用额外单独的包,例如 ProGuard。

如果想进一步了解 Jack,可以访问Compiling with Jack(需翻墙),这里就不作太多解释了。

按照官方的说法 Jack 可以加快编译速度

但实际编译过程中,在我的设备上 Jack 会占用大量内存,并且拖慢编译速度,还会报错,而且官方文档上写的配置方式对 Jack 并不起作用。

#####Jack编译过程中遇到的问题 ######编译过程中报 Out of memory error 并中断编译 在执行 make 指令后,当第一次编译 Java 代码的时候,Jack 会被启用,这个时候经常会卡住,并且一段时间后报错 Out of memory error

按照官方的说法, Jack 并行编译的时候占用的资源太大导致内存溢出了

可以通过在 $HOME/.jack 文件中减小 SERVER_NB_COMPILE 的值来减小并行编译数量, SERVER_NB_COMPILE 的值默认为4

但实际情况是 Jack 没有在根路径下生成 .jack 文件,并且手动创建设置 SERVER_NB_COMPILE 后重启 Jack 服务也没有效果。

经测试发现 make 编译过程中当 Jack 第一次被启用时会在 home 根路径下生成 .jack-server 目录

可以通过修改该目录中 config.properties 文件里的.jack.server.max-service值来设置并发线程数。

同时,你也可以设置增加 Jack 的内存容量来解决这个问题,指令如下

export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
复制代码

然后进入到输出路径的 bin 目录下:

cd /home/cjpx00008/aosp/out/host/linux-x86/bin
复制代码

执行下面的指令重启 Jack 服务

./jack-admin stop-server./jack-admin start-server
复制代码

我改了 service 大小,同时增加了内存,后来编译的过程中没有发生其他问题。

#####有办法关闭 Jack 编译吗? 既然Jack有问题,那我们可以关闭 Jack 编译吗?

目前来说我还没有找到如何在 Android 7.0 编译的时候关闭 Jack,如果有知道的小伙伴欢迎留言告诉我哈,感激不尽!!

#运行编译出的 image 镜像

经过漫长的等待,我们的源码终于编译结束了,是时候来运行编译出的 image 镜像了。

这时我们只要在源码目录下执行 emulator 指令即可运行模拟器

$ emulator
复制代码

第一次启动时间可能会有点长,耐心等待即可

运行成功了,是不是有点小激动呢!

注意:如果你的命令行窗口关闭重开了,那 emulator 指令可能会提示找不到命令,我们可以在源码根目录环境下,通过 envsetup.sh 重新初始化命令,运行 lunch 指令选择编译目标,这个时候你再运行 emulator 就不会提示找不到指令了(每次关闭命令行窗口都需要重新运行如下指令才能执行 emulator)

也可以通过配置环境变量来设置 emulator 指令,不过我没有成功,哈哈

$ source build/envsetup.sh
$ lunch
$ emulator
复制代码

好啦,到此,我们的源码就编译完毕啦,下一篇我们来聊聊如何使用 Android Studio 导入 Android 系统源码,并通过 AS 进行 Java 源码调试,以及使用 GDB 来调试系统 Native C\C++ 源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MapGIS精品教程】002:GDB本地数据库的使用

本文主要内容为MapGISGDB本地数据库的使用&#xff0c;包括&#xff1a;GDB企业管理器的认识、GDB本地数据库的创建方法、GDB本地数据库的备份和恢复。 1. GDB企业管理器的认识 GDB是地理数据的资源管理器&#xff0c;主要对空间数据进行有序组织与管理。 GDB数据管理包括&…

RabbitMQ学习3----运行和管理RabbitMQ

1.服务为管理 Erlang天生就是为了让应用程序无需知道对方是否存在同一台机器上即可互相通信。 Erlang节点&#xff1a;Erlang虚拟机的每个实例。多个Erlang应用程序可以运行在同一个节点之上。节点之间可以进行本地通信&#xff08;不管他们是运行在同一台服务器之上&#xff0…

各代移动网络性能

摘自《中国元宇宙白皮书》 下载整书完整版https://www.aliyundrive.com/s/gXQvRLM22kD

EFCore高级Saas系统下单DbContext如何支持不同数据库的迁移

前言随着系统的不断开发和迭代默认的efcore功能十分强大&#xff0c;但是随着Saas系统的引进efcore基于表字段的多租户模式已经非常完美了&#xff0c;但是基于数据库的多租户也是可以用的&#xff0c;但是也存在缺点&#xff0c;缺点就是没有办法支持不同数据库&#xff0c;mi…

poj 1679: The Unique MST【次小生成树】

题目链接 参考博客 希望注释足够清楚。。欢迎指出不足~ #include<cstdio> #include<cstring> #include<algorithm> using namespace std;const int maxn110; const int INF0x3f3f3f3f;int n,m; int mp[maxn][maxn]; int maxlen[maxn][maxn]; //maxlen…

51. Python 数据处理(2)

1.Python 修改excel文件import xlrd import xlutils.copy excelr xlrd.open_workbook("hello.xlsx") excelw xlutils.copy.copy(excelr) sheet1 excelw.get_sheet(0) sheet1.write(3, 5, "xlutils.copy test test") excelw.save("hello.xlsx"…

人工智能十大流行算法

导读&#xff1a;本文为有志于成为数据科学家或对此感兴趣的读者们介绍最流行的机器学习算法。 作者&#xff1a;Fahim ul Haq 译者&#xff1a;刘志勇&#xff0c;策划&#xff1a;赵钰莹 来源&#xff1a;InfoQ&#xff08;ID&#xff1a;infoqchina&#xff09; 机器学习是…

Win7+Win10双系统安装全攻略

安装双系统,不仅能给你非凡的体验,还可以满足工作中因系统版本,兼容性,处理器等原因带来的不便。本文讲解Win7+Win10双系统安装全攻略,亲测可用。 1. 硬盘分区 本文讲解利用固态硬盘+机械硬盘的分区方式。 固态硬盘:为了绝对提高系统运行的速度,将固态硬盘作为双系统的…

[矩形并-扫描线-线段树]Picture

最近在补数学和几何&#xff0c;没啥好写的&#xff0c;因为已经决定每天至少写一篇了&#xff0c;今天随便拿个题水水。 题目大意&#xff1a;给你N个边平行于坐标轴的矩形&#xff0c;求它们并的周长。(N<5000) 思路&#xff1a;这个数据范围瞎暴力就过了&#xff0c;但我…

聊聊研发团队中的“人”

大家好&#xff0c;我是Z哥。汉字博大精深&#xff0c;很多时候我们可以通过拆字来更形象地理解一个词的含义。比如“团队”这个词的两个字"团"和“队”单独看也都是表示一种由多人组成的组织。再做一下拆字就是“口”“才”和“耳”“人”。前者表示一个人才如果没有…

[转]【分布式系统】唯一ID生成策略总结

文章目录 全局唯一id介绍 全局唯一id特点:常见全局唯一id生成策略 1、数据库自增长序列或字段生成id 2、UUID 3、Redis生成ID 4、zookeeper生成ID 5、Twitter的snowflake算法全局唯一id介绍 系统唯一id是我们在设计阶段常常遇到的问题。在复杂的分布式系统中&#…

shell在一个大文件找出想要的一段字符串操作技巧

昨天端午&#xff0c;晚上的时候接了一个电话&#xff0c;我朋友的公司&#xff0c;数据库被两个工作没多久的phper给弄坏了&#xff0c;具体就是把一个字段值&#xff0c;给全表弄成一个了名字了&#xff0c;当然这个是可以配置了禁止全表更新数据库,这下可急坏了&#xff0c;…

CentOS7安装EPEL源

CentOS7安装EPEL [lijiayuncentos-*** ~]$ yum install epel-release已加载插件&#xff1a;fastestmirror, langpacks您需要 root 权限执行此命令。[lijiayuncentos-*** ~]$ su密码&#xff1a;[rootcentos-*** lijiayun]# yum install epel-release已加载插件&#xff1a;fas…

超全的开源Winform UI库,满足你的一切桌面开发需求!

本文有dotnet9站长整理 网址&#xff1a;https://dotnet9.com/本站曾介绍过一款Winform开源控件库HZHControls&#xff0c;Winform在大家心中的地位还是挺高的&#xff0c;今天小编再分享一款新鲜出炉的 Winform UI库——SunnyUI&#xff0c;一起跟 Dotnet9 往下看吧。项目名称…

告别国外 IDE,阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

经历近 3 年时间&#xff0c;在阿里集团及蚂蚁集团共建小组的努力下&#xff0c;OpenSumi 作为国内首个强定制性、高性能&#xff0c;兼容 VS Code 插件体系的 IDE 研发框架&#xff0c;今天正式对外开源。 一 OpenSumi 是什么&#xff1f; OpenSumi 是一款面向垂直领域&#…

window-memcache技术随笔

memcached.exe软件放置到非中文,非空格的目录,把MSVCR71.DLL文件放在memcached.exe同目录下启动,控制面板中打开window功能-Telnet客户端memcache服务方法一:管理员身份打开黑窗口 d:(mem的所在盘)cd memmemcached.exe -p 11211方法二: 安装为Windows的系统服务memcached.exe -…

将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器

首先&#xff0c;非常感谢赵老大的CodeTimer&#xff0c;它让我们更好的了解到代码执行的性能&#xff0c;从而可以让我们从性能的角度来考虑问题&#xff0c;有些东西可能我们认为是这样的&#xff0c;但经理测试并非如何&#xff0c;这正应了我之前的那名话&#xff1a;“机器…

聊聊 C++ 中的几种智能指针(下)

一&#xff1a;背景 上一篇我们聊到了C 的 auto_ptr &#xff0c;有朋友说已经在 C 17 中被弃用了&#xff0c;感谢朋友提醒&#xff0c;今天我们来聊一下 C 11 中引入的几个智能指针。unique_ptrshared_ptrweak_ptr看看它们都怎么玩。二&#xff1a;三大智能指针详解 1. uniq…

iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”

iOS回顾笔记&#xff08; 02 &#xff09; -- 由九宫格布局引发的一系列“惨案” 前言&#xff08;扯几句淡先&#xff09; 回顾到学习UI过程中的九宫格布局时&#xff0c;发现当时学的东西真是不少。 这个阶段最大的特点就是&#xff1a;知识点繁多且琐碎。 我们的目标就是要将…

【GlobalMapper精品教程】007:如何加载谷歌卫星影像?

“Global Mapper支持所有OGC标准数据源类型,例如用于流式栅格地图的WMS / WMTS,用于矢量数据集的WFS和用于为指定区域下载单个数据文件的WCS。预先切片的图像和地形数据集也可以使用OSM(OpenStreetMaps)、TMS(Tiled Map Service)和Google Maps瓦片架构支持。您只需要选择适当…