0%

普通文件读写过程

读文件:会先把文件数据拷贝到内核空间中的页缓存中,然后再把页缓存的数据拷贝到用户空间中,这里需要两次数据拷贝。

写文件:先把用户空间的数据拷贝到内核空间,内核空间再写回磁盘,也是两次数据拷贝。

mmap实现过程

  1. 在当前进程的虚拟地址空间中寻找一段满足要求的虚拟地址,然后创建vm_area_struct结构,对其进行初始化,最后将其插入到进程的虚拟地址区域链表(或者树)中。

  2. 内核根据fd找到文件磁盘物理地址,建立页表实现文件地址和虚拟地址区域的一一对应。

  3. 进程对映射的虚拟地址空间发起访问,引发缺页中断,系统会把所缺的页装入主存中。

Read more »

V1签名过程

随便找个apk解压,会看到有个META-INF文件夹,这个就是跟apk的签名有关的,里面会有三个文件:MANIFEST.MF,ANDROID.SF,ANDROID.RSA。

  • MANIFEST.MF

    这个保存了apk中所有文件的消息摘要值,遍历apk所有的文件,对于每一个文件,都用SHA1(或者SHA256)计算其摘要,然后再做Base64编码,得到的值和文件路径组成key-value,写入到MANIFEST.MF文件中。示例如下:

    Manifest-Version: 1.0
    
    Name: AndroidManifest.xml
    SHA1-Digest: bVaU03v/s2D1ZnfNly3inexGx8E=
    
    Name: LICENSE-junit.txt
    SHA1-Digest: xa0kHcW0TK5p5IxSU7ej/t5BXqE=
    
    Name: LICENSE.txt
    SHA1-Digest: dTF36wNXk3NZRvp51lzE8FW7KYQ=
    
    Name: R/a/gu.xml
    SHA1-Digest: EImnskGmHG13zzjLQsBz7AaLVGU=
    
    Name: R/a/hf.xml
    SHA1-Digest: 1UI3hZQyzdEjUG/usTIhx245zDM=
    ......
  • CERT.SF

    这个是对MANIFEST.MF中的所有条目,再次进行SHA1+Base64处理,最终的结果同样组成key-value,写入到CERT.SF文件中。示例如下:

    Signature-Version: 1.0
    Created-By: 1.0 (Android)
    SHA1-Digest-Manifest: ktRWgoJhhmR9UKW2bkvJv9sWbwg=
    X-Android-APK-Signed: 2
    
    Name: AndroidManifest.xml
    SHA1-Digest: vPXU1jU9CV5ThOTQ1dhPspFhSDY=
    
    Name: LICENSE-junit.txt
    SHA1-Digest: i/XNa154J6oo2MWLxVtyjXAag2Q=
    
    Name: LICENSE.txt
    SHA1-Digest: dtxUfw7RZZWDxsyMx++B4WEugqM=
    
    Name: R/a/gu.xml
    SHA1-Digest: QgyDHCXLVsWQFsZVYbvZnimS81w=
    
    Name: R/a/hf.xml
    SHA1-Digest: N8tGKy5jd9e3TmOtLTmfwtUW1LM=
    ......
  • CERT.RSA

    首先这里需要一个证书,其实就是平时开发用到签名文件,然后利用这个证书里面的私钥对CERT.SF计算得到签名,然后把这个签名和证书写入到CERT.RSA中,注意写入的证书包含了公钥信息,私钥是不会写进去的。这里用到的证书是自签名的,也就是开发者自己生成,不用要求必须是CA机构发布的。

Read more »

1. 初始化

WebView webView = new WebView(this);

这里需要区分首次和非首次,首次创建WebView需要几百ms,而非首次创建为几ms到几十ms。

可以看到,这里初始化是比较耗时的,而我们有时直接把它放到UI线程,或者写在xml中是有问题,会导致打开页面卡死甚至ANR,应该是放到子线程中初始化结束后才添加到View树中。

Read more »