導航:首頁 > 源碼編譯 > prebuild增加編譯文件

prebuild增加編譯文件

發布時間:2025-02-24 15:26:06

android 升級webview版本,包括6.0系統

在做系統修改的過程中,android自帶的webview版本不能滿足OEM客戶的要求,此種現象在android低版本中尤為更甚;因此我們需要自己對webview的版本進行升級。在Android 4.4版本以前,google採用的是webkit內核,也沒有把webview作為一個apk獨立出來,所以我們升級webview只能再Android 5.0以後;

目前通用的方法就是在瀏覽器中輸入 liulanmi.com/labs/core.html 進行查看,我的理解,應該有其他方式,但一直未找到,還望指教。
下圖是我升級過的版本:

https://www.apkmirror.com/uploads/?q=android-system-webview
該網址需要特殊訪問,諸君自己努力吧!

目前我修改過6.0 和10系統,二者存在一定差異,但大同小異,猜測其他版本應該也差異不大

4.編譯

4.編譯

在調試6.0的時候,網上大部分博客修改的webview.apk都是修改 arm64 目錄下的,導致我一直不能編譯出正常的apk文件,最後我發現,在 prebuild 統計目錄的 Android,mk 文件中有這個配置

最後一行指定了使用的webview.apk在哪個目錄下,但是 my_src_arch 這個變數值未找到定義的地方;那就開啟盲猜模式,既然arm64目錄不行,那就只能是arm目錄;實踐證明,猜測正確。後來思考一下, 我們可以通過列印的方式,來看這個變數值到底是什麼!

❷ android 怎麼使用icu

如果只是測試修改後效果,執行步驟A即可;如果需要build後生效,則需要執行全部步驟
A. 在臨時目錄中編譯ICU資源
1. 在external/icu4c下新建臨時目錄icubuild,進入icubuild目錄
$mkdir external/icu4c/icuBuild
$cd external/icu4c/icuBuild
2. 執行icuConfigureRun linux命令,生成make文件
$.././runConfigureICU Linux
3. 執行make -j2命令,
$make -j2
對於GB版本,如果make -j2出錯,需要用mtk提供的文件(Android 2.3 make-j2 ERROE.rar)替換(需要備份原文件)。
4. 將生成的external/icu4c/icuBuild/data/out/tmp/icudt44l.dat push到手機測試
$adb remount
$adb push external/icu4c/icuBuild/data/out/tmp/icudt44l.dat system/usr/icu/
$adb reboot
ICS對應的是icudt46l.dat,
JB以及以後版本是icudt48l.dat
B. COPY所需文件
1、將第一步生成的externalicu4cicubuilddataout mpicudt44l.dat復制到externalicu4cstubdata下並改名為icudt44l-all.dat,覆蓋原來的同名文件。
2、對於GB版本,從ICS工程上拷貝路徑prebuildlinux-x86icu-4.4文件夾,放到相應的路徑下
ICS版本是icudt46l.dat和icudt46l-all.dat
JB及以上是icudt48l.dat和icudt48l-all.dat
C. 配置環境變數
重新配置環境變數(如果不配置正確會導致執行腳本出錯)。以我的系統為例,配置過程如下:
1. 在終端中進入/proj/mtk71491/Desktop/GB/alps目錄即:
$cd /proj/mtk71491/Desktop/GB/alps
2. 然後執行腳本(等價於./ build/envsetup.sh):
$source build/envsetup.sh
3. 配置環境變數(注意「=」前後不要有空格)。
$export ANDROID_EABI_TOOLCHAIN=/proj/mtk71491/Desktop/GB/alps/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/(JB2以及以上不執行此步驟)
$export LD_LIBRARY_PATH=/proj/mtk71491/Desktop/GB/alps/prebuilt/linux-x86/icu-4.4/(JB以及上以跳過這一步)
$export ANDROID_BUILD_TOP=/proj/mtk71491/Desktop/GB/alps/
執行完沒有任何提示說明配置成功。
D. 執行腳本,重新生成.dat文件
執行腳本,如果遇到文檔印尼語錯誤請用MTK提供的腳本(icu_dat_generator.rar)替換後再執行,如下所示:
1. 進入/proj/mtk71491/Desktop/GB/alps/external/icu4c/studdata目錄
$cd external/icu4c/studdata
2. 執行腳本
$./icu_dat_generator.py 4.4 (ICS及以後版本執行$./icu_dat_generator.py)
如果該腳本執行成功,則會更新一遍stubdata下的icudt44l-**.dat這些文件,如果看到這些文件的修改時間變成了最新的時間,就說明已經重新生成真正最後起 作用的是icudt44l-large.dat這個文件。
ICS版是icudt46l-default.dat
JB以及以上是icudt48l-default.dat
E. 重新編譯工程
一般修改後都是重新編譯工程來測試效果,使用remake android命令即可.
F. 如果執行./icu_dat_generator.py報以下錯誤
Traceback (most recent call last):
File ./icu_dat_generator.py, line 296, in
main()
File ./icu_dat_generator.py, line 261, in main
icu_version = re.sub(r([^0-9]), , os.path.basename(input_files[0]))
IndexError: list index out of range
可能是環境變數沒有配置好,請使用絕對路徑,而不是相對路徑。

❸ 自己可以編譯安卓源碼

用最新的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源碼的多倉庫管理機制.下面,不妨自己動手嘗試一下.

    ❹ 編譯安卓5.0源碼使用什麼系統

    1、ubuntu需要安裝openjdk 7

    2、 如果沒有openjdk 7的話,需要下載jdk7,然後修改 build/core/main.mk 177行,將requires_openjdk := true 改成false

    3 、編譯,如果出現chromium_org的問題,將 external/chromium_org/Android.mk 中 18行添加一個PRODUCT_PREBUILT_WEBVIEWCHROMIUM :=yes

    4 、然後初始化編譯環境

    5 、make systemimage

    不淡定的朋友趕緊開工吧!

    ❺ android ndk 怎樣調用第三方的so庫文件

    問題描述:Android如何調用第三方SO庫;
    已知條件:SO庫為Android版本連接庫(*.so文件),並提供了詳細的介面說明;
    已了解解決方案:
    1.將SO文件直接放到libs/armeabi下,然後代碼中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下來就可以直接調用xxx_xxx_xxx()方法;
    2.第二種方案,創建自己的SO文件,在自己的SO文件里調用第三方SO,再在程序中調用自己的SO,這種比較復雜,需要建java類文件,生成.h文件,編寫C源文件include之前生成的.h文件並實現相應方法,最後用android NDK開發包中的ndk-build腳本生成對應的.so共享庫;
    求解:
    1.上面兩種方案是否可行?不可行的話存在什麼問題?
    2.兩種方案有什麼區別?為什麼網上大部都是用的第二種方案?
    3.只有一個*.so文件,並提供了詳細的介面說明,是否可在ANDROID中使用它?

    首先要看這個SO是不是JNI規范的SO,比如有沒有返回JNI不直接支持的類型。也就是說這個SO是不是可以直接當作JNI來調用。如果答案是否定的,你只能選第二個方案。

    如果答案是肯定的,還要看你是不是希望這個SO的庫直接暴露給JAVA層,如果答案是否定的,你只能選第二個方案,比如你本身也是一個庫的提供者。

    一般如果你只有SO,就說明這個是別人提供給你的,你可以要求對方給你提供配套的JAVA調用文件。

    1、這個要看這個SO是不是符合JNI調用的規范。還要看你自己的意願。
    2、因為第二種方法最靈活,各種情況都可以實現。
    3、可以

    看能不能直接從JAVA調用的最簡單的方法就是看SO里的函數名是不是Java_XXX_XXX_XXX格式的
    是就可以,你可以自己寫一個配套的JAVA文件,注意一下SO函數名和JAVA函數名的轉換規則,或者向SO提供方索要;
    不是的話就選第二種方案吧。

    1、檢查所需文件是否齊全
    使用第三方動態庫,應該至少有2個文件,一個是動態庫(.so),另一個是包含
    動態庫API聲明的頭文件(.h)
    2、封裝原動態庫
    原動態庫文件不包含jni介面需要的信息,所以我們需要對其進行封裝,所以我
    們的需求是:將libadd.so 裡面的API封裝成帶jni介面的動態
    3、編寫庫的封裝函數libaddjni.c
    根據前面生成的com_android_libjni_LibJavaHeader.h 文件,編寫libaddjni.c,用
    來生成libaddjni.so

    Android中集成第三方軟體包(.jar, .so)

    Android中可能會用到第三方的軟體包,這包括Java包.jar和Native包.so。jar包既可通過Eclipse開發環境集成,也可通過編譯源碼集成,看你的工作環境。

    假定自己開發的程序為MyMaps,需要用到BaiMaps的庫,包括mapapi.jar和libBMapApiEngine_v1_3_1.so。

    一、Eclipse中集成第三方jar包及.so動態庫

    MyMaps工程下創建目錄libs以及libs/armeabi,把mapapi.jar放在的libs/目錄下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。

    Eclipse中把第三方jar包mapapi.jar打包到MyMaps的步驟:

    1. 右擊工程,選擇Properties;
    2. Java Build Path,選擇Libraries;
    3. Libraries頁面點擊右面按鈕「Add Library…」;
    4. 選擇「User Library」,點擊「Next」;
    5. 點擊「User Libraries」按鈕;
    6. 在彈出界面中,點擊「New…」;
    7. 輸入「User library name」,點擊「OK」確認;
    8. 返回之後,選擇剛剛創建的User library,右面點擊「AddJARs」;
    9. 選擇MyMaps/libs/下的mapapi.jar;
    10. 確認,返回。

    這樣,編譯之後,該jar包就會被打進MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。
    程序運行過程中,libBMapApiEngine_v1_3_1.so被放在/data/data/<yourAppPackage>/lib/下,載入動態庫時系統會從程序的該lib/目錄下查找.so庫。

    二、源碼中集成第三方集成jar包及.so動態庫

    Android源碼中MyMaps放在packages/apps下。MyMaps下創建目錄libs以及libs/armeabi,並把mapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。

    2.1 修改Android.mk文件

    Android.mk文件如下:

    [plain] view plain
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)

    LOCAL_MODULE_TAGS := optional

    LOCAL_STATIC_JAVA_LIBRARIES := libmapapi

    LOCAL_SRC_FILES := $(call all-subdir-java-files)

    LOCAL_PACKAGE_NAME := MyMaps

    include $(BUILD_PACKAGE)

    ##################################################
    include $(CLEAR_VARS)

    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libmapapi:libs/mapapi.jar
    LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_MULTI_PREBUILT)

    # Use the following include to make our testapk.
    include $(callall-makefiles-under,$(LOCAL_PATH))

    1 集成jar包
    LOCAL_STATIC_JAVA_LIBRARIES取jar庫的別名,可以任意取值;
    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar庫的規則,格式:別名:jar文件路徑。注意:別名一定要與LOCAL_STATIC_JAVA_LIBRARIES里所取的別名一致,且不含.jar;jar文件路徑一定要是真實的存放第三方jar包的路徑。
    編譯用BUILD_MULTI_PREBUILT。
    2 集成.so動態庫
    LOCAL_PREBUILT_LIBS指定prebuilt so的規則,格式:別名:so文件路徑。注意:別名一般不可改變,特別是第三方jar包使用.so庫的情況,且不含.so;so文件路徑一定要是真實的存放第三方so文件的路徑。
    編譯拷貝用BUILD_MULTI_PREBUILT。

    2.2 加入到GRANDFATHERED_USER_MODULES

    在文件user_tags.mk中,把libBMapApiEngine_v1_3_1加入到GRANDFATHERED_USER_MODULES中

    [plain] view plain
    GRANDFATHERED_USER_MODULES += \
    … \
    libBMapApiEngine_v1_3_1

    user_tags.mk可以是build/core下的,也可以是$(TARGET_DEVICE_DIR)下的,推薦修改$(TARGET_DEVICE_DIR)下的。

    2.3 編譯結果

    MyMaps.apk編譯生成在out/target/proct/<YourProct>/system/app/下;
    libBMapApiEngine_v1_3_1.so放在out/target/proct/<YourProct>/system/lib/下,這也是系統載入動態庫時搜索的路徑。

    ❻ 新人求教,編譯一個最簡單的Android程序,提示下面的錯誤咋解決

    1、32位系統下的編譯

    如果需要在32位系統中編譯android系統,在編譯前需要對部分makefile進行修改

    首先修改build/core/main.mk,修改的內容如下所示:

    -ifneq (64,$(findstring 64,$(build_arch)))

    +ifneq
    (i686,$(findstring i686,$(build_arch)))

    $(warning
    ************************************************************) $(warning You are attempting to build on a 32-bit system.)

    $(warning Only 64-bit build environments are supported beyond froyo/2.2.)

    其次修改如下四個文件:

    external/clearsilver/cgi/Android.mk
    external/clearsilver/java-jni/Android.mk
    external/clearsilver/util/Android.mk
    external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6
    -LOCAL_CFLAGS += -m64
    -LOCAL_LDFLAGS += -m64
    +LOCAL_CFLAGS += -m32
    +LOCAL_LDFLAGS += -m32即將LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改為-m32,從而指定使用32位系統進行編譯如果使用 64bit 的操作系統編譯,這些就都不用修改,但記得需要安裝:For 64-bit servers the following extra packages may be needed:
    "sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)
    "sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"
    還有 jdk64bit 的版本編譯2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:
    .... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止

    從編譯規則上看:
    # Make sure that this IS_HOST/CLASS/MODULE combination is unique.
    mole_id := MODULE.$(if \
    $(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
    ifdef $(mole_id)
    $(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_id)))
    endif

    在framwworks/base/opengl/tests/gl2_jni/下面定義的android.mk定義了:
    LOCAL_MODULE := libgl2jni
    include $(BUILD_SHARED_LIBRARY)
    導致生成的動態庫重復,這是不對的,修改tests這個目錄不參與編譯即可,最直接的辦法刪除掉framwworks/base/opengl/tests/gl2_jni這個文件夾

    3、AIDL 編譯報couldn't find import for class原因
    「AIDL服務只支持有限的數據類型,因此,如果用AIDL服 務傳遞一些復雜的數據就需要做更一步處理。AIDL服務支持的數據類型如下:
    Java的簡單類 型(int、char、boolean等)。不需要導入(import)。String和 CharSequence。不需要導入(import)。
    List和 Map。但要注意,List和Map對象的元素類型必須是AIDL服務支持的數據類型。不需要導入(import)。AIDL自動生成 的介面。需要導入(import)。
    實現 android.os.Parcelable介面的類。需要導入(import)。
    其中後兩種數據類 型需要使用import進行導入,傳遞不需要 import的數據類型的值的方式相同。傳遞一個需要import的數據類型的值(例如,實現android.os.Parcelable 介面的類)的步 驟略顯復雜。除了要建立一個實現android.os.Parcelable介面的類外,還需要為這個類單獨建立一個aidl文件,並使用parcelable關鍵字進行定義。」
    沒有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。

    修改android源碼根目錄下的build/core/pathmap.mk把你的目錄加進去,此時再make update-api

    4、老是提示 @Override錯誤 方法未覆蓋其父類的方法
    使 用JDK1.6編譯沒有問題,使用JDK1.5編譯,會報@Override方法未覆蓋其父類的方法。實際上這個方法是類實現的介面中方法,
    但是,這個語 法的jdk1.6的下面是可以通過的,也就是說jdk1.6認為類覆蓋父類方法與實現介面方法都叫override,而jdk1.5不
    是這樣認為的,不知 道這是當初jdk1.5的bug,還是當初就是認為覆蓋父類方法與實現介面方法是不一樣的,不得而知。但是從
    OO角度來看,覆蓋父類方法與實現介面方法都 可以認為override,因為他們目的都是一樣的,都是為了重用,都是多態的一種
    表現方式。

    更改jdk版本為1.6即可

    5、編譯alsa-lib庫錯誤

    android系統開發移植alsa-lib庫的過程中編譯的時候出現了如下的錯誤
    /tmp/cckyaR40.s: Assembler messages:
    /tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr'
    /tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128'
    /tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2
    字面的意思報的是匯編錯誤,選擇的處理器不支持mrs和msr指令。
    原來的ARM指令有32位和16位兩種指令模式,16位為thumb指令集,thumb指令集編譯出的代碼佔用空間小,
    而且效率也高,所以android的arm編譯器默認用的是thumb模式編譯,問題在於alsa的代碼中有部分的內容
    用到了32位的指令,所以才會報如下的錯誤,修改的方法也很簡單,在Android.mk中加入如下內容即可:
    LOCAL_ARM_MODE := arm
    android的編譯系統中LOCAL_ARM_MODE變數的取值為arm或者thumb,代表32位和16位兩種arm指令集,默認為thumb
    prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld: failed to set dynamic section sizes: Bad value

    collect2: ld returned 1 exit status
    make: *** [out/target/proct/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 錯誤 1
    解決此問題將alsa-lib/include/config.h文件中的如下宏定義去掉即可:
    #define VERSIONED_SYMBOLS

    開發過程中碰到過很多錯誤,後續再一一總結記錄下來,有些忘記了。。

    在android.mk中編譯:

    include $(CLEAR_VARS)
    $(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

    出現提示需要定義:LOCAL_MODULE_TAGS := optional 一般修改方法是:

    build\core\definitions.mk 中的宏定義變數:

    define include-prebuilt
    include $$(CLEAR_VARS)
    LOCAL_SRC_FILES := $(1)
    LOCAL_BUILT_MODULE_STEM := $(1)
    LOCAL_MODULE_SUFFIX := $$(suffix $(1))
    LOCAL_MODULE := $$(basename $(1))
    LOCAL_MODULE_CLASS := $(2)
    include $$(BUILD_PREBUILT)
    endef

    在這里增加一個LOCAL_MODULE_TAGS := optional

    但是這需要修改android源碼,如果不是自已的android系統,這么做就麻煩了,所以必須想其它辦法解決:

    #include $(CLEAR_VARS)
    #$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := libyfcdca.a
    LOCAL_BUILT_MODULE_STEM := libyfcdca.a
    LOCAL_MODULE_SUFFIX := lib
    LOCAL_MODULE := yfcdca
    LOCAL_MODULE_CLASS := STATIC_LIBRARIES
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_PREBUILT)

    如此即可了。供你參考
    1、32位系統下的編譯

    如果需要在32位系統中編譯android系統,在編譯前需要對部分makefile進行修改

    首先修改build/core/main.mk,修改的內容如下所示:

    -ifneq (64,$(findstring 64,$(build_arch)))

    +ifneq
    (i686,$(findstring i686,$(build_arch)))

    $(warning
    ************************************************************) $(warning You are attempting to build on a 32-bit system.)

    $(warning Only 64-bit build environments are supported beyond froyo/2.2.)

    其次修改如下四個文件:

    external/clearsilver/cgi/Android.mk
    external/clearsilver/java-jni/Android.mk
    external/clearsilver/util/Android.mk
    external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6
    -LOCAL_CFLAGS += -m64
    -LOCAL_LDFLAGS += -m64
    +LOCAL_CFLAGS += -m32
    +LOCAL_LDFLAGS += -m32即將LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改為-m32,從而指定使用32位系統進行編譯如果使用 64bit 的操作系統編譯,這些就都不用修改,但記得需要安裝:For 64-bit servers the following extra packages may be needed:
    "sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)
    "sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"
    還有 jdk64bit 的版本編譯2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:
    .... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止

    從編譯規則上看:
    # Make sure that this IS_HOST/CLASS/MODULE combination is unique.
    mole_id := MODULE.$(if \
    $(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
    ifdef $(mole_id)
    $(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_id)))
    endif

    在framwworks/base/opengl/tests/gl2_jni/下面定義的android.mk定義了:
    LOCAL_MODULE := libgl2jni
    include $(BUILD_SHARED_LIBRARY)
    導致生成的動態庫重復,這是不對的,修改tests這個目錄不參與編譯即可,最直接的辦法刪除掉framwworks/base/opengl/tests/gl2_jni這個文件夾

    3、AIDL 編譯報couldn't find import for class原因
    「AIDL服務只支持有限的數據類型,因此,如果用AIDL服 務傳遞一些復雜的數據就需要做更一步處理。AIDL服務支持的數據類型如下:
    Java的簡單類 型(int、char、boolean等)。不需要導入(import)。String和 CharSequence。不需要導入(import)。
    List和 Map。但要注意,List和Map對象的元素類型必須是AIDL服務支持的數據類型。不需要導入(import)。AIDL自動生成 的介面。需要導入(import)。
    實現 android.os.Parcelable介面的類。需要導入(import)。
    其中後兩種數據類 型需要使用import進行導入,傳遞不需要 import的數據類型的值的方式相同。傳遞一個需要import的數據類型的值(例如,實現android.os.Parcelable 介面的類)的步 驟略顯復雜。除了要建立一個實現android.os.Parcelable介面的類外,還需要為這個類單獨建立一個aidl文件,並使用parcelable關鍵字進行定義。」
    沒有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。

    修改android源碼根目錄下的build/core/pathmap.mk把你的目錄加進去,此時再make update-api

    4、老是提示 @Override錯誤 方法未覆蓋其父類的方法
    使 用JDK1.6編譯沒有問題,使用JDK1.5編譯,會報@Override方法未覆蓋其父類的方法。實際上這個方法是類實現的介面中方法,
    但是,這個語 法的jdk1.6的下面是可以通過的,也就是說jdk1.6認為類覆蓋父類方法與實現介面方法都叫override,而jdk1.5不
    是這樣認為的,不知 道這是當初jdk1.5的bug,還是當初就是認為覆蓋父類方法與實現介面方法是不一樣的,不得而知。但是從
    OO角度來看,覆蓋父類方法與實現介面方法都 可以認為override,因為他們目的都是一樣的,都是為了重用,都是多態的一種
    表現方式。

    更改jdk版本為1.6即可

    5、編譯alsa-lib庫錯誤

    android系統開發移植alsa-lib庫的過程中編譯的時候出現了如下的錯誤
    /tmp/cckyaR40.s: Assembler messages:
    /tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr'
    /tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128'
    /tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2
    字面的意思報的是匯編錯誤,選擇的處理器不支持mrs和msr指令。
    原來的ARM指令有32位和16位兩種指令模式,16位為thumb指令集,thumb指令集編譯出的代碼佔用空間小,
    而且效率也高,所以android的arm編譯器默認用的是thumb模式編譯,問題在於alsa的代碼中有部分的內容
    用到了32位的指令,所以才會報如下的錯誤,修改的方法也很簡單,在Android.mk中加入如下內容即可:
    LOCAL_ARM_MODE := arm
    android的編譯系統中LOCAL_ARM_MODE變數的取值為arm或者thumb,代表32位和16位兩種arm指令集,默認為thumb
    prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld: failed to set dynamic section sizes: Bad value

    collect2: ld returned 1 exit status
    make: *** [out/target/proct/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 錯誤 1
    解決此問題將alsa-lib/include/config.h文件中的如下宏定義去掉即可:
    #define VERSIONED_SYMBOLS

    開發過程中碰到過很多錯誤,後續再一一總結記錄下來,有些忘記了。。

    在android.mk中編譯:

    include $(CLEAR_VARS)
    $(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

    出現提示需要定義:LOCAL_MODULE_TAGS := optional 一般修改方法是:

    build\core\definitions.mk 中的宏定義變數:

    define include-prebuilt
    include $$(CLEAR_VARS)
    LOCAL_SRC_FILES := $(1)
    LOCAL_BUILT_MODULE_STEM := $(1)
    LOCAL_MODULE_SUFFIX := $$(suffix $(1))
    LOCAL_MODULE := $$(basename $(1))
    LOCAL_MODULE_CLASS := $(2)
    include $$(BUILD_PREBUILT)
    endef

    在這里增加一個LOCAL_MODULE_TAGS := optional

    但是這需要修改android源碼,如果不是自已的android系統,這么做就麻煩了,所以必須想其它辦法解決:

    #include $(CLEAR_VARS)
    #$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := libyfcdca.a
    LOCAL_BUILT_MODULE_STEM := libyfcdca.a
    LOCAL_MODULE_SUFFIX := lib
    LOCAL_MODULE := yfcdca
    LOCAL_MODULE_CLASS := STATIC_LIBRARIES
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_PREBUILT)

    如此即可了。

    閱讀全文

    與prebuild增加編譯文件相關的資料

    熱點內容
    java基礎面試編程題 瀏覽:460
    linux數學計算 瀏覽:773
    android手機電腦同步 瀏覽:287
    簡明python教程書在線觀看 瀏覽:742
    理想論壇多空出擊指標源碼 瀏覽:685
    擴散更新演算法 瀏覽:557
    當代大學德語pdf 瀏覽:506
    打程序員代碼被暴打 瀏覽:390
    怎麼看手機支持mrp和app 瀏覽:466
    python爬取百度貼吧信息 瀏覽:635
    手機怎麼連好輕app 瀏覽:399
    真實賽車3安卓如何登錄 瀏覽:733
    解壓壓縮包要誰的密碼 瀏覽:746
    微信看漲跌源碼 瀏覽:70
    android全局service 瀏覽:291
    飛豬app關注怎麼取消 瀏覽:437
    snmp4j源碼 瀏覽:247
    如何利用肉雞搭建ftp伺服器 瀏覽:454
    用戶名已加密怎麼辦 瀏覽:140
    js怎麼樣上傳到文件到伺服器地址 瀏覽:581