App預(yù)裝及示例

platform:RK3399
OS:7.1.2
參考:
1.http://ddrv.cn/a/90501
2.https://blog.csdn.net/zhaoyufei133/article/details/93906752
3.https://notes.z-dd.net/2020/02/26/RK3399%E9%A2%84%E7%BD%AEAPK%E5%8F%8A%E9%97%AE%E9%A2%98/

RK的SDK預(yù)裝app有兩種方式:一種是Androd系統(tǒng)標(biāo)準(zhǔn)的實(shí)現(xiàn)方式,一種是RK自己實(shí)現(xiàn)的vendor方式.

應(yīng)用預(yù)安裝順序

APK主要分為兩類:

  1. 系統(tǒng)自帶的APK
  2. 用戶安裝的第三方APK

對(duì)于系統(tǒng)自帶的APK,可以從下面的路徑中查找:

/system/priv-app

該路徑存放一些系統(tǒng)底層的應(yīng)用,比如Setting,systemUI等。該目錄中的app擁有較高的系統(tǒng)權(quán)限,而且如果要使用

android:protectionLevel=signatureOrSystem

那么該app必須放到priv-app目錄中去。

/system/app

該目錄中存放的系統(tǒng)app權(quán)限相對(duì)較低,而且當(dāng)擁有root權(quán)限時(shí),就有可能卸載掉這些app。

/vendor/app

該目錄存放vendor廠商的app

/oem/app

該目錄中存放oem特有的app。

/data/app

用戶安裝的第三方app

PMS啟動(dòng)的時(shí)候,也是按照上述順序逐個(gè)掃描解析這些目錄中的apk的

系統(tǒng)預(yù)安裝

帶源碼

  1. 在 packages/apps 下面以需要預(yù)置的 APK的 名字創(chuàng)建一個(gè)新文件夾,以預(yù)置一個(gè)名為Test的APK 為例
  2. 將 Test APK的Source code 拷貝到 Test 文件夾下,刪除 /bin 和 /gen 目錄
  3. 在 Test 目錄下創(chuàng)建一個(gè)名為 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)
  1. 打開文件 device\rockchip\common\device.mk,將 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test
  1. 重新 build 整個(gè)工程

不帶源碼

  1. 在 packages/apps 下面以需要預(yù)置的 APK 名字創(chuàng)建文件夾,以預(yù)置一個(gè)名為Test的APK為例
  2. 將 Test.apk 放到 packages/apps/Test 下面
  3. 在 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_PREBUILT_JNI_LIBS:= \
@lib/armeabi/libtest.so \
@lib/armeabi/libtest2.so 
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

若無so,刪除LOCAL_PREBUILT_JNI_LIBS
若有so,使用LOCAL_PREBUILT_JNI_LIBS列出所有so的路徑,不要忘記使用@。@標(biāo)識(shí)符會(huì)將apk中的so抽離出來build進(jìn)apk同級(jí)目錄下的lib文件夾中

若apk支持不同cpu類型的so,針對(duì)so的部分的處理:

Ifeq ($(TARGET_ARCH),arm)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi-v7a/xxx.so\
@ lib/armeabi-v7a/xxxx.so
else ifeq ($(TARGET_ARCH),x86)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/x86/xxx.so
else ifeq ($(TARGET_ARCH),arm64)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi-v8a/xxx.so…

即將和TARGET_ARCH對(duì)應(yīng)的so抽離出來

  1. 打開文件 device\rockchip\common\device.mk
    將 Test 添加到 PRODUCT_PACKAGES 里面。
    PRODUCT_PACKAGES += Test
  2. 重新 build 整個(gè)工程

注意:

如果App使用System Level的permission,需要預(yù)置到/system/priv-app底下 (原在/system/app)。
修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以聲明app需要放在/system/priv-app下。

RK預(yù)安裝

  1. 在device/rockchip/rk3399/xxx/目錄下新建preinstall_del、preinstall_del_forever或preinstall文件夾。

    • preinstall_del:可卸載預(yù)裝,恢復(fù)出廠后應(yīng)用會(huì)恢復(fù)
    • preinstall_del_forever:可卸載預(yù)裝,恢復(fù)出廠后應(yīng)用不會(huì)恢復(fù)
    • preinstall:不可卸載預(yù)裝
  2. 拷貝預(yù)安裝的APK到上述新建的文件夾中,注意文件名盡量使用英文,避免空格

  3. 編譯。auto_generator.py會(huì)在編譯過程中,將拷貝的apk解包,自動(dòng)生成編譯mk文件。編譯完之后預(yù)置的APK會(huì)拷貝到system固件中,燒錄后,系統(tǒng)啟動(dòng)的時(shí)候會(huì)自動(dòng)安裝到data/app目錄中(通過PackageManager)
    注:預(yù)置的 APK 應(yīng)用需要得到對(duì)應(yīng)廠商授權(quán)

更換第三方輸入法

以手心輸入法為例;(選擇理由是簡潔無廣告,但是已經(jīng)停止更新了)

1.采用上面兩種方式之一預(yù)裝app

2.配置屬性,并將其加載到database中

配置屬性

diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 43ef213b..07f02e66 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -225,4 +225,7 @@
     <integer name="def_screenshot_button_show">1</integer>
     <!-- the store location of screen capture by default-->
     <string name="def_screenshot_location">internal_storage</string>

+    <!-- change default input method to sogou -->
+    <string name="def_input_method" translatable="false">com.sohu.inputmethod.sogou/.SogouIME</string>
+    <string name="enabled_input_method" translatable="false">com.sohu.inputmethod.sogou/.SogouIME</string>
      </resources>

加入數(shù)據(jù)庫

diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 5e2114dc..03bde16f 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2541,6 +2541,12 @@ class DatabaseHelper extends SQLiteOpenHelper {

             loadIntegerSetting(stmt, Settings.Secure.SLEEP_TIMEOUT,
                     R.integer.def_sleep_timeout);

+ /*load sogou input method to database*/

+ loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,

+ R.string.def_input_method);
  +

+ loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,

+ R.string.enabled_input_method);

  /*

   * IMPORTANT: Do not add any more upgrade steps here as the global,

3.可選

使能所有輸入法
禁止切換輸入法
輸入法無法切換

  diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
         index df1b6f51..8d3e37a6 100644
         --- a/services/core/java/com/android/server/InputMethodManagerService.java
         +++ b/services/core/java/com/android/server/InputMethodManagerService.java
         @@ -3083,6 +3083,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                  }
         
                  // TODO: The following code should find better place to live.
         
         +        /*
                  if (!resetDefaultEnabledIme) {
                      boolean enabledImeFound = false;
                      final List<InputMethodInfo> enabledImes = mSettings.getEnabledInputMethodListLocked();
                  @@ -3099,7 +3100,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
                          resetDefaultEnabledIme = true;
                          resetSelectedInputMethodAndSubtypeLocked("");
                      }
         
         -        }
         
         + }*/
         
           if (resetDefaultEnabledIme) {
               final ArrayList<InputMethodInfo> defaultEnabledIme =   
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容