而经常听说某个工作的package怎么使用是多少sa

android基于linux所以当设备上电后,初期嘚启动流程跟linux系统并无二致uboot引导,接着载入kernel代码加载各种驱动,结束后启动第一个用户级进程init,init接着解析init.rc后按照配置启动各种linux后囼进程。

   整个linux系统底层已经Ready后接着要干嘛,当然是启动android引导进程装载android运行环境所需的代码和资源。

Android的引导进程是Zygote我们可以在init.rc中找到她,Zygote运行后会创建davlik虚拟机,加载framework.jar等代码和资源;Zygote是所有android进程的父进程这里的android进程是指需要共享dalvik虚拟机的进程。Zygote初始化结束后会fork出她嘚第一个子进程system_server,即android的核心服务进程很多轻量级的service都跑在这个进程中,这些轻量级的服务当中包含了本章所要详细描述的package怎么使用Manager

   PMS,顧名思义一个负责安装包管理的服务,它在systemserver起来后被创建并完成初始化它是整个android的基础,如果PMS出问题了那整个android运行会乱掉。

  本文将會简单介绍PMS的整个实现原理由于本人水平有限,文中肯定会存在描述不准确或者错误的地方欢迎指正!

1:APK文件结构概述

  Android的安装包叫apk(android package怎麼使用),在介绍怎么管理它之前肯定要先了解它的内部结构,要不在后续看PMS的相关代码时会一头雾水。

   APK文件就是一个zip压缩文件用解壓缩软件可以看到其内部结构如下:

1) META-INF文件夹主要包含APK内所有文件的摘要清单,清单签名数据和公钥证书

我们如果将APK文件解压接着查看内蔀文件内容,会发现除了assets目录下的其他所有XML文件都会被转换成二进制文件,android在打包的时候做了什么这么做的目的是什么?

Android资源ID是一个4芓节的无符号整数最高字节表示package怎么使用ID,次高字节表示TypeID最低两字节表示EntryID;所以,当我们拿到资源ID时我们就知道资源所属包,以及對应的资源类型和入口ID所有的资源ID最终都生成到R.java。

   有了资源ID当然不够资源ID对应的数据是什么?所以还需要资源索引描述表这样才可鉯通过资源ID,快速的找到最匹配的资源数据;

   所有分配的资源ID都会被按照指定的数据结构重新组织并连同资源数据保存到resources.arsc中

resources.arsc是android资源数据嘚核心,有了它程序在运行时,就可以根据当前的各种环境比如language,screensize等等来快速定位最匹配的资源;同时由于资源数据的ID化又可以保證资源数据最大可能的复用,从而减少APK的大小

试想下,如果对AndroidManifest和各种布局文件如果都是通过纯文本解析,那效率肯定是无法接受的還有一点,文件中的各种关联数据的值如何获取比如drawable,string等等在上面已经描述过,resources.arsc包含了所有数据的ID和对应值所以我们只需要根据xml内蔀数据,重新定义数据结构并将xml各种值元素的key和value替换成resources.arsc中对应的id值,接着将结构化数据存储到同名文件中即可这就是我们再在包后看箌的二进制数据。

接着介绍程序启动后如何读取资源数据比如我们要根据layout ID读取对应的layout文件

2) 通过资源ID的次高位字节,得到资源类型为layout從而在app资源描述表中快速定位到layout类型的数据结构

3) 根据app当前的硬件或系统信息(language,screensize等)在layout类型的数据结构中,快速的匹配到最佳资源从而拿到资源路径

4) 根据资源路径,获取布局文件数据

5) 根据布局文件数据生成AttributeSet,接着根据AttributeSet的解析节点信息和对应属性ID从app资源描述表,获取AttributeSet中当前节点下对应属性的值

android默认提供了AssetManager来实现上述功能,不过我们实际开发中更多的是使用Resource来获取资源数据,Resource基于AssetManager重新封装提供叻更加易用的接口并对指定操作做特殊处理,比如drawableResource会添加缓存处理等。

下面简单介绍几个跟PMS相关的:

通过R.attr数组读取相当于把要读取的屬性ID直接写入代码中,扩展性和维护性都比较差所以建议使用第二种方式。

通过使用styleable就使目标属性集合可配置,从而提高程序的扩展性

Android应用在打包之后在正式发布前,需要对其签名签名的目的主要有两个:

1)保护APK数据的完整性

2)作为APK的身份验证

下面简单介绍下签名嘚原理以及APK解析时的相关验证代码。

1.2.1 消息摘要加解密,数字签名数字证书

下面的名词解释相关内容大部分都摘自网络

  消息摘要算法是使用一个Hash函数对任意长度的输入数据进行处理,输出固定长度的数 据输出数据称为消息摘要。无法从消息摘要倒推出消息内容常用的消息摘要算法是 MD5 和 SHA-1。

公钥加密算法又称为非对称密钥加密算法因为它包含一个公钥-私钥对,称为key pair即 key pair = private key +public key。从功能上说两个key作用相同,用┅个key加密的消息只能用另一个key解密,反之亦然

 数字签名就是将原始数据的信息摘要用private key加密后,和原始数据一起发送给接收方;

 接收方收到签名数据后先使用public key进行解密,拿到信息摘要;接着用收到的原始数据生成信息摘要并与解密后的信息摘要做对比,如果一致数據完整性验证通过, 否则验证失败说明数据被修改了。

  由于无法通过publickey推导出private key通过数字签名就可以确保发送数据额完整,再则private key只有发送鍺知道这样又可以确保数据是由private key的拥有者发送的。

  数字签名存在一个问题那就是数据接收方如何获取publickey?预先把public key给接 收方或者直接和数芓签名一起发送给接收方这么做在通常情况下,肯定是没问题的但是 在如下两种情况下,会存在安全性问题:

  1:预先把publickey 给接收方如果有人在接收方不知情的情况下,更换了public key然后再截取发送过来的数据并替换成自己的,这样接收方和发送方在不知情的情况下,数据巳经被人调包了

  2:publickey连同数字签名一起发送给接收方,如果有人截取发送的数据将数据,数字签名和public key都替换掉这样也会产生数据调包嘚问题。

  所以要解决上面安全性问题,核心就是保证发送者的publickey不被调换

  数字证书因此而生,数字证书是指由权威机构CA认证发行的主偠包含拥有者的相关信 息和public key;所以上述发送者,只需要去CA提供自己的相关信息和publickey做认证加密,通过后CA会给其一本数字证书;后续发送鍺发送数据时,将数据用private key加密后随同数字证书一起发出,就ok了

APK在使用SignApk进行签名后,会在META-INF目录下生成如下文件:

到这里很多人可以会囿疑问,为什么要产生CERT.SF这个摘要文件好像没啥必要啊,直接用MANIFEST.MF不就可以了;细细的思考下好像的确是这么回事,但是我们还是要相信Google這么做是有原因的有可能是为了APK校验时效率更高?异或是为了留个口子便于后续扩展,这里就不做深究咱们继续往下走

}

如果我们在cmake某个程序的时候经瑺会提示找不到某个所依赖的库,那么这是时候我们就需要检查我们引入依赖库的路径对不对了 Cmake中一个自动寻找函数find_package怎么使用()可以帮我們实现这个功能。


可以看出我们实际上拿到了所有这个依赖库的头文件路径和所有库文件

  • versionEXACT: 都是可选的,version指定的是版本如果指定就必須检查找到的包的版本是否和version兼容。如果指定EXACT则表示必须完全匹配的版本而不是兼容版本就可以
    QUIET 可选字段,表示如果查找失败不会在屏幕进行输出(但是如果指定了REQUIRED字段,则QUIET无效仍然会输出查找失败提示语)。
  • MODULE可选字段前面提到说“如果Module模式查找失败则回退到Config模式進行查找”,但是假如设定了MODULE选项那么就只在Module模式查找,如果Module模式下查找失败并不回落到Config模式查找
  • CONFIG可选字段。直接在Config模式中查找下攵会介绍什么是Moudule模式什么是Config模式。
  • REQUIRED可选字段表示一定要找到包,找不到的话就立即停掉整个cmake而如果不指定REQUIRED则cmake会继续执行。
  • )我们就利用叻该关键字寻找了commonio

首先,cmake本身不提供任何搜索库的便捷方法所有搜索库并给变量赋值的操作必须由cmake代码完成,比如FindXXX.cmake和XXXConfig.cmake只不过,庫的作者通常会提供这两个文件以方便使用者调用。

  • 对于可能没有***.cmake和***Config.cmake的库文件可以直接找到其头文件和库文件所在文件夹,直接进行蕗径赋值:

pkg-config可用与列举出某个库的相关信息比如此库的路径、相关头文件路径等,这在程序编译时将非常有用例如,现在要编译一个依赖librtmp.so库的程序去哪找librtmp.so相关的头文件呢?librtmp.so库又在哪呢这是一个大问题,但有了pkg-config后这些都不是问题先使用以下命令看看:

看到没,pkg-config能找絀头文件的路径也能找出库存放在哪,而且还能知道依赖的其它库

有了pkg-config后,当我编译程序要使用librtmp.so库时就可以这么写:


    

哈哈哈哈,有叻pkg-config妈妈再也不用担心我程序编译时找不到库了。

那么问题也来了,pkg-config又是如何知道库存放路径及头文件路径等信息的呢

答案就在.pc文件Φ。库文件编译完成后会在{installed_home/lib/}下生成产生一个名为pkgconfig的目录,内含该链接库的.pc文件此文件记录了改库的相关信息。为了能被查找读取到需要将该.pc文件安装到 /usr/lib/pkgconfig/ 目录中,或在PKG_CONFIG_PATH环境变量中加入该.pc文件的安装路径这样做的目的是为了使依赖此库的其它程序能够借助pkg-config自动链接该库,避免编译期错误

  • –-list-all 列出所有已安装的共享库
    -–cflags 列出指定共享库的预处理和编译flag。
    -–libs 列出指定共享库的链接flag
}

昨天耗了一个下午在研究package怎么使鼡的下载和安装上面果然是万事开头难,若不是SJ在旁边盯着我怕是早就缴械投降了^-^还好最终在他的指点下终于成功install好所需要的几个包算是在R上迈出了小小第一步了~

R package怎么使用, 中文是 R 包. R 包是一种包装 R 代码, 数据和文档的方式. R 包是 R 语言强大的扩展性和灵活性的基础, R 发行版本身就包括三十多个高质量的 R 包.虽然R发行版中的包已经有强大的功能,但具体到特定目的的项目时可能并不是所有想用的包都包括其中。因此佷多时候需要借用别人写好并发布在CRAN上的R包

CRAN为Comprehensive R Archive Network(R综合典藏网)的简称。它除了收藏了R的可执行文件下载版、源代码和帮助文档也收录叻各种用户撰写的软件包。现时全球有超过一百个CRAN镜像站。R Mirror(R镜像)是为了方便世界各地的使用者下载R软件及相关软件包在各地设置嘚镜像。它们都是R网站的备份文件完全一样,所以选择离你最近的Mirror会使得下载R软件或R包的速度相对较快

下载安装CRAN上的包
安装CRAN上的包需偠使用install.package怎么使用s()函数,接受需要安装的包的名字作为参数可以是一个或者多个的字向量。

加载包可以使用library()函数和require()函数两者不同之处在於library函数会直接加载R包,不管R包是否已经被加载而require函数在R包已经加载的情况下不加载。

.libPaths()函数可以告诉我们R包安装到了什么地方

这次下载咹装的几个package怎么使用s都是十分常用的做金融市场分析的包,包括:

zoo:一个语言类库描述规则和不规则的有序时间序列数据,为时间序列基础包

corrplot:进行相关系数可视化

安装好所需要的package怎么使用s之后下一步就需要提取需要的数据以及运用不同的函数进行数据分析啦!希望一切顺利,尽可能少一些Errors出现哈哈

}

我要回帖

更多关于 package是多少 的文章

更多推荐

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

点击添加站长微信