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主要分為兩類:
- 系統(tǒng)自帶的APK
- 用戶安裝的第三方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ù)安裝
帶源碼
- 在 packages/apps 下面以需要預(yù)置的 APK的 名字創(chuàng)建一個(gè)新文件夾,以預(yù)置一個(gè)名為Test的APK 為例
- 將 Test APK的Source code 拷貝到 Test 文件夾下,刪除 /bin 和 /gen 目錄
- 在 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)
- 打開文件 device\rockchip\common\device.mk,將 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test
- 重新 build 整個(gè)工程
不帶源碼
- 在 packages/apps 下面以需要預(yù)置的 APK 名字創(chuàng)建文件夾,以預(yù)置一個(gè)名為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_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抽離出來
- 打開文件 device\rockchip\common\device.mk
將 Test 添加到 PRODUCT_PACKAGES 里面。
PRODUCT_PACKAGES += Test - 重新 build 整個(gè)工程
注意:
如果App使用System Level的permission,需要預(yù)置到/system/priv-app底下 (原在/system/app)。
修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以聲明app需要放在/system/priv-app下。
RK預(yù)安裝
-
在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ù)裝
-
拷貝預(yù)安裝的APK到上述新建的文件夾中,注意文件名盡量使用英文,避免空格
編譯。
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 =