代码Overlay机制

 

代码Overlay机制

  1758人阅读  评论(0)  收藏  举报
  分类:

目录(?)[+]



代码Overlay机制

 代码overlay机制意思是,将我们在Android原生代码上修改过的文件,单独放在一个目录下,而在编译代码的时候就会去检测这个目录下的文件,如果这个目录下的文件与原生有相同的文件,那么就将这个文件放入编译的源文件中,而将原生相同文件名的文件从编译的源文件中去除。

 这样做有什么好处呢,比如我们和客户合作,在我们自己的代码上加了某一个功能,于是动了原生的代码,而我们的客户有时候不需要这个功能,那么我们必须在原生上面去除这个代码,比如用git revert等。

 但是如果我们有这样一个代码overlay的机制,我们只要将我们修改的代码文件去除就可以,这样系统就会把原生的文件放入编译的源文件中加入编译。

1.建立overlay的文件

比如我们需要对原生的PowerManagerService进行修改,首先我们先在服务器代码根目录建立一个比如:overlay这样一个目录,原生PowerManagerService的目录: frameworks/base/services/core/java/com/android/server/power/PowerManagerService,

那么如果我们对这个文件修改,先拷贝一份PowerManagerService代码放在目录:overlay/frameworks/base/services/core/java/com/android/server/power/PowerManagerService,

然后再去对这个目录下的PowerManagerService进行修改。

2.修改Android.mk文件

 修改好了代码之后,就是修改编译的Android.mk文件,修改这文件分为两步,第一步是将我们修改代码加入编译,第二步是将原生相同文件从编译中去除。

2.1将修改的代码加入编译

 我们还是举例上面的PowerManagerService,其对应的Android.mk在目录:

frameworks/base/services/core

我们先来看下原生的Android.mk文件:





[html]  view plain  copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE :services.core  
  6.   
  7. LOCAL_SRC_FILES += \  
  8.     $(call all-java-files-under,java) \  
  9.     java/com/android/server/EventLogTags.logtags \  
  10.     java/com/android/server/am/EventLogTags.logtags  
  11.   
  12. LOCAL_JAVA_LIBRARIES :telephony-common  
  13. LOCAL_STATIC_JAVA_LIBRARIES :tzdata_update  
  14.   
  15. include $(BUILD_STATIC_JAVA_LIBRARY)  

我们先在修改这个文件:

LOCAL_SRC_FILES这个变量代码参与编译的文件,因此我们第一步就是将我们的文件放入这个变量中:

[html]  view plain  copy
  1. services_ext_subdirs := $(addprefix ../../../../overlay/, $(LOCAL_PATH)/)  
  2.   
  3. services_ext_files := $(call all-java-files-under,$(services_ext_subdirs))  
  4.   
  5. LOCAL_SRC_FILES += $(services_ext_files)  


上面代码中LOCAL_PATH代表当前目录:frameworks/base/services/core

因此要找到我们的overlay代码目录,先要跳出frameworks这层,因此在LOCAL_PATH前面加了../../../../overlay/这个前缀就到了overlay/frameworks/base/services/core目录了,我们再查找这个目录下的java文件,加入到LOCAL_SRC_FILES这个变量中就把我们修改的文件加入到编译中了。

 

2.2将原生相同文件从编译中去除

下面我们需要将原生相同文件从编译中去除,也就是把文件从LOCAL_SRC_FILES这个变量中移除。

我们来看下代码实现:

[html]  view plain  copy
  1. empty :=  
  2.   
  3. services_ext_overlay_files := $(subst $(services_ext_subdirs),$(empty),$(services_ext_files))  
  4.   
  5. LOCAL_SRC_FILES := $(filter-out $(services_ext_overlay_files), $(LOCAL_SRC_FILES))  


先把前面上一节中找到的java文件中前缀overlay/frameworks/base/services/core的直接把这个前缀替换掉了,可以理解是直接删除了这个前缀。

比如PowerManagerService现在变成:

java/com/android/server/power/PowerManagerService

最后一行利用filter-out将上面这个文件从LOCAL_SRC_FILES中去除,也就是将原生的文件从编译中去除。

 

这样就达到了代码overlay的目的。


3.例子(修改PowerManager、IPowerManager.aidl、PowerManagerService)


当然这里只是修改了PowerManagerService,下面我们通过PowerManager、IPowerManager.aidl整个修改来说下这个代码overlay机制。



首先我们先修改IPowerManager.aidl:新增一个printPower接口

[java]  view plain  copy
  1. interface IPowerManager  
  2. {  
  3. .............  
  4.   
  5.     //set cpu boost  
  6.     void boostForPerformance(int cpu_nr, int duration);  
  7.     void printPower();//新增printPower接口  
  8. }  

下面是PowerManager.java中的修改:

[java]  view plain  copy
  1. .......  
  2.     public void printPower() {  
  3.         try {  
  4.             mService.printPower();  
  5.         } catch (RemoteException e) {  
  6.         }  
  7.     }  
  8. ......  

当然这两个文件时overlay,我们需要重新放在overlay/frameworks/base/services/core/java/android/os/IPowerManager.aidl;

overlay/frameworks/base/services/core/java/android/os/PowerManager.java


3.1 修改frameworks/base/Android.mk


下一步我们就看frameworks/base/Android.mk里面的修改:

[java]  view plain  copy
  1. include $(CLEAR_VARS)  
  2.   
  3. # FRAMEWORKS_BASE_SUBDIRS comes from build/core/pathmap.mk  
  4. LOCAL_SRC_FILES := $(call find-other-java-files,$(FRAMEWORKS_BASE_SUBDIRS))//base 编译java文件目录  
  5.   
  6. #overlay  
  7. ifeq ($(LEADCORE_OVERLAY),true)//自己定义一个宏开关  
  8. base_file_overlay_prefix := $(addprefix ../../overlay/, $(LOCAL_PATH)/)  
  9. base_file_overlay_subdir := $(addprefix $(base_file_overlay_prefix), $(FRAMEWORKS_BASE_SUBDIRS))//overlay下java文件  
  10. $(warning $(base_file_overlay_subdir))  
  11. overlay_java_file = $(call find-other-java-files,$(base_file_overlay_subdir))  
  12. LOCAL_SRC_FILES += $(overlay_java_file)//把overlay下面base对应目录的java文件加入编译  
  13.   
  14. empty :=  
  15. base_overlay_files := $(subst $(base_file_overlay_prefix),$(empty),$(overlay_java_file))  
  16. $(warning $(base_overlay_files))  
  17.   
  18. LOCAL_SRC_FILES := $(filter-out $(base_overlay_files), $(LOCAL_SRC_FILES))  
  19. endif  

下面再来看看aidl文件的overlay:

[html]  view plain  copy
  1. LOCAL_SRC_FILES += \  
  2.     core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl \  
  3.     core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl \  
  4.     core/java/android/accounts/IAccountManager.aidl \  
  5.     core/java/android/accounts/IAccountManagerResponse.aidl \  
  6.     core/java/android/accounts/IAccountAuthenticator.aidl \  
  7.     core/java/android/accounts/IAccountAuthenticatorResponse.aidl \  
  8.     core/java/android/app/IActivityContainer.aidl \  
  9.     core/java/android/app/IActivityContainerCallback.aidl \  
  10.     core/java/android/app/IActivityController.aidl \  
  11.     ..........  
  12.   
  13. #aidl files overlay   
  14. ifeq ($(LEADCORE_OVERLAY),true) //宏开关  
  15. //定义了一个变量用来去除原生的aidl文件的  
  16. LOCAL_SRC_FILES := $(filter-out $(FRAMEWORKS_BASE_OVERLAY_AIDL_FILES), $(LOCAL_SRC_FILES))  
  17. //加入overlay下对应原生去除的aidl文件  
  18. LOCAL_SRC_FILES += $(base_file_overlay_prefix)$(FRAMEWORKS_BASE_OVERLAY_AIDL_FILES)  
  19. //打印调试  
  20. $(warning $(base_file_overlay_prefix)$(FRAMEWORKS_BASE_OVERLAY_AIDL_FILES))  
  21. endif  

前PowerManager.java可以做到自动化,为什么aidl做不到呢?因为在base的Android.mk中aidl都是一个一个选出来的,就连同一目录有的参与编译,有的不参与编译,为了简单起见做了一个变量FRAMEWORKS_BASE_OVERLAY_AIDL_FILES来保存去除原生aidl文件。


3.2 系统变量定义


下面我们看下这个变量的定义:其实在build/core/pathmap.mk

[html]  view plain  copy
  1. FRAMEWORKS_BASE_OVERLAY_AIDL_FILES := \  
  2.         core/java/android/os/IPowerManager.aidl  

顺便看下宏开关的定义在build/core/envsetup.mk

[html]  view plain  copy
  1. LEADCORE_OVERLAY :true  

最后就是PowerManagerService.java的编译,前面分析过了,这边再简单介绍下:

先在PowerManagerService.java中修改PowerManagerService里的BinderService增加一个接口如下:

[java]  view plain  copy
  1. private final class BinderService extends IPowerManager.Stub {         
  2. .........  
  3.    @Override // Binder call  
  4.        public void printPower() {  
  5.     Slog.e(TAG, "printPower");  
  6.        }  
  7. ........  


3.3修改frameworks/base/services/core/Android.mk


下面就是修改frameworks/base/services/core/Android.mk文件

[html]  view plain  copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE :services.core  
  6.   
  7. LOCAL_SRC_FILES += \  
  8.     $(call all-java-files-under,java) \  
  9.     java/com/android/server/EventLogTags.logtags \  
  10.     java/com/android/server/am/EventLogTags.logtags  
  11.   
  12. $(warning $(LOCAL_PATH))  
  13.   
  14. #overlay  
  15. ifeq ($(LEADCORE_OVERLAY),true)  
  16. services_ext_subdirs := $(addprefix ../../../../overlay/, $(LOCAL_PATH)/)  
  17. $(warning $(services_ext_subdirs))  
  18.   
  19. services_ext_files := $(call all-java-files-under,$(services_ext_subdirs))  
  20. LOCAL_SRC_FILES += $(services_ext_files)  
  21. $(warning $(services_ext_files))  
  22.   
  23. empty :=  
  24. services_ext_overlay_files := $(subst $(services_ext_subdirs),$(empty),$(services_ext_files))  
  25. $(warning $(services_ext_overlay_files))  
  26.   
  27. LOCAL_SRC_FILES := $(filter-out $(services_ext_overlay_files), $(LOCAL_SRC_FILES))  
  28. endif  
  29.   
  30. LOCAL_JAVA_LIBRARIES :telephony-common  
  31. LOCAL_STATIC_JAVA_LIBRARIES :tzdata_update  
  32.   
  33. include $(BUILD_STATIC_JAVA_LIBRARY)  
这样整个修改power就完成了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android overlay是一种在Android应用程序中实现界面定制化的技术。通过使用overlay,开发者可以在不修改原始应用程序代码的情况下,添加、修改或替换应用程序的布局、样式和资源。在Android中,overlay通常是通过创建一个新的AndroidManifest.xml文件来实现的。\[1\] 在创建AndroidManifest.xml文件时,需要指定overlay的优先级、是否静态以及目标包名。优先级决定了overlay的显示顺序,静态表示overlay在运行时不会被修改,目标包名指定了要进行定制化的应用程序。\[1\] 除了创建AndroidManifest.xml文件,还可以参考一些相关的资料来了解更多关于Android overlay的信息。例如,可以参考http://mmmyddd.github.io/wiki/android/overlay.html和https://developer.sonymobile.com/2014/04/22/sony-contributes-runtime-resource-overlay-framework-to-android-code-example/。\[2\] 在编译后生成的apk中,overlay的路径可以根据不同的方案进行调整。一种常见的路径是vendor/overlay/TestOverlay/TestOverlay.apk,可以通过设置LOCAL_MODULE_PATH来指定路径。\[3\] #### 引用[.reference_title] - *1* *3* [Android Overlay机制](https://blog.csdn.net/weixin_44021334/article/details/130421043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android overlay简单总结](https://blog.csdn.net/Dylan_Sen/article/details/78878641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值