將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
這樣就可以了