一涩哟、如何將帶源碼的APK預(yù)置進系統(tǒng)
在 packages/apps 下面以需要預(yù)置的 APK的 名字創(chuàng)建一個新文件夾声畏,以預(yù)置一個名為Test的APK 為例
將 Test APK的Source code 拷貝到 Test 文件夾下,刪除 /bin 和 /gen 目錄
在 Test 目錄下創(chuàng)建一個名為 Android.mk的文件居触,內(nèi)容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := Test
include $(BUILD_PACKAGE)打開文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名)
將 Test 添加到 PRODUCT_PACKAGES 里面狱杰。重新 build 整個工程
二少漆、如何將無源碼的 APK 預(yù)置進系統(tǒng)在 packages/apps 下面以需要預(yù)置的 APK 名字創(chuàng)建文件夾,以預(yù)置一個名為Test的APK為例
將 Test.apk 放到 packages/apps/Test 下面
-
在 packages/apps/Test 下面創(chuàng)建文件 Android.mk椿猎,文件內(nèi)容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT) 打開文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名)
將 Test 添加到 PRODUCT_PACKAGES 里面惶岭。將從Test.apk解壓出來的 so庫拷貝到alps/vendor/mediatek/${Project}/artifacts/out/target/product/${Project}/system/lib/目錄下,若無 so 庫犯眠,則去掉此步按灶;
重新 build 整個工程
注:
Android對這些權(quán)限進行了四類分級,不同級別的權(quán)限對應(yīng)不同的認證方式筐咧。
normal:低風(fēng)險權(quán)限鸯旁,只要申請了就可以使用(在AndroidManifest.xml中添加<uses-permission>標簽),安裝時不需要用戶確認量蕊;
dangerous:高風(fēng)險權(quán)限铺罢,安裝時需要用戶的確認才可使用;
signature:只有當申請權(quán)限的應(yīng)用程序的數(shù)字簽名與聲明此權(quán)限的應(yīng)用程序的數(shù)字簽名相同時(如果是申請系統(tǒng)權(quán)限残炮,則需要與系統(tǒng)簽名相同)韭赘,才能將權(quán)限授給它;
signatureOrSystem:簽名相同势就,或者申請權(quán)限的應(yīng)用為系統(tǒng)應(yīng)用(在system image中)辞居。
上述四類權(quán)限級別同樣可用于自定義權(quán)限中。如果開發(fā)者需要對自己的應(yīng)用程序(或部分應(yīng)用)進行訪問控制蛋勺,則可以通過在AndroidManifest.xml中添加<permission>標簽瓦灶,將其屬性中的protectionLevel設(shè)置為上述四類級別中的某一種來實現(xiàn)。
按照應(yīng)用需要的權(quán)限等級,我們選擇將apk安裝在系統(tǒng)不同位置.舉個例子抱完,如果一個在/system/app下的應(yīng)用聲明獲取權(quán)限定義中protectionLevel是signatureOrSystem的權(quán)限贼陶,最后是獲取不到這個權(quán)限的,但是在/system/priv-app下的應(yīng)用就可以.我們必須修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true碉怔,以聲明app需要放在/system/priv-app下烘贴。
三、如何預(yù)置APK使得用戶可以卸載撮胧,恢復(fù)出廠設(shè)置時不能恢復(fù)
- 在 packages/apps 下面以需要預(yù)置的 APK 名字創(chuàng)建文件夾桨踪,以預(yù)置一個名為Test的APK為例
- 將 Test.apk 放到 packages/apps/Test 下面;
- 在 packages/apps/Test 下面創(chuàng)建文件 Android.mk芹啥,文件內(nèi)容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)Module name should match apk name to be installed
LOCAL_MODULE := Test
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_DATA_APPS)
include $(BUILD_PREBUILT) - 打開文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名)
將 Test 添加到 PRODUCT_PACKAGES 里面锻离。 - 重新 build 整個工程
注意:這個比不能卸載的多了一句
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
四、如何預(yù)置APK使得用戶可以卸載墓怀,并且恢復(fù)出廠設(shè)置時能夠恢復(fù)
方法一:預(yù)置apk到system/vendor/operator下面
具體做法如下:
在packages/apps下面以需要預(yù)置的 APK 名字創(chuàng)建文件夾汽纠,以預(yù)置一個名為Test的APK為例:
- 將Test.apk 放到 packages/apps/Test 下面;
- 在packages/apps/Test下面創(chuàng)建文件 Android.mk傀履,文件內(nèi)容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)Module name should match apk name to be installed
LOCAL_MODULE := Test
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)/vendor/operator/app
include $(BUILD_PREBUILT) - 打開文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名)虱朵, 將 Test 添加到 PRODUCT_PACKAGES 里面
- 重新 build 整個工程
五、對于apk自帶so庫安裝說明如下
apk安裝在system/app和system/priv-app目錄下,如果apk本身帶有一些so庫文件,那么我們也必須將這些so庫文件預(yù)裝到系統(tǒng)中,可以選擇使用 mk 文件預(yù)裝,不同平臺可能安裝方式存在差異.所以我們只討論最終在機器中呈現(xiàn)的路徑
Android 4.4之前對于預(yù)裝的APK,所有的庫文件(so)都集中在存放在/system/lib目錄下
system/lib/
├── crtbegin_so.o
├── crtend_so.o
├── drm
│ └── libfwdlockengine.so
├── egl
│ ├── egl.cfg
│ ├── libEGL_mali.so
│ ├── libGLES_android.so
│ ├── libGLESv1_CM_mali.so
│ └── libGLESv2_mali.so
├── hw
│ ├── audio.a2dp.default.so
│ ├── audio_policy.default.so
│ ├── audio.primary.default.so
│ ├── audio.primary.polaris.so
│ ├── audio.r_submix.default.so
│ ├── audio.usb.default.so
│ ├── bluetooth.default.so
Android5.1開始,apk自帶的so庫文件開始單獨管理,和apk文件所在目錄同級:
Gallery2/
├── Gallery2.apk
├── lib
│ └── arm64
│ ├── libjni_eglfence.so -> /system/lib64/libjni_eglfence.so
│ ├── libjni_filtershow_filters.so -> /system/lib64/libjni_filtershow_filters.so
│ ├── libjni_jpegstream.so -> /system/lib64/libjni_jpegstream.so
│ └── librsjni.so -> /system/lib64/librsjni.so
└── oat
└── arm64
└── Gallery2.odex
在安裝apk時如果打開報錯,可以查看一下版本之間的差異