日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

代码Overlay机制

發布時間:2025/4/16 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 代码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
  • LOCAL_PATH?:=?$(call?my-dir)??
  • ??
  • include?$(CLEAR_VARS)??
  • ??
  • LOCAL_MODULE?:=?services.core??
  • ??
  • LOCAL_SRC_FILES?+=?\??
  • ????$(call?all-java-files-under,java)?\??
  • ????java/com/android/server/EventLogTags.logtags?\??
  • ????java/com/android/server/am/EventLogTags.logtags??
  • ??
  • LOCAL_JAVA_LIBRARIES?:=?telephony-common??
  • LOCAL_STATIC_JAVA_LIBRARIES?:=?tzdata_update??
  • ??
  • include?$(BUILD_STATIC_JAVA_LIBRARY)??

  • 我們先在修改這個文件:

    LOCAL_SRC_FILES這個變量代碼參與編譯的文件,因此我們第一步就是將我們的文件放入這個變量中:

    [html]?view plain?copy
  • services_ext_subdirs?:=?$(addprefix?../../../../overlay/,?$(LOCAL_PATH)/)??
  • ??
  • services_ext_files?:=?$(call?all-java-files-under,$(services_ext_subdirs))??
  • ??
  • 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
  • empty?:=??
  • ??
  • services_ext_overlay_files?:=?$(subst?$(services_ext_subdirs),$(empty),$(services_ext_files))??
  • ??
  • 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
  • interface?IPowerManager??
  • {??
  • .............??
  • ??
  • ????//set?cpu?boost??
  • ????void?boostForPerformance(int?cpu_nr,?int?duration);??
  • ????void?printPower();//新增printPower接口??
  • }??
  • 下面是PowerManager.java中的修改:

    [java]?view plain?copy
  • .......??
  • ????public?void?printPower()?{??
  • ????????try?{??
  • ????????????mService.printPower();??
  • ????????}?catch?(RemoteException?e)?{??
  • ????????}??
  • ????}??
  • ......??
  • 當然這兩個文件時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
  • include?$(CLEAR_VARS)??
  • ??
  • #?FRAMEWORKS_BASE_SUBDIRS?comes?from?build/core/pathmap.mk??
  • LOCAL_SRC_FILES?:=?$(call?find-other-java-files,$(FRAMEWORKS_BASE_SUBDIRS))//base?編譯java文件目錄??
  • ??
  • #overlay??
  • ifeq?($(LEADCORE_OVERLAY),true)//自己定義一個宏開關??
  • base_file_overlay_prefix?:=?$(addprefix?../../overlay/,?$(LOCAL_PATH)/)??
  • base_file_overlay_subdir?:=?$(addprefix?$(base_file_overlay_prefix),?$(FRAMEWORKS_BASE_SUBDIRS))//overlay下java文件??
  • $(warning?$(base_file_overlay_subdir))??
  • overlay_java_file?=?$(call?find-other-java-files,$(base_file_overlay_subdir))??
  • LOCAL_SRC_FILES?+=?$(overlay_java_file)//把overlay下面base對應目錄的java文件加入編譯??
  • ??
  • empty?:=??
  • base_overlay_files?:=?$(subst?$(base_file_overlay_prefix),$(empty),$(overlay_java_file))??
  • $(warning?$(base_overlay_files))??
  • ??
  • LOCAL_SRC_FILES?:=?$(filter-out?$(base_overlay_files),?$(LOCAL_SRC_FILES))??
  • endif??
  • 下面再來看看aidl文件的overlay:

    [html]?view plain?copy
  • LOCAL_SRC_FILES?+=?\??
  • ????core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl?\??
  • ????core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl?\??
  • ????core/java/android/accounts/IAccountManager.aidl?\??
  • ????core/java/android/accounts/IAccountManagerResponse.aidl?\??
  • ????core/java/android/accounts/IAccountAuthenticator.aidl?\??
  • ????core/java/android/accounts/IAccountAuthenticatorResponse.aidl?\??
  • ????core/java/android/app/IActivityContainer.aidl?\??
  • ????core/java/android/app/IActivityContainerCallback.aidl?\??
  • ????core/java/android/app/IActivityController.aidl?\??
  • ????..........??
  • ??
  • #aidl?files?overlay???
  • ifeq?($(LEADCORE_OVERLAY),true)?//宏開關??
  • //定義了一個變量用來去除原生的aidl文件的??
  • LOCAL_SRC_FILES?:=?$(filter-out?$(FRAMEWORKS_BASE_OVERLAY_AIDL_FILES),?$(LOCAL_SRC_FILES))??
  • //加入overlay下對應原生去除的aidl文件??
  • LOCAL_SRC_FILES?+=?$(base_file_overlay_prefix)$(FRAMEWORKS_BASE_OVERLAY_AIDL_FILES)??
  • //打印調試??
  • $(warning?$(base_file_overlay_prefix)$(FRAMEWORKS_BASE_OVERLAY_AIDL_FILES))??
  • endif??
  • 前PowerManager.java可以做到自動化,為什么aidl做不到呢?因為在base的Android.mk中aidl都是一個一個選出來的,就連同一目錄有的參與編譯,有的不參與編譯,為了簡單起見做了一個變量FRAMEWORKS_BASE_OVERLAY_AIDL_FILES來保存去除原生aidl文件。


    3.2 系統變量定義


    下面我們看下這個變量的定義:其實在build/core/pathmap.mk

    [html]?view plain?copy
  • FRAMEWORKS_BASE_OVERLAY_AIDL_FILES?:=?\??
  • ????????core/java/android/os/IPowerManager.aidl??
  • 順便看下宏開關的定義在build/core/envsetup.mk

    [html]?view plain?copy
  • LEADCORE_OVERLAY?:=?true??
  • 最后就是PowerManagerService.java的編譯,前面分析過了,這邊再簡單介紹下:

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

    [java]?view plain?copy
  • private?final?class?BinderService?extends?IPowerManager.Stub?{?????????
  • .........??
  • ???@Override?//?Binder?call??
  • ???????public?void?printPower()?{??
  • ????Slog.e(TAG,?"printPower");??
  • ???????}??
  • ........??

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


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

    [html]?view plain?copy
  • LOCAL_PATH?:=?$(call?my-dir)??
  • ??
  • include?$(CLEAR_VARS)??
  • ??
  • LOCAL_MODULE?:=?services.core??
  • ??
  • LOCAL_SRC_FILES?+=?\??
  • ????$(call?all-java-files-under,java)?\??
  • ????java/com/android/server/EventLogTags.logtags?\??
  • ????java/com/android/server/am/EventLogTags.logtags??
  • ??
  • $(warning?$(LOCAL_PATH))??
  • ??
  • #overlay??
  • ifeq?($(LEADCORE_OVERLAY),true)??
  • services_ext_subdirs?:=?$(addprefix?../../../../overlay/,?$(LOCAL_PATH)/)??
  • $(warning?$(services_ext_subdirs))??
  • ??
  • services_ext_files?:=?$(call?all-java-files-under,$(services_ext_subdirs))??
  • LOCAL_SRC_FILES?+=?$(services_ext_files)??
  • $(warning?$(services_ext_files))??
  • ??
  • empty?:=??
  • services_ext_overlay_files?:=?$(subst?$(services_ext_subdirs),$(empty),$(services_ext_files))??
  • $(warning?$(services_ext_overlay_files))??
  • ??
  • LOCAL_SRC_FILES?:=?$(filter-out?$(services_ext_overlay_files),?$(LOCAL_SRC_FILES))??
  • endif??
  • ??
  • LOCAL_JAVA_LIBRARIES?:=?telephony-common??
  • LOCAL_STATIC_JAVA_LIBRARIES?:=?tzdata_update??
  • ??
  • include?$(BUILD_STATIC_JAVA_LIBRARY)??
  • 這樣整個修改power就完成了。

    總結

    以上是生活随笔為你收集整理的代码Overlay机制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 美女视频国产 | 国产一区二区三区视频在线观看 | 欧美亚洲在线观看 | 国产高潮久久 | 在线播放你懂得 | 三年中国片在线高清观看 | 久久无码专区国产精品s | 欧美高清一区二区 | 偷拍视频久久 | 69亚洲乱人伦 | 国产中出视频 | 日韩av电影在线播放 | 久草视频在 | 国产人成免费视频 | 国产一区二区免费看 | 亚洲午夜一区二区 | 99精品网 | 午夜影院在线观看视频 | 99久久久无码国产精品性 | 欧美成人性生活视频 | 伊人爱爱网 | 亚洲免费专区 | 色综合色综合网色综合 | 四虎8848精品成人免费网站 | 日日操日日干 | 婷婷色一区二区三区 | 欧美女同视频 | 亚洲精品美女 | 日韩在线观看免费av | 好吊妞视频在线观看 | 超碰成人av | 成人在线直播 | 99久久精品无免国产免费 | 高清亚洲 | 91麻豆免费视频 | 丁香六月啪啪 | 欧美午夜精品久久久久久浪潮 | 天天插天天插 | 久热这里只有精品6 | av伦理在线 | 东北少妇bbbb搡bbb搡 | 看黄色的网址 | 免费观看污网站 | www.综合色| 精品欧美一区二区久久久久 | 精品免费视频一区二区 | 亚洲成人少妇 | 少妇熟女视频一区二区三区 | 黄色一级大片免费看 | 九九人人 | 热热色国产 | 欧美性生活网 | 成人片黄网站久久久免费 | 韩国91视频| 久久精品影视 | 国产一区二区在 | 毛片高清免费 | 亚洲色图影院 | 国产一区二区中文字幕 | 美色视频 | xxxx少妇| 牛人盗摄一区二区三区视频 | 成人福利网站在线观看 | 丰满少妇在线观看bd | 国产成人精品a视频 | 日韩欧美一区二区三区视频 | 国产精品一区二区精品 | 日韩大片免费 | 国精品人妻无码一区二区三区喝尿 | 久久婷婷五月综合色国产香蕉 | 久久er99热精品一区二区介绍 | 操她视频在线观看 | 欧美色悠悠| 天堂www中文在线资源 | 特级淫片裸体免费看冫 | 成人亚洲在线 | 国产女18毛片多18精品 | 国产三级在线看 | 亚洲中字| 明星双性精跪趴灌满h | 一级黄色片看看 | 一个色av| 日韩在线观看一区二区 | www.亚洲一区二区 | 成人午夜淫片100集 伊人久久国产 | 三级中文字幕在线 | 姝姝窝人体www聚色窝 | 欧美黑人精品 | 久久午夜伦理 | 玖玖zyz| 三级在线视频 | 一级片一级片 | 日本不卡一区二区三区 | 久久婷婷五月综合色吧 | 久久中文字幕无码 | 免费观看视频一区二区 | 少妇2做爰交换朴银狐 | 先锋资源一区二区 | 福利视频免费看 |