Android.mk內置第三方APK和資源文件的方法

Android.mk內置第三方APK和資源文件的方法。Android應用開發項目中,經常會遇到系統預置第三方apk,或者資源文件的需求。

一、內置APK

1.apk不含so文件

將APK放入文件夾內,改名為:yourModuleName.apk(mk文件

中的yourModuleName)。Android.mk文件與apk文件同級。

Android.mk內容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := 'yourModuleName'
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
include $(BUILD_PREBUILT)

LOCAL_MODULE_SUFFIX 是指文件後綴.apk

LOCAL_CERTIFICATE指apk的簽名,可以有:

testkey

media

platform

shared

如果文件已經簽過名,則使用PRESIGNED。

LOCAL_MODULE_PATH 指你要安裝的apk的路徑。

$(TARGET_OUT)/priv-app這個路徑下,apk不可卸載。

$(TARGET_OUT_DATA_APPS)這個路徑下apk卸載後不再恢復

$(TARGET_OUT)/vendor/operator/app這個路徑下apk卸載後恢

復出廠設置可以恢復apk

2.apk含有so文件

這時候就要考慮系統image的位數,包括32位和64位。因此包含在

apk內的so文件也應該對應位數編入apk,否則無法安裝。這裡有

兩個解決辦法:

1、提供兩個apk,arm(32),arm64(64),根據系統位數編

入相應的apk,這樣可以節省系統內存空間(so文件隻需放入一

個);

2、提供一個同時包含32位和64位so文件的apk,這樣就可以不擔

心系統位數,雖然方便,但是apk編入系統後會多占用一個so大小

的內存空間。

因此,這裡介紹第一種方法:

a. 首先用Android studio生成這兩個apk

libs中添加armeabi-v7a arm64-v8a,分別放入32位和64位so文

件,並在build.gradle的android{}中添加如下代碼塊:

productFlavors{

        arm{
            ndk{
                abiFilters "armeabi-v7a"
            }
        }
        arm_64{
            ndk{
                abiFilters "arm64-v8a"
            }
        }
    }

點開最左邊一欄的Build Variants,選擇要編譯apk類型的的選項,

其中有arm-debug,arm-release,arm64-debug,arm64-

release。編譯結束後,build的out目錄下就可以看到生成的兩個

apk。

b.mk編入apk

同樣,文件夾內放入兩個apk:

32位apk命名位:(yourModuleName)_arm.apk;

64位apk命名位(yourModuleName)_arm64.apk

同級目錄放入Android.mk文件。

Android.mk文件內容:

LOCAL_PATH := $(call my-dir)
my_archs := arm arm64
my_src_arch := $(call get-prebuilt-src-arch, $(my_archs))

include $(CLEAR_VARS)
LOCAL_MODULE := yourMoudleName
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app

LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
LOCAL_MODULE_TARGET_ARCH := $(my_src_arch)
LOCAL_MULTILIB := both
include $(BUILD_PREBUILT)

以上兩行來獲取當前系統是arm還是arm64,再去選擇內置哪個

apk:

my_archs := arm arm64
my_src_arch := $(call get-prebuilt-src-arch, $(my_archs))
LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk

這樣系統就可以根據自身位數來內置正確的apk瞭。

二、系統內置資源文件

有時候我們需要預先放置一些程序必要的資源文件,或者是第三方

apk的下載資源文件在系統中,項目代碼中從預置資源文件的路徑

中讀取資源文件。

1、放置資源文件到某編譯目錄

譬如在vendor/customer/thirdapp目錄下新建一個your_assets

文件夾放入資源文件。這樣你的資源文件目錄就是

vendor/customer/thirdapp/your_assets

2、拷貝資源文件到系統image中

將資源文件(假設為my.so文件)從1中放置的目錄拷貝到image

out目錄中,假定你需要放置的目錄為:

 out/target/product/customer/system/***

那麼項目代碼讀取資源文件的路徑為:

system/***

Android.mk文件拷貝代碼為:

a.創建文件夾:

$(shell mkdir -p out/target/product/customer/system/***)

b.拷貝文件:

$(shell cp vendor/customer/thirdapp/your_assets/my.so  out/target/product/customer/system/***)

註意:

1、文件拷貝寫法寫法如上,若是文件夾拷貝則需加-r:

$(shell cp vendor/customer/thirdapp/your_assets/* -r  out/target/product/customer/system/***)

2、拷貝的目的目錄不能是data目錄。Android默認是無法直接操作

Data根目錄和相關的目錄,我們想直接讀寫/data是做不到的。

You May Also Like