导航:首页 > 源码编译 > 怎么编译安卓源码

怎么编译安卓源码

发布时间:2022-06-18 13:51:22

‘壹’ 自己可以编译安卓源码

用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:

sudo apt-get install git git config –global user.email “[email protected]” git config –global user.name “test”

其中[email protected]为你自己的邮箱.

简要说明

android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.

源码下载

由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)

repo工具下载及安装

通过执行以下命令实现repo工具的下载和安装

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

补充说明
这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:

我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:


这里写图片描述

执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.

错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.

    结束吧

    到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.

    ‘贰’ 如何将源代码编译后的文件编译到android中

    1.将应用程序源码复制进Android源码目录中(提前编译好源码)
    2.使用build/envsteup.sh 配置shell -
    mm TARGET_PRODUCT=proct_name
    或直接./build_android.sh 也能完成编译。
    3.在源码目录:out/target/proct/proctname/obj/APPS/test_cert_intermediates 下有三个文件:package.apk package.apk.unsigned package.apk.unaligned
    将package.apk.unsigned复制出来,单独进行sign.
    4.在Windows下进行sign: jarsigner -verbose -keystore youkey.keystore d:\package.apk.unsigned youkey
    5.zipalign -v 4 d:\package.apk.unsigned d:\package.signed.apk

    ‘叁’ 如何在Android系统源码的环境下用make来编译

    第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:
    1. 在应用程序的AndroidManifest.xml中的manifest节点中加入
    android:sharedUserId="android.uid.system"这个属性。
    2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
    3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。

    ‘肆’ 源码怎么编译

    使用编译器如VC++6.0,VC++2008

    ‘伍’ windows下如何编译android源码

    如果没记错,windows下是没法编译android框架源代码的

    因为android是基于linux平台的,因此底层的很多东西都是基于linux系统的

    如果只是单纯的android应用程序,则可以在windows下开发编译

    只需要用Eclipse的adt插件加上windows下开发的Android SDK就行了。

    ‘陆’ Linux命令行怎么编译Android代码

    这个问题已经找到解决方案了,方法如下:
    1.在Linux设置文件共享,将项目
    共享,最好有个密码什么的。
    2.在Linux上配置ssh server,用于
    和编译安卓源码
    3.Linux mac 通过
    连接,原因是有线传输比无线的快很多,ping只是0.3左右ms,不影响使用。然后就可以mac编写代码,然后ssh
    编译什么的,很方便,

    ‘柒’ 如何单独编译Android源码中的模块

    1.make 模块名称
    需要查看Android.mk文件的LOCAL_PACKAGE_NAME变量。
    2.mmm命令
    用于在源码根目录编译指定模块,参数为模块的相对路径。只能在第一次编译后使用。比如要编译Phone部分源码,需要在终端中执行以下命令:
    $mmm packages/apps/phone
    3.mm命令
    用于在模块根目录编译这个模块。只能在第一次编译后使用。例如要编译Phone部分源码,需要在终端中执行以下命令:
    $cd packages/apps/phone
    $mm
    注:mmm和mm命令必须在执行“.build/envsetup.sh”之后才能使用,并且只编译发生变化的文件。如果要编译模块的所有文件,需要-B选项,例如mm -B。

    ‘捌’ android源码怎么编译生成recovery.img

    recovery.img生成过程
    L630-L637 依赖关系
    (From: build/core/Makefile)630 $(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) /631 $(INSTALLED_RAMDISK_TARGET) /632 $(INSTALLED_BOOTIMAGE_TARGET) /633 $(recovery_binary) /634 $(recovery_initrc) $(recovery_kernel) /635 $(INSTALLED_2NDBOOTLOADER_TARGET) /636 $(recovery_build_prop) $(recovery_resource_deps) /637 $(RECOVERY_INSTALL_OTA_KEYS)

    INSTALLED_RECOVERYIMAGE_TARGET 为我们的编译目标:

    584 INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img

    它依赖很多其它目标:
    1.MKBOOTFS, MINIGZIP, MKBOOTIMG,PC端工具软件:(From build/core/config.mk)265 MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX)266 MINIGZIP := $(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX)267 MKBOOTIMG := $(HOST_OUT_EXECUTABLES)/mkbootimg$(HOST_EXECUTABLE_SUFFIX)

    2.INSTALLED_RAMDISK_TARGET,标准根文件系统 ramdisk.img:

    326 BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img328 # We just build this directly to the install location.329 INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET) 3.INSTALLED_BOOTIMAGE_TARGET, 即boot.img,标准内核及标准根文件系统:362 INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img

    4. recovery_binary, Recovery可执行程序,源码位于:bootable/recovery

    590 recovery_binary := $(call intermediates-dir-for,EXECUTABLES,recovery)/recovery

    5. recovery_initrc,recovery模式的init.rc, 位于 bootable/recovery/etc/init.rc

    586 recovery_initrc := $(call include-path-for, recovery)/etc/init.rc

    6. recovery_kernel, recovery 模式的kernel, 同标准内核

    587 recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system

    7.INSTALLED_2NDBOOTLOADER_TARGET,我们不用。

    8. recovery_build_prop, recovery 模式的build.prop, 同标准模式。589 recovery_build_prop := $(INSTALLED_BUILD_PROP_TARGET)

    9. recovery_resource_deps, recovery 模式使用的res, 位于:recovery/custom/{proct_name}/res, 以及设备自定义部分(我们没用到)

    591 recovery_resources_common := $(call include-path-for, recovery)/custom/$(TARGET_PRODUCT)/res592 recovery_resources_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/res))593 recovery_resource_deps := $(shell find $(recovery_resources_common) 594 $(recovery_resources_private) -type f) 10. RECOVERY_INSTALL_OTA_KEYS, ota 密钥:

    618 # Generate a file containing the keys that will be read by the619 # recovery binary.620 RECOVERY_INSTALL_OTA_KEYS := /621 $(call intermediates-dir-for,PACKAGING,ota_keys)/keysL638-L655 准备内容
    638 @echo ----- Making recovery image ------639 rm -rf $(TARGET_RECOVERY_OUT)640 mkdir -p $(TARGET_RECOVERY_OUT)641 mkdir -p $(TARGET_RECOVERY_ROOT_OUT)642 mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc643 mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/tmp

    准备recovery目录:out/target/proct/{proct_name}/recovery 及其子目录:

    ./root

    ./root/etc

    ./root/tmp644 echo Copying baseline ramdisk...645 cp -R $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT)646 echo Modifying ramdisk contents...647 rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res

    从标准根文件系统拷贝所有文件, 删除其res 目录。

    648 cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/649 cp -f $(recovery_binary) $(TARGET_RECOVERY_ROOT_OUT)/sbin/ 拷贝recovery 模式的核心文件 init.rc 及 recovery 650 cp -rf $(recovery_resources_common) $(TARGET_RECOVERY_ROOT_OUT)/651 $(foreach item,$(recovery_resources_private), /652 cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/)653 cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys 拷贝资源文件及密钥文件。 654 cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) /655 > $(TARGET_RECOVERY_ROOT_OUT)/default.prop 生成属性文件 default.prop, 它包含了标准根文件系统的default.prop (out/target/proct/{proct_name}/root/default.prop)以及system分区的build.prop (out/target/proct/{proct_name}/system/build.prop) L656-L661 最终生成recovery.img
    656 $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk) 压缩recovery根文件系统 657 build/quacomm/mkimage $(PRODUCT_OUT)/ramdisk-recovery.img RECOVERY > $(PRODUCT_OUT)/ramdisk_recovery.img 加一个标识头(RECOVERY) 658 mv $(PRODUCT_OUT)/ramdisk_recovery.img $(PRODUCT_OUT)/ramdisk-recovery.img659 $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) --output $@660 @echo ----- Made recovery image -------- $@661 $(hide) $(call assert-max-image-size,$@,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE),raw)

    和内核一起,生成recovery.img附:Recovery 根文件系统目录结构


    $ tree

    .

    ├── advanced_meta_init.rc

    ├── data

    ├── default.prop

    ├── dev

    ├── etc

    ├── init

    ├── init.factory.rc

    ├── init.goldfish.rc

    ├── init.quacomm.rc

    ├── init.rc

    ├── meta_init.rc

    ├── proc

    ├── res

    │ ├── images

    │ │ ├── icon_error.png

    │ │ ├── icon_installing.png

    │ │ ├── indeterminate1.png

    │ │ ├── indeterminate2.png

    │ │ ├── indeterminate3.png

    │ │ ├── indeterminate4.png

    │ │ ├── indeterminate5.png

    │ │ ├── indeterminate6.png

    │ │ ├── progress_empty.png

    │ │ └── progress_fill.png

    │ └── keys

    ├── sbin

    │ ├── adbd

    │ ├── advanced_meta_init

    │ ├── meta_init

    │ ├── meta_tst

    │ └── recovery

    ├── sys

    ├── system

    └── tmp

    ‘玖’ 如何单独编译安卓系统源码指定模块

    Android源码目录下的build/envsetup.sh文件,描述编译的命令

    - m: Makes from the top of the tree.

    - mm: Builds all of the moles in the current directory.

    - mmm: Builds all of the moles in the supplied directories.

    要想使用这些命令,首先需要在android源码根目录执行. build/envsetup.sh 脚本设置环境

    m:编译所有的模块

    mm:编译当前目录下的模块,当前目录下要有Android.mk文件

    mmm:编译指定路径下的模块,指定路径下要有Android.mk文件

    下面举个例子说明,假设我要编译android下的\hardware\libhardware_legacy\power模块,当前目录为源码根目录,方法如下:

    1、. build/envsetup.sh

    2、mmm hardware/libhardware_legacy/power/

    编译完后 运行 make snod

    会重新将你改过的模块打入到system.img中

    ‘拾’ android 导进来的工程修改源码后怎么编译

    1、Android的文件系统结构是怎样的,我们安装的程序放在那里?
    编译Android源码之后,在out/target/proct/generic一些文件:
    ramdisk.img、system.img、userdata.img、 system、 data、root
    其中, system.img是由 system打包压缩得到的, userdata.img是由 data打包压缩得到的。

    ramdisk.img是模拟器的文件系统,把ramdisk.img解压出来可知道,ramdisk.img里的文件跟root文件夹的文件基本一样。模拟器装载ramdisk.img并解压到内存,接着分别把system.img和userdata.img挂载到 ramdisk下的system和data目录。我们编译出来的应用程序就是放在system/app下的。用户安装的程序则是放在data/app下。

    2、Android SDK和android源码能为我们提供什么工具?
    AndroidSDK提供有很多工具,如adb,ddms,emulator,aapt等,并提供kernel-qemu、ramdisk.img、system.img、userdata.img。因此,只要有android SDK,我们就可以在模拟器上把android跑起来。
    Android源码可以编译出android SDK、adb等工具、android文件系统,以及ADT插件,也就是说,我们可以从android源码编译出所有android相关的东西。

    3、 把Android源 码”make”之后会生成许多工具和android文件系统(system.img等),我们又可以使用“makesdk”来生成android SDK,android
    SDK也包括有工具和android文件系统(system.img等),而原来安装的时候我们也安装了androidSDK,那么我们在开发时应该使用那些工具和android文件系统呢?

    阅读全文

    与怎么编译安卓源码相关的资料

    热点内容
    linuxbt命令 浏览:284
    安卓怎么注销苹果区和平营地 浏览:142
    怎么去调整电脑文件夹的桌面 浏览:210
    解压汽车绿本可以找代理人吗 浏览:64
    我的世界命令方块在哪 浏览:315
    linuxzone 浏览:746
    androidapi版本号 浏览:784
    小猪佩奇配音解压吃东西 浏览:284
    程序员怎么申请公司年会 浏览:870
    圈店app的预约头条功能怎么样 浏览:34
    云服务器设置ad域 浏览:316
    我的世界无尽贪婪奇点压缩器 浏览:394
    源码资源免费分享网 浏览:686
    批量qq号有效验证源码 浏览:513
    本科程序员五年工资 浏览:902
    创维电视柜怎么安装app 浏览:854
    可爱的程序员陆漓剧照 浏览:851
    怎样把截屏压缩成300kb 浏览:226
    dart文件加密 浏览:40
    java对接摄像头源码 浏览:887