將APK直接放入系統目錄中,會致使APK找不到so文件。正常狀況下的安裝是使用PackageManager,它會將so文件拷貝到系統讀取的so目錄(system/lib或system/lib64)下,提供給App使用;系統應用不會使用PackageManager去安裝,因此在使用系統應用前,須要提早將so文件拷貝到system/lib或system/lib64目錄下。
那麼有沒有方法,在系統應用預裝時,就自動提取apk中的so拷貝到system/lib或system/lib64目錄下呢。下面闡述一下系統預置app的整個流程,包含對這個問題的解決android
一、前提:windows
(1)studio已編譯好的app 並已經簽名app
(2)擁有系統源碼get
二、添加app到系統源碼
將編譯號的app在windows中解壓,並獲得 lib 文件夾,其中有不少的動態連接庫(.so)it
將編譯好的apk如test.apk放到系統源碼的packages/apps/test(test 本身建立的)中,io
把上面解壓的lib文件夾也放到test中。編譯
三、編寫Android.mk文件class
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
四、在系統預置app的配置文件中添加咱們目錄test
個人系統源碼的配置文件在bulid/target/product/generic.mk 這個文件中又包含其餘的配置文件,最終就是在配置文件中的 PRODUCT_PACKAGES 標誌下添加你的test目錄
PRODUCT_PACKAGES := \
Bluetooth \
Camera2 \
Gallery2 \
Music \
MusicFX \
OneTimeInitializer \
Provision \
SystemUI \
WallpaperCropper\
test
這樣就能夠了