Android系統集成第三方pre-build庫和程序


   對於Android系統集成有源碼的第三方庫和程序,只需要提供Android.mk文件,把源碼集成到 Android編譯系統中就可以了,並且有很多例子可以參考。但是對於沒有源碼的pre-build第三方庫和程序,網上介紹的比較少,可以參考的例子也不多。本文簡單介紹一下集成pre-build庫和程序時候,怎樣編寫Android.mk。

1、集成靜態庫

[xhtml:nogutter]  view plain copy print ?
  1. 1: LOCAL_PATH := $(call my-dir)  
  2. 2: include $(CLEAR_VARS)  
  3. 3:    
  4. 4: LOCAL_PREBUILT_LIBS :libA.a    /  
  5. 5:                        libB.a  
  6. 6:                           
  7. 7: LOCAL_STATIC_LIBRARIES :libA    /  
  8. 8:                         libB  
  9. 9:    
  10. 0: include $(BUILD_MULTI_PREBUILT)  

 

2、集成動態庫

[c-sharp:nogutter]  view plain copy print ?
  1. 1: LOCAL_PATH := $(call my-dir)  
  2. 2: include $(CLEAR_VARS)  
  3. 3:    
  4. 4: LOCAL_PREBUILT_LIBS := libA.so  
  5. 5:                         libB.so  
  6. 6: include $(BUILD_MULTI_PREBUILT)  

 

3、集成可執行程序

 

[xhtml:nogutter] view plaincopyprint?
  1. 1: LOCAL_PATH := $(call my-dir)  
  2. 2: include $(CLEAR_VARS)  
  3. 3:    
  4. 4: LOCAL_SRC_FILES :hellovprc.elf   
  5. 5: LOCAL_MODULE :hellovprc.elf  
  6. 6: LOCAL_MODULE_CLASS :EXECUTABLES  
  7. 7: LOCAL_MODULE_TAGS :debug  
  8. 8: include $(BUILD_PREBUILT)  

 

 

 

4、集成pre-build Android應用程序(APK)

如何集成沒有源碼的apk文件,純粹的apk呢?

方法一、目錄結構vendor/BM/APPs/MobileQQ2011/MobileQQ2011.apk

            vendor/BM/APPs/MobileQQ2011/Android.mk

以下是Android.mk:

 

 

[xhtml:nogutter] view plaincopyprint?
  1.   LOCAL_PATH := $(call my-dir)  
  2.   include $(CLEAR_VARS)  
  3.      
  4.   # Module name should match apk name to be installed.  
  5.   LOCAL_MODULE :MobileQQ2011  
  6.   LOCAL_SRC_FILES := $(LOCAL_MODULE).apk  
  7.   LOCAL_MODULE_CLASS :APPS  
  8.   LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)  
  9.     
  10. #  LOCAL_MODULE_TAGS :user  
  11. #add by yue @20110516  
  12.   #you can choose apk's diff location   
  13.  # LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)  
  14.    LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)  
  15.   LOCAL_CERTIFICATE :platform  
  16. #end  
  17.  include $(BUILD_PREBUILT)  

 

 

加進去后,在根目錄下執行:make即可,

可以在installed-files.txt中查看是否加入到了對應的img文件中。

 弊端是如果加入很多apk,要逐個建立這樣的目錄結構,也因為有android.mk,會產生相應的臨時文件

方法二、純粹拷貝apk文件

目錄結構vendor/BM/APPs/MobileQQ2011.apk

            vendor/BM/APPs/Renren_Android_3.0.2.apk

             。。。。。

通過android提供的PRODUCT_COPY_FILES這個變量來自動拷貝,只需要給此變量賦值。在任何一個確定加入編譯的mk文件

中加入(我的是加在msm7627_qrd.mk)

PRODUCT_COPY_FILES += /

    vendor/bm/APPS/MobileQQ2011.apk:system/app/MobileQQ2011.apk/
    vendor/bm/APPS/Renren_Android_3.0.2.apk:system/app/Renren_Android_3.0.2.apk

這種相對不會很繁瑣,不需要一級級的建立目錄,在內置很多apk是比較方便。

 

附加說明:

關於android.mk中的LOCAL_OVERRIDES_PACKAGES需要說明一下,

此變量可以使其他的模塊不加入編譯,如源碼中DeskClock的android.mk有

LOCAL_OVERRIDES_PACKAGES := AlarmClock

使 AlarmClock不會加入到編譯系統中,不會生成 AlarmClock.apk。

原先我是死活不明白會什么有兩個鬧鍾 AlarmClock和 DeskClock ,源碼幾乎相同,原先只在 AlarmClock中的文件中修改,就是沒有效果,測試說沒有修改,原來發布的版本中只有DeckClock.apk,我卻在本地make AlarmClock編譯出了AlarmClock.apk,>_<!!

試了一下在 DeskClock的android.mk中加入LOCAL_OVERRIDES_PACKAGES := Calendar,刪掉Calendar.apk, 然后全部make一下,在system/app下calendar.apk竟然沒再生成了????!!!

p.s

# Some packages may override others using LOCAL_OVERRIDES_PACKAGES.
# Filter out (do not install) any overridden packages.
overridden_packages := $(call get-package-overrides,$(modules_to_install))
ifdef overridden_packages
#  old_modules_to_install := $(modules_to_install)
  modules_to_install := /
      $(filter-out $(foreach p,$(overridden_packages),$(p) %/$(p).apk), /
          $(modules_to_install))
endif

 

 

其他參考:

1.對Android.mk文件中變量做了詳細說明

    http://www.cnblogs.com/leaven/archive/2011/03/30/1999350.html

2. Android.mk文件語法規范

   http://apps.hi.baidu.com/share/detail/15447104

 

 

本文轉載自:http://blog.csdn.net/zhangchiytu/article/details/6424910


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM