Android 8.0 平臺預置第三方apk到Data目錄,使其可以解除安裝並且恢復出廠設定可以還原
阿新 • • 發佈:2021-02-01
技術標籤:android
Mstar 8.0平臺預置第三方apk,踩了不少坑,這裡做一下筆錄。
正常情況預置apk到Data目錄很簡單,網上一搜很多,這裡就不貼程式碼了,但是這裡會遇到一個問題,
1如果在不改變apk簽名的情況下預置到Data目錄,編譯後可以看到out 目錄下確實是有這個apk,但是刷機系統跑起來後會因為簽名校驗不過(android 7.0之後增加的APK Signature Scheme v2簽名方案),導致這個apk自動被系統刪除。
2 如果將apk的簽名改為系統簽名預置到data目錄,編譯後刷機都可以正常執行,但是一般apk都有線上升級的功能,一旦apk有新版本了會因為apk簽名被改變導致升級不了,
經過幾次嘗試發現如果將apk直接push進data目錄 apk可以正常執行,那麼這就好辦了,我們就通過這種方式將apk內建進去,既可以讓apk可以解除安裝,也能夠讓apk可以升級,並且恢復出廠設定可以恢復,具體怎麼做呢,下面我以預置騰訊視訊會議apk為例子
1 首先 準備好要內建的apk,在編譯程式碼的時候將這個apk拷貝到一個位置(位置自己定義即可),ps :如果apk有lib 記得解壓出來
PRODUCT_COPY_FILES += \ $(call find-copy-subdir-files,*,$(LOCAL_PATH)/dataApps/TenxunConference,data/nodelete/pre_install/TenxunConference)
2 然後準備一個指令碼 copy_apps.sh,在第一次開機的時候執行指令碼將apk拷貝到data目錄,記得給這些apk檔案
賦予許可權
#!/system/bin/sh FILE_DIR=/data/nodelete/pre_install/TenxunConference FILE_DIR2=/data/app TARGET_DIR=/data/app/TenxunConference echo "$FILE_DIR copy start!!!" mstarsu cp $FILE_DIR $FILE_DIR2 -rf chmod 777 $TARGET_DIR chmod 777 $TARGET_DIR -R echo "$FILE_DIR copy end!!!"
將指令碼拷貝到system/etc目錄下
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/copy_apps.sh:system/etc/copy_apps.sh
記得給指令碼新增許可權
[email protected]:~/code/public-8386/system$ git diff
diff --git a/core/libcutils/fs_config.c b/core/libcutils/fs_config.c
index 954680c..fd7b6a8 100755
--- a/core/libcutils/fs_config.c
+++ b/core/libcutils/fs_config.c
@@ -184,6 +184,7 @@ static const struct fs_path_config android_files[] = {
{ 00444, AID_ROOT, AID_ROOT, 0, ven_conf_dir + 1 },
{ 00444, AID_ROOT, AID_ROOT, 0, ven_conf_file + 1 },
{ 00755, AID_ROOT, AID_ROOT, 0, "system/etc/rp_update_file.sh" },
+ { 00755, AID_ROOT, AID_ROOT, 0, "system/etc/copy_apps.sh" },
{ 00755, AID_ROOT, AID_ROOT, 0, "system/etc/jms_change_permission.sh" },
在init.rc中定義一個服務
#for copy apps
service copy_apps /system/bin/sh /system/etc/copy_apps.sh
class main
user root
group root
disabled
oneshot
seclabel u:r:shell:s0
on property:persist.rp.first_boot=1
start copy_apps
在SystenServer中去啟動這個服務
diff --git a/base/services/java/com/android/server/SystemServer.java b/base/services/java/com/android/server/SystemServer.java
index 64b35db..f0a7666 100755
--- a/base/services/java/com/android/server/SystemServer.java
+++ b/base/services/java/com/android/server/SystemServer.java
@@ -122,6 +122,7 @@ import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
+import android.util.Log;
import static android.view.Display.DEFAULT_DISPLAY;
@@ -505,6 +506,16 @@ public final class SystemServer {
* the other functions.
*/
private void startBootstrapServices() {
+ //add by gyx
+ boolean isFirstBoot = SystemProperties.get("persist.rp.first_boot_flag","0").equals("0");
+ if(isFirstBoot){
+ Log.i("gyx","isFirstBoot");
+ SystemProperties.set("persist.rp.first_boot_flag","1");
+ SystemProperties.set("persist.rp.first_boot","1");
+ SystemProperties.set("persist.rp.first_boot","0");
+ }
+ //end
+
這樣基本就完成了,親自沒有問題。