导航:首页 > 源码编译 > android系统级增量编译

android系统级增量编译

发布时间:2023-01-06 09:14:06

① 如何加快android Studio 编译app 的速度

以下几个方法可以提高Android Studio的编译速度:

  1. Gradle 2.4对执行性能有很大的优化,要手动让Android Studio使用Gradle 2.4,在项目根目录下的 build.grade中加入。

    ② android系统编译jar包给app使用

    最近在android O编译系统jar包给应用使用遇到了点问题,网上也没有找到解决方案,这里记录下。

    编译方法参考网上博客就可以, android源码编译jar包

    最终生成了javalib.jar,改名为 tvManager.jar即可。注意:如果没有指定LACAL_JACK_ENABLED选项,则默认是enabled,将会生成classes.jack文件,不会产生classes.jar包!

    正常按照上面方案就可以编译出jar包,导入到AS里面就可以使用,下面说下我遇到的问题

    遇到classes.jar.toc被依赖, 但是怎么编译都没有编译出来,网上也没有找到对应的方法,编译错误如下:

    https://www.cnblogs.com/wangqiang9/p/9679466.html
    https://stackoverflow.com/questions/43471694/how-to-generate-classes-dex-toc-files

    ③ 整体编译Android系统,大家用了多少时间

    我自己实际编译ICS4.0.4源码情况:acer台式机,3.2Ghz cpu,4核,8GB/1600hz内存,整体编译(含u-boot、kernel、boot.img和system.img)需要1小时10分钟。编译时,使用make -j8(因为硬件cpu是4线程的,故使用2倍线程数)。之后的增量编译,一般需要5~10分钟即可。

    ④ Android系统编译命令make

    在编译Android系统时,需要先执行2条命令,来设置必要的环境变量。

    接下来就可以执行make系列命令,来完成不同的需要。

    make clean 用来清除编译历史,开始一个全新的编译。
    make -j 或 make -j8 启动编译过程。 -j 后面的数字代表要使用的cpu thread的数目。

    在完成了全编译后,才能执行生成OTA升级包的操作。

    注意事项:

    ⑤ 编译调试Android系统原生App - 以Settings为例

    本文已过时,最新文章:向大家推荐《使用 AS 开发 System App》 https://xiaozhuanlan.com/system-app

    Android原生系统带有许多原生的App,比如 浏览器、录音机、计算器、设置 等,有些时候,我们需要用到一些系统的功能,或者是对已有的功能做二次开发,比如我上学时给一个公司做过一个Launcher和Wizard,就需要用到系统设置中的某些功能,比如Wifi、声音、显示等功能,于是就需要从Settings源码中提取出需要的功能。

    特别是公司自己定制Android系统,需要在上面做一些 系统级的App 的时候,原生App已有的功能就可以通过编译其源码的方式直接拿过来改改就能用,而且可用度很高。

    这里有两种情况,分为 原生 的和 公司定制 的系统。无论是原生的还是定制的,类似于Settings这样需要使用到 系统级或隐藏API 的App,都需要系统签名文件和编译系统源码后得到相应的jar包才可以在IDE中编译,因为标准SDK根本没有那些API可供调用。

    举个栗子:

    需要额外的Jar就需要自己编译系统源码啦,这个是比较麻烦的,有兴趣可以试试自己编译定制自己的Android系统。

    ** 注意,既然是定制的,源码、jar、签名文件,还有系统都是一一对应的,你不能拿其他公司的系统签名来给你公司的系统app签名,这样无法运行的。 **

    有了源码,下一步当然是要跑起来啦。

    建议都使用Eclipse来编译,不要使用AS,因为AS编译大型的原生App能卡到你吐血,而且出错提示也不友好。但是用过AS的人都不想再碰Eclipse了有没有??别急,可以先用Eclipse编译过了,再贴到AS中,这样好很多,也很节省时间。

    初始化:

    放入源码:

    修正res错误:

    修正src错误:

    使用到系统级API的,或者AndroidManifest.xml文件中声明了

    那么没有系统签名,直接debug签名运行是不行的,需要向底层工程师要系统的签名文件,在源码目录
    build\target\proct\security
    下的 platform.pk8 和 platform.x509.pem ,如果你想看此次编译Settings是否已成功了,可以适当的在入口加一下Log,然后导出未签名的apk,使用系统签名进行签名后,放到 /system/app/ 下替换掉Settings.apk,然后重启系统,打开设置,看看Logcat是否输出里加入的Log。

    在不知道系统签名可以转换成debug签名前,老实说我一直都是用Log的方式调试,太特么痛苦了。现在知道后整个人都懵逼了。

    我们都希望可以像调试普通app那样调试系统app,以下是如何通过 openssl 将 platform.pk8 和 platform.x509.pem 转换成 debug.keystore 文件:

    三个命令

    此方法来自: http://curlog.com/2016/08/30/android-pk2debug-keystore/

    Mac自带openssl,linux和Win需要安装。

    然后就可以使用得到的debug签名配置到eclipse后愉快的调试啦,当然,得先把系统中已经存在的app先删除掉。然后重启系统,至于如何配置eclipse的debug签名,请Google。

    使用过AS后,当然希望在AS中也可以调试系统App,抽空再写篇相关编译和调试的文章。如果这篇文章帮到你了,给个赞呗。

    ⑥ Android系统编译指令make 、mmm、mm优缺点比较

    Android 系统提供了三种指令用于编译,他们分别为make、mmm、mm,这三个指令编译的优缺点如下:

    例如:make MediaProvider z这种模式对应于单个模块的编译。它的优点是:会把该模块依赖的其他模块一起跟着编译。例如:make libmedia 就会把libmedia依赖库全部编译好。当然缺点也会很明显,那就是它会搜索整个源码来定位MediaProvider 模块所使用的Android.mk文件。并且还要判断该模块依赖的其他模块是否有修改。所以编译时间比较长。

    注意:一般的编译方式都会采用增量编译,即只编译发生变化的目标文件,但有时则需要重新编译所有目标文件,那么就可以使用make 命令行的-B选项。例如:mm -B 模块名,或者mm -B、mmm -B。在mm 和 mmm内部也是调用make命令的,而make的-B选项将强制编译所有的目标文件。

    ⑦ 如何在windows下编译android系统

    目前官网不提供在windows下对android的支持,只提供对linux/mac(类UNIX)的支持,可参考 http://source.android.com/source/download.html

    android基于linux 内核,对其相关编译和连接环境有依赖。建议在windows上安装虚拟机,安装linux来编译。

    ⑧ android系统编译能用分布式编译吗

    项目越来越大,每次需要重新编译整个项目都是一件很浪费时间的事情。Research了一下,找到以下可以帮助提高速度的方法,总结一下。
    1. 使用tmpfs来代替部分IO读写
    2.ccache,可以将ccache的缓存文件设置在tmpfs上,但是这样的话,每次开机后,ccache的缓存文件会丢失
    3.distcc,多机器编译
    4.将屏幕输出打印到内存文件或者/dev/null中,避免终端设备(慢速设备)拖慢速度。

    tmpfs
    有人说在Windows下用了RAMDisk把一个项目编译时间从4.5小时减少到了5分钟,也许这个数字是有点夸张了,不过粗想想,把文件放到内存上做编译应该是比在磁盘上快多了吧,尤其如果编译器需要生成很多临时文件的话。
    这个做法的实现成本最低,在Linux中,直接mount一个tmpfs就可以了。而且对所编译的工程没有任何要求,也不用改动编译环境。
    mount -t tmpfs tmpfs ~/build -o size=1G
    用2.6.32.2的Linux Kernel来测试一下编译速度:
    用物理磁盘:40分16秒
    用tmpfs:39分56秒
    呃……没什么变化。看来编译慢很大程度上瓶颈并不在IO上面。但对于一个实际项目来说,编译过程中可能还会有打包等IO密集的操作,所以只要可能,用tmpfs是有益无害的。当然对于大项目来说,你需要有足够的内存才能负担得起这个tmpfs的开销。
    make -j
    既然IO不是瓶颈,那CPU就应该是一个影响编译速度的重要因素了。
    用make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。
    还是用Kernel来测试:
    用make: 40分16秒
    用make -j4:23分16秒
    用make -j8:22分59秒
    由此看来,在多核CPU上,适当的进行并行编译还是可以明显提高编译速度的。但并行的任务不宜太多,一般是以CPU的核心数目的两倍为宜。
    不过这个方案不是完全没有cost的,如果项目的Makefile不规范,没有正确的设置好依赖关系,并行编译的结果就是编译不能正常进行。如果依赖关系设置过于保守,则可能本身编译的可并行度就下降了,也不能取得最佳的效果。
    ccache
    ccache工作原理:
    ccache也是一个编译器驱动器。第一趟编译时ccache缓存了GCC的“-E”输出、编译选项以及.o文件到$HOME/.ccache。第二次编译时尽量利用缓存,必要时更新缓存。所以即使"make clean; make"也能从中获得好处。ccache是经过仔细编写的,确保了与直接使用GCC获得完全相同的输出。

    ccache用于把编译的中间结果进行缓存,以便在再次编译的时候可以节省时间。这对于玩Kernel来说实在是再好不过了,因为经常需要修改一些Kernel的代码,然后再重新编译,而这两次编译大部分东西可能都没有发生变化。对于平时开发项目来说,也是一样。为什么不是直接用make所支持的增量编译呢?还是因为现实中,因为Makefile的不规范,很可能这种“聪明”的方案根本不能正常工作,只有每次make clean再make才行。
    安装完ccache后,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,链到/usr/bin/ccache上。总之确认系统在调用gcc等命令时会调用到ccache就可以了(通常情况下/usr/local /bin会在PATH中排在/usr/bin前面)。
    安装的另外一种方法:
    vi ~/.bash_profile
    把/usr/lib/ccache/bin路径加到PATH下
    PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
    这样每次启动g++的时候都会启动/usr/lib/ccache/bin/g++,而不会启动/usr/bin/g++
    效果跟使用命令行ccache g++效果一样
    这样每次用户登录时,使用g++编译器时会自动启动ccache
    继续测试:
    用ccache的第一次编译(make -j4):23分38秒
    用ccache的第二次编译(make -j4):8分48秒
    用ccache的第三次编译(修改若干配置,make -j4):23分48秒

    看来修改配置(我改了CPU类型...)对ccache的影响是很大的,因为基本头文件发生变化后,就导致所有缓存数据都无效了,必须重头来做。但如果只是修改一些.c文件的代码,ccache的效果还是相当明显的。而且使用ccache对项目没有特别的依赖,布署成本很低,这在日常工作中很实用。
    可以用ccache -s来查看cache的使用和命中情况:
    cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes
    可以看到,显然只有第二编次译时cache命中了,cache miss是第一次和第三次编译带来的。两次cache占用了81.7M的磁盘,还是完全可以接受的。
    distcc
    一台机器的能力有限,可以联合多台电脑一起来编译。这在公司的日常开发中也是可行的,因为可能每个开发人员都有自己的开发编译环境,它们的编译器版本一般是一致的,公司的网络也通常具有较好的性能。这时就是distcc大显身手的时候了。
    使用distcc,并不像想象中那样要求每台电脑都具有完全一致的环境,它只要求源代码可以用make -j并行编译,并且参与分布式编译的电脑系统中具有相同的编译器。因为它的原理只是把预处理好的源文件分发到多台计算机上,预处理、编译后的目标文件的链接和其它除编译以外的工作仍然是在发起编译的主控电脑上完成,所以只要求发起编译的那台机器具备一套完整的编译环境就可以了。
    distcc安装后,可以启动一下它的服务:
    /usr/bin/distccd --daemon --allow 10.64.0.0/16
    默认的3632端口允许来自同一个网络的distcc连接。
    然后设置一下DISTCC_HOSTS环境变量,设置可以参与编译的机器列表。通常localhost也参与编译,但如果可以参与编译的机器很多,则可以把localhost从这个列表中去掉,这样本机就完全只是进行预处理、分发和链接了,编译都在别的机器上完成。因为机器很多时,localhost的处理负担很重,所以它就不再“兼职”编译了。
    export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
    然后与ccache类似把g++,gcc等常用的命令链接到/usr/bin/distcc上就可以了。
    在make的时候,也必须用-j参数,一般是参数可以用所有参用编译的计算机CPU内核总数的两倍做为并行的任务数。
    同样测试一下:
    一台双核计算机,make -j4:23分16秒
    两台双核计算机,make -j4:16分40秒
    两台双核计算机,make -j8:15分49秒
    跟最开始用一台双核时的23分钟相比,还是快了不少的。如果有更多的计算机加入,也可以得到更好的效果。
    在编译过程中可以用distccmon-text来查看编译任务的分配情况。distcc也可以与ccache同时使用,通过设置一个环境变量就可以做到,非常方便。
    总结一下:
    tmpfs: 解决IO瓶颈,充分利用本机内存资源
    make -j: 充分利用本机计算资源
    distcc: 利用多台计算机资源
    ccache: 减少重复编译相同代码的时间
    这些工具的好处都在于布署的成本相对较低,综合利用这些工具,就可以轻轻松松的节省相当可观的时间。上面介绍的都是这些工具最基本的用法,更多的用法可以参考它们各自的man page。
    5.还有提速方法是把屏幕输出重定向到内存文件或/dev/null,因对终端设备(慢速设备)的阻塞写操作也会拖慢速度。推荐内存文件,这样发生错误时,能够查看。

阅读全文

与android系统级增量编译相关的资料

热点内容
钢筋是怎么加密的 浏览:433
二分查找算法php 浏览:518
php产品对比 浏览:641
解压伤感图片 浏览:476
python判断周几 浏览:16
数据文档加密保管 浏览:168
app会员如何运营 浏览:860
工行app登录名如何改 浏览:25
window怎么登陆服务器 浏览:992
Python取ID对应的值 浏览:633
现在我的世界什么服务器最混乱 浏览:764
美国好的源码出售 浏览:326
苹果ipad文件夹怎么添加文字 浏览:485
腾讯云连接自己的服务器地址 浏览:218
硕士英语综合教程pdf 浏览:46
分段加密的安全性 浏览:507
咪咕直播为什么没有适配安卓系统 浏览:172
php模版大全 浏览:102
没车能解压吗 浏览:634
php开发oa系统源码 浏览:759