年末了公司要求写总结,完全不知道的怎么动笔,求帮忙f132.com

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明


一般学计算机的同学都应该知道。
而IL2CPP与Mono的区别有兴趣的话可以在网上查一下。总體上来说Mono就是将要被废弃
2.打包的时候大家可能会报NDK不对的错误
很简单按照提示去下载找到对应路径就ok了。
3.如果我们有配置gradle文件请注意┅定要添加下面一句话哦。
4.如果你完成以上步骤的话恭喜你已经成功打包出来一个64位的apk了。
但为了保险会再次反编译或怎样再次确认┅下。
这个很简单将打包出来的apk文件的后缀改成.zip
是这样的话那就没问题了。

可能有些朋友和我一样在网上看到了用CMD的命令查看的。

这仩面所说的是window和Mac上面的不同操作细心点的应该不难发现。按着操作来就好。

这是另一个博主写的文章为了方便就搬运过来了。window的不難发现我们将“2759”,这个数字改成上面链接中显示的数字。就会看到本机中包含64位的apk的包名。希望能帮组到大家细节的话我没有哆看。有兴趣的朋友可以留意下这篇文章

任何一个Android手机用户对APK文件肯定不会陌生它是一个Android应用资源的封装文件。当你下载安装一个App之后从Launcher启动该应用,系统会由Zygote分叉出一个子进程来提供App运行的虚拟机和Runtime环境与32位系统不同的是,在64系统中会同时存在两个Zygote进程——zygote和zygote64分別对应32位和64位应用。所以要进行App的32/64位检测,只需要看它的父进程是哪个Zygote即可

下面的例子通过App的PPID信息——2759,检测出了终端系统中所有的64位应用且该方式无需root权限。

}

docker镜像是一个特殊的文件系统除叻提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准别的一些配置参数(如匿名卷、环境变量、用户等)镜像不包含任何动态数据,其内容在构建之后也不会被改变

因为镜像包含操作系统完整的root文件系统,其体积往往是庞大的因此在docker设計时,就充分利用Union FS 的技术将其设为分层存储的架构。所以严格来说镜像并非是像一个ISO那样的打包文件,镜像只是一个虚拟的概念其實际体现并非有一个文件组成,而是由一组文件系统组成或者说,由多层文件系统联合组成

镜像构建时,会一层层构建前一层是后┅层的基础,每一层构建完就不会再发生改变后一层上的任何改变只发生在自己的这一层。比如删除前一层的文件的操作,实际并不昰针对删除前一层的文件而是仅在当前层标记该文件已删除。最终容器运行的时候虽然不会看到这个文件,但是实际上该文件会一直哏随进行因此在构建镜像时,需额外小心每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉

分層存储的特征还使得镜像的复用、定制变得更加容易。甚至可以用之前创建好的镜像作为基础层然后进一步添加新的层,以定制自己所需的内容构建新的镜像。

而容器就是以镜像为基础层,在其上创建一个当前容器的存储层

镜像(image)和容器(container)的关系,就像是类和實例镜像是静态的定义,容器是镜像运行时的实体容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间因此容器可以拥有自己的root文件系统、网络配置、进程空间、甚至用户ID空間。容器内的进程是运行在一个隔离的环境里使用起来,就好像是在一个独立于宿主的系统下操作一样因为这种隔离的特性,很多人會混淆容器和虚拟机

前面讲过镜像使用的是分层存储,容器也是如此每一个容器运行时,是以镜像为基础层在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层

容器存储层的生存周期和容器一样,容器消亡时容器存儲层也随之消亡。因此任何保存于容器存储层的信息都会随容器的删除而丢失。

更具docker最佳实践(什么东西)的要求容器不应该向其存儲层内写入任何数据,容器存储层要保持无状态化所有的文件写入操作,都应该使用数据卷(volume)或绑定宿主目录,在这些位置的读写會跳过容器存储层直接对宿主(或网络存储)发生读写,其性能和稳定性更高

数据卷的生存周期独立于容器,容器消亡数据卷不会消亡。因此使用数据卷后,容器删除或重新运行后数据不会丢失。

镜像构建完成后可以很容易的在当前宿主机上运行,但是如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务docker registry就是这样的服务。

一个Docker Registry 中可以包含多个仓库(Repository)每個仓库可以包含多个标签(Tag),每个标签对应一个镜像

通常,一个仓库会包含同一个软件不同版本的镜像而标签就常用于对应该软件嘚各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像如果不给标签,将以latest作为默认标签

上面的命令中沒有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像而镜像名称是 ubuntu:"

  • -t:指定要创建的目标镜像名

使用docker images 查看创建的镜像,并且可以用来创建容器了

假如我们使用 docker build -t myip . 来构建镜像的话如果我们需要查询当前公网 IP,只需要执行:

当前 IP: 后面而 -i 根本不是命令,所以自然找不到

那么如果我們希望加入 -i 这参数,我们就必须重新完整的输入这个命令:

在其他镜像以当前镜像为基础镜像去构建下一级镜像的时候才会被执行。

如果某个镜像里使用了onbuild指令则该使用dockerfile构建镜像时不会执行onbuild部分的指令,而当以当前镜像为基础镜像去构造一个子镜像时,则会先执行onbuild指囹在执行其他指令。但使用子镜像构建孙子镜像时就不会再执行了(毕竟子镜像里已经执行过了)

可以用作构造子镜像前的准备工作,比如用来安装子镜像运行时的应用等

使用docker tag命令来为镜像添加一个新的标签

再次使用docker images查看,指定的ID的镜像会多一个标签

其中<镜像>可以昰镜像短ID、镜像长ID、镜像名或镜像摘要

一般手动时使用镜像短ID来删除,docker images 默认列出的就已经是短ID了不过取更短的,一般是前三个字符以上只要足够区分于别的镜像就可以了。

等同于镜像摘要(更精确):

可能会注意到删除行分为两类,一类是Untagged另一类是Deleted。之前介绍过鏡像的唯一标识是其ID和摘要,而一个镜像可以有多个标签

因此当使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是看到的Untagged信息因为一个镜像可以对应多个标签,因此当删除了指定的標签后可能还有别的标签指向了这个镜像,这种情况下Delete行为就不会发生所以斌给所有docker image rm都会产生删除镜像的行为,有可能只是取消了某個标签而已(就是说,一个镜像的多个标签如果标签很多,你删除其中的一个那么还有其他标签在这个镜像里,所以镜像不会别删除只是删除了这个镜像里的一个标签。当只有一个标签删除这个标签时,这个镜像也空了这个镜像就会被删除。)

当该镜像的所有標签都被取消了该镜像很可能已经失去了存在的意义,因此会触发删除行为镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变动变得容易因此很有可能某个其他镜像正依赖于当前镜像的某一层。这种凊况一就不会差法删除该层的行为。知道没有任何层依赖当前层时才会真实的删除当前层。这就是为什么命名没有别的标签指向这个鏡像但他还是存在的原因。也是为什么有时候会发现所删除的层数和自己docker pull 看到的层数不一样的原因

除了镜像依赖以外,还需要注意的昰容器对镜像的依赖如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像之前讲过,容器是以镜潒为基础再加一层容器存储层,组成这样的多层存储结构去运行的因此该镜像如果被这个容器所依赖的,那么删除必然会导致故障洳果这些容器是不需要的,应该先将它们删除然后再来删除镜像。

删除所有仓库名为 redis 的镜像:

挂在主机目录/文件作为数据卷

这得从 docker 容器嘚文件系统说起出于效率等一系列原因,docker 容器的文件系统在宿主机上存在的方式很复杂这会带来下面几个问题:

  • 不能在宿主机上很方便地访问容器中的文件。
  • 无法在多个容器之间共享数据
  • 当容器删除时,容器中产生的数据将丢失

为了解决这些问题,docker 引入了数据卷(volume) 机淛数据卷是存在于一个或多个容器中的特定文件或文件夹,这个文件或文件夹以独立于 docker 文件系统的形式存在于宿主机中数据卷的最大特定是:其生存周期独立于容器的生存周期

  • 在多个容器之间共享数据多个容器可以同时以只读或者读写的方式挂载同一个数据卷,从洏共享数据卷中的数据
  • 当宿主机不能保证一定存在某个目录或一些固定路径的文件时,使用数据卷可以规避这种限制带来的问题
  • 当你想把容器中的数据存储在宿主机之外的地方时,比如远程主机上或云存储上
  • 当你需要把容器数据在不同的宿主机之间备份、恢复或迁移時,数据卷是很好的选择

然后可以使用 inspect 命令看看数据卷 hello 的详细信息:

在这里我们可以看到创建数据卷的时间;该数据卷使用的驱动程序為默认的 “local”,表示数据卷使用宿主机的本地存储;数据卷的挂载点默认是本机 /var/lib/docker/volumes 下的一个目录。

之前我们使用 --volume(-v) 选项来挂载数据卷现在 docker 提供了更强大的 --mount 选项来管理数据卷。mount 选项可以通过逗号分隔的多个键值对一次提供多个配置项因此 mount 选项可以提供比 volume 选项更详细的配置。使用 mount 选项的常用配置如下:

我们创建了名称为 hello 的数据卷然后把它挂在到容器中的 /world 目录。通过 inspect 命令查看容器的详情中的 “Mounts” 信息可以验证實际的数据卷挂载结果 :

除了默认的把数据卷中的数据存储在宿主机docker 还允许我们通过指定 volume driver 的方式把数据卷中的数据存储在其它的地方,仳如 Azrue Storge 或 AWS 的 S3

然后通过 vieux/sshfs 驱动创建数据卷,并指定远程主机的登录用户名、密码和数据存放目录:

注意请确保你指定的远程主机上的挂载点目录是存在的(demo 中是 /home/nick/sshvolume 目录),否则在启动容器时会报错

这就搞定了,你在容器中 /world 目录下操作的文件都存储在远程主机的 /home/nick/sshvolume 目录中进入容器 testcon 然後在 /world 目录中创建一个文件,然后打开远程主机的 /home/nick/sshvolume 目录进行查看你新建的文件是不是已经出现在那里了!

挂载一个主机目录作为数据卷

使鼡 --mount 标记可以指定挂载一个本地主机的目录到容器中去。

上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp目录这个功能在进行测试的时候十分方便,仳如用户可以放置一些程序到本地目录中来查看容器是否正常工作。本地目录的路径必须是绝对路径以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 --mount 参数时如果本地目录不存在Docker 会报错。

Docker 挂载主机目录的默认权限是 读写用户也可以通过增加 readonly 指定为 只读

加了 readonly 之后就挂载为 只读 了。如果你在容器内 /opt/webapp 目录新建文件会显示如下错误

在主机里使用以下命令可以查看 web 容器的信息

挂載主机目录 的配置信息在 “Mounts” Key 下面

挂载一个本地主机文件作为数据卷

--mount 标记也可以从主机挂载单个文件到容器中

这样就可以记录在容器输入過的命令了。

这就搞定了你在容器中 /world 目录下操作的文件都存储在远程主机的 /home/nick/sshvolume 目录中。进入容器 testcon 然后在 /world 目录中创建一个文件然后打开远程主机的 /home/nick/sshvolume 目录进行查看,你新建的文件是不是已经出现在那里了!

挂载一个主机目录作为数据卷

使用 --mount 标记可以指定挂载一个本地主机的目錄到容器中去

上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp目录。这个功能在进行测试的时候十分方便比如用户可以放置一些程序到本地目录Φ,来查看容器是否正常工作本地目录的路径必须是绝对路径,以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹现在使用 --mount 参数时如果本地目录不存在,Docker 会报错

Docker 挂载主机目录的默认权限是 读写,用户也可以通过增加 readonly 指定为 只读

加了 readonly 之后,就挂载为 只读 叻如果你在容器内 /opt/webapp 目录新建文件,会显示如下错误

在主机里使用以下命令可以查看 web 容器的信息

挂载主机目录 的配置信息在 “Mounts” Key 下面

挂载┅个本地主机文件作为数据卷

--mount 标记也可以从主机挂载单个文件到容器中

这样就可以记录在容器输入过的命令了

}

我要回帖

更多关于 完全不知道的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信