Android.bp 編譯java庫和C庫實例

利用Android.bp來編譯so庫

在SimpleHook模塊中,我們使用了以下構(gòu)建腳本來建議Android.bp

cc_library {
 
    name:"libsecAI",
    host_supported: true,
    
    shared_libs:[
        "libnativehelper",
        "libart",
        "liblog",
    ],
    
    local_include_dirs:[
        "include",
    ],
    
    arch:{
        arm: {
            srcs: [
                "AIHook.cpp",
                "HookPage.cpp",
            ],
        },
        arm64:{
            srcs: [
                    "AIHook.cpp",
                    "HookPage.cpp",
                ],
        },  
    },
    
    cppflags:[
        "-DART_STACK_OVERFLOW_GAP_arm=8912",
        "-DART_STACK_OVERFLOW_GAP_arm64=8912",
        "-DART_STACK_OVERFLOW_GAP_mips=16384",
        "-DART_STACK_OVERFLOW_GAP_mips64=16384",
        "-DART_STACK_OVERFLOW_GAP_x86=16384",
        "-DART_STACK_OVERFLOW_GAP_x86_64=20480",
        "-DIMT_SIZE=43",
    ],
    cpp_std:"c++17",

}

可以看出,Android.bp文件的語法與json文件的形式很類似。這里cc_library是用來生成native庫的(so包),常用的屬性:

  • name: 指定了生成的lib包的名字
  • host_supported:當(dāng)該模塊依賴的某個模塊中存在該屬性,則依賴它的模塊都需要配置該屬性
  • local_include_dirs:項目內(nèi)的頭文件目錄依賴,這里是相對路徑
  • cppflag:編譯的flag選項,示例中定義了一些工程依賴的宏的定義
  • cpp_std: 指定了編譯器依賴的語言編譯標(biāo)準(zhǔn)
  • arch: 用來指定需要的目標(biāo)編譯平臺,諸如arm, arm64,x86等,在srcs中指定需要依賴的源碼文件(以相對文件的形式給出)
  • srcs:常見的還可以直接在最外層用srcs屬性配置工程源碼文件
  • include_dirs: 指定依賴的頭文件,這里的頭文件可以為模塊外的頭文件,以相對整個Android工程路徑給出。
  • export_include_dirs: 是否將頭文件導(dǎo)出;這使得依賴該模塊的模塊無需再引用依賴模塊的頭文件目錄。

利用Android.bp來編譯Java庫

來看下framework模塊的bp文件

java_library {
    name: "framework",

    srcs: [
        // From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS
        "core/java/**/*.java",
        "graphics/java/**/*.java",
        "location/java/**/*.java",
        "lowpan/java/**/*.java",
      .....

        ":framework-javastream-protos",

        "core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl",
        "core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl",
       
        "media/java/android/media/session/ISessionControllerCallback.aidl",
       ......

        ":framework-statslog-gen",
    ],

    aidl: {
        export_include_dirs: [
            // From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS
            "core/java",
            "graphics/java",
            "location/java",
            "lowpan/java",
            "media/java",
            "media/mca/effect/java",
            "media/mca/filterfw/java",
            "media/mca/filterpacks/java",
            "drm/java",
            "opengl/java",
            "sax/java",
            "telecomm/java",
            "telephony/java",
            "wifi/java",
            "keystore/java",
            "rs/java",
        ],

        include_dirs: [
            "system/update_engine/binder_bindings",     
            "system/bt/binder",
            "system/security/keystore/binder",
        ],
    },

    exclude_srcs: [
        // See comment on framework-atb-backward-compatibility module below
        "core/java/android/content/pm/AndroidTestBaseUpdater.java",
        // See comment on framework-oahl-backward-compatibility module below
        "core/java/android/content/pm/OrgApacheHttpLegacyUpdater.java",
    ],

    no_framework_libs: true,
    libs: [
        "conscrypt",
        "okhttp",
        "bouncycastle",
        "ext",
    ],

    static_libs: [
        "framework-protos",
        "android.hidl.base-V1.0-java",
        "android.hardware.cas-V1.0-java",     
    ],

    // Loaded with System.loadLibrary by android.view.textclassifier
    required: [
        "libtextclassifier",
        "libmedia2_jni",
    ],

    javac_shard_size: 150,

    dxflags: [
        "--core-library",
        "--multi-dex",
    ],
}

首先java_library說明了編譯的是java庫,另外還可能有java_library_staticfile_group等屬性,這里面有好多屬性,我們重點關(guān)注幾個選項。

  • name:指定了模塊名
  • static_libs:指定了依賴的靜態(tài)庫(將被打入到j(luò)ar中)
  • libs: 共享庫
  • srcs:指定模塊中含有的java代碼,這里也可以指定aidl文件。這里通過 "core/java/**/*.java",這種寫法來覆蓋某個路徑下的所有java文件
  • aidl: 一般我們會在這里面指定aidl文件相對路徑
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容