[AndroidO基础] -- Android 编译安装Module的控制因素

前文Android——编译系统初始化设置中有解析编译的TARGET_BUILD_VARIANT的配置与基本区别,

其中的一些编译控制是对的但是Module的Android.mk中的LOCAL_MODULE_TAGS 控制并不全适用目前的android4.2,这里记录一下我对Module的控制过程。

 

首先还是这个放在Android.mk中的变量,默认在/build/core/base_rules.mk 中:

 

1

2

3

4

LOCAL_MODULE_TAGS := $(sort $(LOCAL_MODULE_TAGS))

ifeq (,$(LOCAL_MODULE_TAGS))

  LOCAL_MODULE_TAGS := optional

endif

 

而且并不是 LOCAL_MODULE_TAGS :=optional 就会都安装进system.img !

 

LOCAL_MODULE_TAGS 在 android 4.2 能取的值有:

 

1

2

3

4

5

6

# Only the tags mentioned in this test are expected to be set by module

# makefiles. Anything else is either a typo or a source of unexpected

# behaviors.

ifneq ($(filter-out debug eng tests optional samples shell_ash shell_mksh,$(LOCAL_MODULE_TAGS)),)

$(warning unusual tags $(LOCAL_MODULE_TAGS) on $(LOCAL_MODULE) at $(LOCAL_PATH))

endif


debug eng tests optional samples shell_ash shell_mksh 这几个值,没有user ,这是跟之前的一个差别!

 

其中TARGET_BUILD_VARIANT 还是对应:

 

eng

默认类型,安装 LOCAL_MODULE_TAGS 的类型为/build/core/main.mk:

 

1

2

ifeq ($(TARGET_BUILD_VARIANT),eng)

tags_to_install := debug eng

 

安装 PRODUCT_PACKAGES 中定义的Module

 

user :

用于发行版,像之前描述的关闭log,shel,rootl,编译出odex Android——编译odex保护

LOCAL_MODULE_TAGS 的值不能为 user

安装哪些Module 只依赖与 PRODUCT_PACKAGES

 

userdebug :

用于调试,安装 LOCAL_MODULE_TAGS 的类型为/build/core/main.mk:

 

1

2

3

ifeq ($(user_variant),userdebug)

  # Pick up some extra useful tools

  tags_to_install += debug


安装 PRODUCT_PACKAGES 中定义的Module

 

symbols 目录 :

这里记录一种现象,不管 Module 是apk 还是 lib ,有的时候在单独 mmm 编译 的时候,

是可以安装到 /out 中的system对应位置的,最后能够打包进系统的system.img

 

但是 如果整体的 make -j* 编译系统,那么 对应的 apk .lib 就会生成在 /out 下的 symbols/system 对应的位置,

最后是不会打包进系统system.img 的!

 

这就是因为 Module 的LOCAL_MODULE_TAGS 和当前的编译的TARGET_BUILD_VARIANT 没有满足上面说到的规则,

Module 并不认定为需要 install 的!

可以按照上面的规则,修改Module的 LOCAL_MODULE_TAGS 或者 看下面的 在 PRODUCT_PACKAGES 中添加 Module !

 

这里只区分对Module的安装控制,可以看到在4.2 中 对Module的控制级别最高的是 PRODUCT_PACKAGES 这个变量!

 

二.PRODUCT_PACKAGES :

这个变量在很多.mk中都有赋值,比如在device中的 device.mk 中,而且都是 类似这样的:

 

1

2

3

4

5

6

7

# jscese add libusb and compat lib ,usb-modeswitch execute binary for 3G

PRODUCT_PACKAGES +=

    rild

    libusb

    libusb-compat

    usb_modeswitch

#end


都是 += 累加操作!

 

这就代表这些Module 无论如何都会被编译安装进系统。

简单记录下PRODUCT_PACKAGES 的作用过程

首先在main.mk中的

product_MODULES 以及 product_FILES

 

1

2

3

4

5

6

7

8

9

# The base list of modules to build for this product is specified

# by the appropriate product definition file, which was included

# by product_config.make.

product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)

# Filter out the overridden packages before doing expansion

product_MODULES := $(filter-out $(foreach p, $(product_MODULES),

    $(PACKAGES.$(p).OVERRIDES)), $(product_MODULES))

$(call expand-required-modules,product_MODULES,$(product_MODULES))

product_FILES := $(call module-installed-files, $(product_MODULES))

 

modules_to_install

 

1

2

3

4

5

6

7

modules_to_install := $(sort

    $(ALL_DEFAULT_INSTALLED_MODULES)

    $(product_FILES)

    $(foreach tag,$(tags_to_install),$($(tag)_MODULES))

    $(call get-tagged-modules, shell_$(TARGET_SHELL))

    $(CUSTOM_MODULES)

  )


这个就是需要安装的一个变量了,有用到上面说得到的变量 tags_to_install 还有 product_FILES

 

modules_to_install 还会经过一些过滤处理,具体可看main.mk中

 

ALL_DEFAULT_INSTALLED_MODULES

 

1

2

3

4

5

6

7

8

# build/core/Makefile contains extra stuff that we don't want to pollute this

# top-level makefile with.  It expects that ALL_DEFAULT_INSTALLED_MODULES

# contains everything that's built during the current make, but it also further

# extends ALL_DEFAULT_INSTALLED_MODULES.

ALL_DEFAULT_INSTALLED_MODULES := $(modules_to_install)

include $(BUILD_SYSTEM)/Makefile

modules_to_install := $(sort $(ALL_DEFAULT_INSTALLED_MODULES))

ALL_DEFAULT_INSTALLED_MODULES :=


再加载进Android的 Makefile 文件,其中根据 ALL_DEFAULT_INSTALLED_MODULES 进行安装!这里暂不深入。

 

make 编译的时候的依赖如下:

droid:

 

1

2

3

4

# Building a full system-- the default is to build droidcore

droid: droidcore dist_files

...

.PHONY: droid

 

droidcore :

 

1

2

3

4

5

6

7

8

9

# Build files and then package it into the rom formats

.PHONY: droidcore

droidcore: files

    systemimage

    $(INSTALLED_BOOTIMAGE_TARGET)

    $(INSTALLED_RECOVERYIMAGE_TARGET)

    $(INSTALLED_USERDATAIMAGE_TARGET)

    $(INSTALLED_CACHEIMAGE_TARGET)

    $(INSTALLED_FILES_FILE)

 

files :

 

1

2

3

4

5

6

# All the droid stuff, in directories

.PHONY: files

files: prebuilt

        $(modules_to_install)

        $(modules_to_check)

        $(INSTALLED_ANDROID_INFO_TXT_TARGET)

 

可以看到 依赖到了 上面分析到的 modules_to_install

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 系统中,内核也是以模块的形式存在的,它们被保存为 `.ko` 文件。如果你需要编译一个内核模块并将其加载到 Android 设备上,可以按照以下步骤操作: 1. 获取 Android 内核源代码,并使用交叉编译工具链编译内核模块。如果你还没有安装交叉编译工具链,请按照 Android 官方文档中的说明进行安装。 2. 在编译模块时,使用 `make` 命令指定 `ARCH` 和 `CROSS_COMPILE` 变量。例如,如果你的交叉编译工具链位于 `/opt/android-ndk-r21d/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/` 目录下,那么你可以输入以下命令来编译一个内核模块: ``` make ARCH=arm CROSS_COMPILE=/opt/android-ndk-r21d/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi- -C /path/to/kernel/source M=/path/to/module/source ``` 其中,`/path/to/kernel/source` 是你的 Android 内核源代码目录,`/path/to/module/source` 是你的内核模块源代码目录。 3. 编译成功后,在模块源代码目录下会生成一个 `.ko` 文件,例如 `hello.ko`。 4. 将 `.ko` 文件复制到 Android 设备上,例如 `/sdcard/hello.ko`。 5. 在 Android 设备上使用 `insmod` 命令来加载内核模块: ``` insmod /sdcard/hello.ko ``` 如果加载成功,你可以使用 `lsmod` 命令来查看已经加载的内核模块: ``` lsmod ``` 同时,你也可以使用 `rmmod` 命令来卸载内核模块: ``` rmmod hello ``` 以上就是将编译好的 `.o` 文件转为加载到 Android 设备上的 `.ko` 文件的步骤。需要注意的是,由于 Android 系统的版本和设备的不同,可能需要针对不同的设备和系统版本进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值