android系統添加預置APP(so庫自動釋放)


將APK直接放入系統目錄中,會導致APK找不到so文件。正常情況下的安裝是使用PackageManager,它會將so文件拷貝到系統讀取的so目錄(system/lib或system/lib64)下,提供給App使用;系統應用不會使用PackageManager去安裝,所以在使用系統應用前,需要提前將so文件拷貝到system/lib或system/lib64目錄下。
那么有沒有方法,在系統應用預裝時,就自動提取apk中的so拷貝到system/lib或system/lib64目錄下呢。下面闡述一下系統預置app的整個流程,包含對這個問題的解決

1、前提:

 (1)studio已編譯好的app 並已經簽名

 (2)擁有系統源碼

2、添加app到系統

將編譯號的app在windows中解壓,並得到 lib 文件夾,其中有很多的動態鏈接庫(.so)

將編譯好的apk如test.apk放到系統源碼的packages/apps/test(test 自己創建的)中,

把上面解壓的lib文件夾也放到test中。

3、編寫Android.mk文件

include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional //不管是user 還是eng 版本都會編譯此app
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PREBUILT_JNI_LIBS := \
  @lib/armeabi/libtest.so \ //注意前面要用tab鍵隔開。  通過這種方式來完成半自動提取apk中的so,並拷貝到system/lib或system/lib64目錄下
  @lib/armeabi/libtest2.so //這是你需要添加的so。 如果是 armeabi-v7a 直接替換掉armeabi
LOCAL_CERTIFICATE := PRESIGNED //表示app已經簽名
include $(BUILD_PREBUILT)
如果so文件是32位,而源碼是針對64機器的,那么還需要在android.mk文件中加上
LOCAL_MULTILIB := 32
4、在系統預置app的配置文件中添加我們目錄

我的系統源碼的配置文件在bulid/target/product/generic.mk 這個文件中又包含其他的配置文件,最終就是在配置文件中的 PRODUCT_PACKAGES 標志下添加你的test目錄

PRODUCT_PACKAGES := \
    Bluetooth \
    Camera2 \
    Gallery2 \
    Music \
    MusicFX \
    OneTimeInitializer \
    Provision \
    SystemUI \
    WallpaperCropper\

    test

這樣就可以了


免責聲明!

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



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