Android Prelink

LOCAL_PRELINK_MODULE和prelink-linux-arm.map LOCAL_PRELINK_MODULE         Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销, 是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。程序运行时的 动态链接尤其是重定位(relocation)的开销对于大型系统来说是很大的。         动态链接和加载的过程开销很大,并且在大多数的系统上, 函数库并不会常常被更动, 每次程序被执行时所进行的链接 阅读详情

  1.      原理简介

1)          Prelink
Prelink
即预链接技术是利用事先链接以代替运行时链接的技术,以加快共享库的加载速度,它不仅能加快程序启动时间,还可以减少部分内存开销(它能使 KDE 的启动时间减少 50% )。每次程序执行时,进行的链接动作都是一样的,链接相对来说开销很大,尤其是嵌入式系统。

2)          普通 Linux 系统的 Prelink
Redhat
系统中 prelink 工具 (/etc/cron.dialy/prelink) 会修改可执行程序,把它与所需库的链接信息加入可执行程序。在程序运行时,使用 glibc(glibc > 2.3.1-r2) 中的 ld-linux.so 来进行链接。用此方式,每次更新动态库后,使用它的程序都需要重新 prelink ,因为新库中的符号信息,地址等很可能与原来不同了。

3)          Android 的 Prelink
Android
源码中有一组 map 文件,其中定义了需要预连接的动态库,其 Prelink 信息以及对应的逻辑地址( 4G 地址空间中位置),在动态库编译时,预处理程序 apriori 根据 map 文件中的定义,生成预链接信息重定向信息,并加入这些二进制文件 lib*.so 的末尾。它主要节约了查询函数地址等工作所用的时间,动态库重定位的开销。在运行程序,动态库加载时,加载程序 linker 判断动态库是否为 Prelink 的,如果是的话,就在首次使用时将其加载到指定的内存空间,直接使用预编译信息。

2.      源码分析

1)          动态库的编译脚本

a)           源代码
frameworks/base/media/libmedia/Android.mk
等库的编译选项文件

b)          配置
可在 Android.mk 中设置该库是否需要 Prelink ,默认是使用 Prelink 的,也可设置成否,方法如下:
LOCAL_PRELINK_MODULE := false

c)           分析
此设置只用于动态库的编译,编译时用 showcommands 参数即可看到具体编译使用到的命令行,如在某个库的目录中运行 mm showcommands ,即可看到相应的 Prelink 操作,示例如下:
target Prelink: libxxx
out/host/linux-x86/bin/apriori --prelinkmap build/core/prelink-linux-arm-2G.map --locals-only --quiet xxx.so --output xxx.so
如果该库设置为需要 prelink ,则也需要在 map 文件中加入相应项,否则编译不通过

2)          内核

a)           源码
kernel/arch/arm/configs/xxx_defconfig
arch/arm/mach-msm/include/mach/vmalloc.h

b)          配置
CONFIG_VMSPLIT_2G=y   
一般默认为 3G /1G ,此项 即设置为 2G /2G

c)           分析
xxx_defconfig
为默认的内核配置文件 ( 修改其中的 CONFIG_VMSPLIT_*) ,也可通过 make menuconfig 配置,与 Prelink 相关的主要是指定用户空间和内核空间内存如何分配 4G 的虚拟内存空间( Memory split ),一般有三种方式: 3G /1G , 2G /2G , 1G /3G(user/kernel) ,一般默认的是用户空间 3G (0x0-0xBFFFFFFF) ,内核空间 1G (0xC0000000 - 0xFFFFFFFF)

d)          内存分析示例,以 3G /1G 为例 ( 见 build/core/prelink-linux-arm.map)
0xC0000000 - 0xFFFFFFFF Kernel
0xB0100000 - 0xBFFFFFFF Thread 0 static
0xB0000000 - 0xB00FFFFF Linker
0xA0000000 - 0xBFFFFFFF Prelinked System Libraries
0x90000000 - 0x9FFFFFFF Prelinked App Libraries
0x80000000 - 0x8FFFFFFF Non-prelinked Libraries
0x40000000 - 0x7FFFFFFF mmap’s stuff
0x10000000 - 0x3FFFFFFF Thread Stacks
0x00000000 - 0x0FFFFFFF .text / .data / heap

3)          map 文件

a)           源代码
build/core/prelink-linux-<arch>*.map

b)          配置
编译时有多个 map 文件可先,根据不同的硬件平台及内存分配 (3G/1G, 2G/2G) 修改系统配置 device/*/BoardConfig.mk 选择使用不同的 map 文件 .
如
prelink-linux-arm-2G.map, prelink-linux-arm.map
系统中每加入一个需要 prelink 的动态库,需要在 map 文件添加相应的项

c)           分析
在用户空间,共定义了三块与链接相关地址间空
系统库分配的内存: Prelinked System Libraries
应用库分配的内存:
Prelinked App Libraries
无 prelink 库分配的内存: Non-prelinked Libraries

d)          map 文件规则
需要在  build/core/prelink-linux-arm.map  中加入形如 libhellod.so 0x96000000 。
手工指定某个库相应的 prelink 地址范围,库应用对齐 1M 边界,注意库与库之间的间隔数,如果指定不好编译的时候会提示说地址空间冲突的问题。另外,注意排序,这里要把数大的放到前面去,按照大小降序排序。

4)          apriori 程序

a)           源代码
build/tools/apriori/*

b)          配置
device/*/BoardConfig.mk
中设置
TARGET_USES_2G_VM_SPLIT := true 
以配置 Prelink 的地址空间

c)           分析
apriori
中的 prelinkmap.c 它用根据整个系统设置 device/*/BoardConfig.mk 的内存分配规则( 3G /1G, 2G/2G )来判断 map 中指定地址是否符合 Prelink 的地址空间范围,如果正常,则在 so 的末尾加入 prelink 信息和标识 ( 文件以 PRE 结束 )
apriori
可以预先为若干共享库确定加载地址,并为有依赖关系的共享库做静态重定位和连接 ,  该命令加入参数 --verbose ,即可显示出 prelink 的细节。

5)          linker 程序

a)           源代码
bionic/linker/*
(bionic
目录中存放一些基础的库,如 libc, libstdc++, libthread_db, linker 等 )

b)          分析
linker
是 Android 的专用动态链接库键接器, Linker 和传统 Linux 使用的 linker(ld.so,ld-linux.so.2,ld-linux.so.3) 有所不同。库的编译参数 -dynamic-linker 指定了键接器为 /system/bin/linker( 也可以手动换成别的 ) , 该信息将被存放在 ELF 文件的 .interp 节中,内核执行目标映像文件前将通过该信息加载并运行相应的解释器程序 linker ,并链接相应的共享库, 共享库以 ELF 文件的形式保存在文件系统中 。 核心的 load_elf_binary 会首先将其映像文件映射到内存,然后映射并执行其解释器也就是 linker 的代码。 linker 的代码段是进程间共享的,但数据段为各进程私有。
所有外部过程引用都在映像执行之前解析 ,  Android 中的共享库和可执行映像都默认采用 ELF 格式的文件 .  程序头表包含了加载到内存中的各种段的索引及属性信息,它将告诉加载器如何加载映像,初始化时,动态链接器首先解析出外部过程引用的绝对地址,一次性的修改所有相应的 GOT 表项。
linker 会在共享库加载时,调用 is_prelinked 查看该库是否是 prelink 的,并在 alloc_mem_region 中检查目的地址是否被占用。 如果该库不是 prelink 的,则库加载的起始地址为零。

3.      参考文档:

1)          动态库优化—— Prelink (预连接)技术
http://www.eefocus.com/article/09-04/71629s.html

2)          Android build system note -  一醉千年  - 优快云 博客
http://blog.youkuaiyun.com/yili_xie/archive/2009/12/01/4906865.aspx

3)          Linux, Android 基础知识总结
http://wenku.baidu.com/view/f68fc029647d27284b735100.html

4)          android Linker 浅析
http://blog.youkuaiyun.com/dinuliang/archive/2010/04/20/5509009.aspx

 

http://blog.youkuaiyun.com/liusiyun/archive/2011/05/13/6418171.aspx


实战MSP-M0G3507与陶晶驰串口屏的通信协议解析 本文详细解析了MSP-M0G3507微控制器与陶晶驰串口屏的通信协议实现。内容涵盖串口配置、协议帧结构、数据校验机制及ASCII协议实战代码,重点介绍了陶晶驰串口屏的指令集应用和调试技巧,为嵌入式开发提供可靠的串口通信解决方案。 阅读详情

相关推荐

renderdoc的使用

renderdoc可以用来捕获帧渲染情况,排查一些GPU渲染、资源规格等问题。 下面讲述一些该软件连接真机调试使用。 一、下载安装renderdoc 软件的下载地址:https://renderdoc.org/可直接点击下载即可。该软件是开源免费的,不用破解。 下载后直接安装即可使用。 二、打开使用renderdoc 打开界面后,默认的界面布局如下图所示,(这里我已经设置了黑色主题,可以忽略这点),renderdo中主要的窗口有Texture Viewer(纹理查看器)、Event B.

x_xingduo_2315的博客 2万+

Android Prelink实现的源码分析

Android源码中有一组map文件,其中定义了需要预连接的动态库,其Prelink信息以及对应的逻辑地址(4G地址空间中位置),在动态库编译时,预处理程序apriori根据map文件中的定义,生成预链接信息重定向信息,并加入这些二进制文件lib*.so的末尾。它主要节约了查询函数地址等工作所用的时间,动态库重定位的开销。在运行程序,动态库加载时,加载程序linker判断动态库是否为Prelink的,如果是的话,就在首次使用时将其加载到指定的内存空间,直接使用预编译信息。

谢彦的技术博客 1691

ESP32学习,驱动LED点阵屏,SD卡播放GIF动图

搬运就可以实现效果,如果有不足,请批评指正。下步该学一下如何文章上视频了,老是截图不方便展示效果。

u011625956的博客 1868

Android中的prelink技术

背景<br />  在Android中添加自己的库文件,在编译时会提示:library 'XXX.so' not in prelink map 错误, 这就是表明Android中应用了prelink技术,那么什么是prelink呢,它有什么用? 怎样在Android中添加自己的动态库呢?  好,下面一一解答.<br /> 参考文章<br />http://blog.youkuaiyun.com/ccskyer/archive/2010/06/18/5677553.aspx<br />http://www.eefocus

zzqhost的专栏 5618

STM32F0实现数字化SPWM纯正弦波逆变器

这个没啥好说的,搭电路的事。其核心思想是两边桥臂分别由两个180度相位差的正弦波与三角载波比较来控制,优点是在开关器件工作频率一样的情况下,输出PWM频率是单极性SPWM的2倍,能够明显减少谐波,因此只需要相对较小的电感和电容滤波器件就可以起到很好的滤波效果,提升了系统的性能,也精简了系统体积,降低了成本。而双极性pwm则是在整个正弦周期内,四只管子都在高频开关状态工作,对角线上的管子一起导通,另一对角线上管子互补导通,实际上只需要一路互补的PWM控制,负载上电压在正电压和负电压之间切换,不出现0v。

forlifefor的专栏 1万+

从工创赛实战到开源:一个高鲁棒性智能物流视觉系统的构建与优化

本文分享了从工创赛实战中构建高鲁棒性智能物流视觉系统的完整经验。针对赛场复杂光线环境,详细阐述了摄像头选型、基于CLAHE和形态学梯度的抗干扰色环识别算法、卡尔曼滤波状态估计以及多线程串口通讯与任务调度等核心优化策略,旨在打造一个稳定可靠的视觉系统,并已将相关代码开源。

weixin_29046035的博客 318

使用 Prelink 加速程序启动

一、什么是预链接? 1.1 Prelink 简介 Prelink 是 Red Hat 开发者 Jakub Jelinek 所设计的工具。正如其名字所示,Prelink 利用事先链接代替运行时链接的方法来加速共享库的加载。它不仅可以加快起动速度,还可以减少部分内存开销,是各种 Linux 架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。 Linux 系统运行时的动态链接尤其是重定位 (Relocation) 的开销,对于大型系统来说是很大的。相比之下,早期 UNIX

gezi322的专栏 1753

Avalonia+ReactiveUI跨平台路由:从零到舞者,你的UI也能跨界起舞?

至此,你已掌握了Avalonia+ReactiveUI的跨平台路由精髓!你的应用现在能够优雅地在各个界面间穿梭,就像是在不同星球间跳跃的宇宙飞船。无论是初探跨平台开发的新手,还是经验丰富的老船长,这段旅程都能让你的UI编排技能更上一层楼。现在,是时候让世界见证你的跨平台魔术了!💫记住,每一次实践都是向着完美编舞迈进的一步,勇敢地在你的项目中尝试吧!如果在航行中遇到风暴,别忘了回来看看这篇指南,或者在评论区抛出你的救生圈,我们一起解决!🌊。

java专栏 1534

Linux系统中的内存划分-- VM split

内核内部,尤其是关于内存管理,是一个庞大而复杂的内容,可以说花上一辈子时间来研究内核中内存管理部分都不夸张。

zyqash的博客 1259

Unity Hololens2开发|(三)工程发布及真机部署(3种方法)

选择项目->属性,进入项目属性页,选择调试,将HoloLens2的IP地址填写至页面,如下图。确保HoloLens2与计算机在同一网络下,并保持开启状态,点击运行,即开始生成部署.注意:该方式不支持覆盖安装,如果重复安装同一个App,需要先卸载再安装!选择Release下的ARM64,选择远程计算机,如下图。

游戏开发小Y的博客 14万+

数字滤波器应用介绍

线性滤波器FIR ,会引起恒定延迟,通过补零的方式补偿非线性滤波器IIR,会引起频率相关的延迟,通过零相位延迟filtfilt补偿从信号中去除不需要的频谱时,通过滤波和补偿实现。如果需要去除的频率与采样率相差甚远,比如4kHz 与100Hz, 可通过 低通滤波->补偿->降采样–> 滤波 补偿 -->上采样还原的方法。*降采样前一定要先低通滤波为了防止混叠。

weixin_39107270的博客 274

关于Android的prelink

<br />在Android中添加自己的库文件,在编译时会提示:library 'XXX.so' not in prelink map 错误,<br />其中一个很重要的文件在build/core/prelink-linux-arm.map,但不是很了解,下面是转别人的文章,自己慢慢吸收:<br /> <br /> <br />变量设置为false那么将不做prelink操作<br /> LOCAL_PRELINK_MODULE := false<br /> 默认是需要prlink 的,同时需要在 b

ccskyer的专栏 9333

自动化测试与AI的结合应用

自动化测试,人工智能,机器学习,深度学习,测试用例生成,缺陷预测,测试优化 1. 背景介绍 在软件开发领域,自动化测试已成为不可或缺的一部分,它可以提高测试效率、降低测试成本,并确保软件质量。然而,传统的自动化测试方法往往依赖于人工编写的测试用例,这不仅耗时费力,而且难以应对复杂软件

AI架构师小马 2247

Android PreLink 技术简介

1.      原理简介 1)          Prelink Prelink 即预链接技术是利用事先链接以代替运行时链接的技术,以加快共享库的加载速度,它不仅能加快程序启动时间,还可以减少部分内存开销(它能使 KDE 的启动时间减少 50% )。每次程序执行时,进

dssxk的专栏 814

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android prelink

Android Prelink <br />      1.    原理简介<br />1)        Prelink<br /> Prelink即预链接技术是利用事先链接以代替运行时链接的技术,以加快共享库的加载速度,它不仅能加快程序启动时间,还可以减少部分内存开销(它能使KDE的启动时间减少50%)。每次程序执行时,进行的链接动作都是一样的,链接相对来说开销很大,尤其是嵌入式系统。<br />2)        普通Linux系统的Prelink<br /> Redhat系统中prelink工具

liusiyun的专栏 1624

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android学习之--prelink

最近移植一些既存的c程序到android中,不可避免的需要了解ndk,jni之类的东西,编译体系,toolchain之类的东西。偶尔,发现了Android中的src中有一个叫做“LOCAL_PRELINK_MODULE”的参数,它是Android采用的加快一些系统的函数库加载速度的手段。 因为对这个比较感兴趣,就稍微去了解了一下。 首先,需要了解一下什么是prelink 由Red

为了工作而工作是悲哀的!工作是实现自我价值的地方! 3496

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

关于Android的prelink(Linux)

Android 添加库文件 (转:原文链接:http://blog.youkuaiyun.com/ccskyer/archive/2010/06/18/5677553.aspx) 在Android中添加自己的库文件,在编译时会提示:library 'XXX.so' not in prelink map 错误, 其中一个很重要的文件在build/core/prelink-linux-arm.map...

凌乱的碎片~ 201
上一篇: Android筆記
下一篇: 一些分辨率
eustoma
博客等级 码龄18年 79粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值