[Android6.0][RK3399] 出厂预置可卸载 APK

本文介绍如何在RK3399平台上预装第三方APK,并确保其可卸载且在恢复出厂设置后不再出现。通过修改特定目录及使用auto_generator.py脚本,实现APK的正确安装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Platform: RK3399
OS: Android 6.0
Kernel: 4.4
Version: v2017.04

官方文档中的方法

mkdir device/rockchip/rk3399/preinstall
cp test.apk device/rockchip/rk3399/preinstall/

重新编译即可

编译后会在 out/target/product/rk3399/system/ 下生成 preinstall 文件夹,其中包含了预置的第三方 APK。
烧录后系统将自动安装应用到 data/app 目录,所以他们是可以卸载的。

不过即使卸载后,恢复出厂设置后,这些 APP 还是会存在的。
希望卸载后,恢复出厂设置时,这些 APP 不存在的话,将上述文件夹名字改为 preinstall_del 即可。

出现问题

我的 out/target/product/rk3399/system/ 并没有生成 preinstall 文件夹

解决思路

应该会有某个 mk 对 preinstall 进行操作。

$ grep preinstall ./device/rockchip/ -nir
./common/device.mk:21:    $(shell python device/rockchip/common/auto_generator.py $(TARGET_DEVICE_DIR) preinstall)
./common/device.mk:22:    $(shell python device/rockchip/common/auto_generator.py $(TARGET_DEVICE_DIR) preinstall_del)
./common/device.mk:23:    -include $(TARGET_DEVICE_DIR)/preinstall/preinstall.mk
./common/device.mk:24:    -include $(TARGET_DEVICE_DIR)/preinstall_del/preinstall.mk
./common/device.mk:422:# for preinstall
./common/device.mk:424:    $(LOCAL_PATH)/preinstall_cleanup.sh:system/bin/preinstall_cleanup.sh
./common/preinstall_cleanup.sh:2:log -t PackageManager "Start to clean up /system/preinstall_del/"
./common/preinstall_cleanup.sh:4:rm system/preinstall_del/*.*
./common/auto_generator.py:19:    preinstall_dir = os.path.dirname(argv[0])
./common/auto_generator.py:20:    preinstall_dir = os.path.join(preinstall_dir, '../../../' + argv[1] + '/' + argv[2])
./common/auto_generator.py:21:    if os.path.exists(preinstall_dir):
./common/auto_generator.py:23:        makefile_path = preinstall_dir + '/Android.mk'
./common/auto_generator.py:25:        include_path = preinstall_dir + '/preinstall.mk'
./common/auto_generator.py:36:        for root, dirs, files in os.walk(preinstall_dir):

看起来 device.mk 中有点相关

vi common/device.mk +21
 17 # Prebuild apps
 18 ifneq ($(strip $(TARGET_PRODUCT)), )
 19     TARGET_DEVICE_DIR=$(shell test -d device && find device -maxdepth 4 -path '*/$(TARGET_PRODUCT)/Boa    rdConfig.mk')
 20     TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(TARGET_DEVICE_DIR)))
 21     $(shell python device/rockchip/common/auto_generator.py $(TARGET_DEVICE_DIR) preinstall)
 22     $(shell python device/rockchip/common/auto_generator.py $(TARGET_DEVICE_DIR) preinstall_del)
 23     -include $(TARGET_DEVICE_DIR)/preinstall/preinstall.mk
 24     -include $(TARGET_DEVICE_DIR)/preinstall_del/preinstall.mk
 25 endif

哦,原来他是会去找 TARGET_DEVICE_DIR 目录下的 preinstall 啊
所以对于我的 TARGET_DEVICE_DIR 路径应该是 device/rockchip/rk3399/rk3399_64/preinstall
重新按官方方法添加 APK 后验证成功。

另外在上面 mk 中也可以看到 在找到了 preinstall 或者 preinstall_del 后会调用 device/rockchip/common/auto_generator.py 这个脚本来生成一些 mk 文件(Android.mk 和 preinstall.mk)

实际上最终处理 preinstall 文件夹下 Apk 的逻辑是在生成的 preinstall.mk 中的
重新编译后我们可以看到
preinstall 文件夹下除了之前我们添加的 APK 文件,还多了两个 mk 文件 Android.mk 和 preinstall.mk

vi device/rockchip/rk3399/rk3399_64/preinstall/preinstall.mk

preinstall.mk 中有

  PRODUCT_PACKAGES += MyAPK
<think>我们正在处理一个关于在Android系统固件中修改默认输入法的问题。根据提供的引用,我们可以总结出以下步骤: 1. **确定默认输入法的设置位置**:在Android系统中,默认输入法是通过系统设置数据库(Settings.Secure)中的`default_input_method`键值来控制的。同时,还需要设置`enabled_input_methods`来启用特定的输入法。 2. **修改系统源码**:为了在固件中预置默认输入法,需要修改系统源码中的相关文件。根据引用[2]、[3]、[4],主要涉及以下文件:- `frameworks/base/packages/SettingsProvider/res/values/defaults.xml`:在这里可以设置默认输入法的字符串资源。- `frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java`:在这个Java文件中,会加载默认输入法的设置。 3. **具体步骤**:-**步骤1**:在`defaults.xml`中定义默认输入法的组件名称(例如:`com.example.inputmethod/.YourInputMethodService`)和已启用的输入法列表(多个输入法用冒号分隔)。- **步骤2**:在`DatabaseHelper.java`中,确保在加载设置时使用上述定义的字符串资源来设置`Settings.Secure.DEFAULT_INPUT_METHOD`和`Settings.Secure.ENABLED_INPUT_METHODS`。 4. **输入法的预制**:需要将目标输入法预置到系统中(例如放在`packages/inputmethods`目录下,或者根据引用[2]放在`device/...`的相应目录下),并在设备编译时包含该输入法。5.**验证**:编译并烧写固件后,可以通过以下命令验证:```bashadbshell settingsget securedefault_input_methodadb shellsettings getsecure enabled_input_methods```现在,我们将按照上述步骤详细说明如何修改。###详细步骤####1.修改`defaults.xml`文件在`frameworks/base/packages/SettingsProvider/res/values/defaults.xml`文件中,添加或修改以下两个字符串资源:```xml<stringname="default_input_method"translatable="false">com.example.inputmethod/.YourInputMethodService</string> <stringname="enabled_input_methods"translatable="false">com.example.inputmethod/.YourInputMethodService:com.android.inputmethod.latin/.LatinIME</string> ```注意:-将`com.example.inputmethod/.YourInputMethodService`替换为你的输入法的完整组件名(包名/服务类全名)。 -`enabled_input_methods`可以包含多个输入法,用冒号分隔。通常需要包括默认输入法和系统自带的输入法(如LatinIME)。####2.修改`DatabaseHelper.java`文件在`frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java`文件中,找到`loadSecureSettings`方法。在该方法中,你会看到类似以下的代码:```javaloadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,R.string.default_input_method);loadStringSetting(stmt,Settings.Secure.ENABLED_INPUT_METHODS,R.string.enabled_input_methods);``` 确保这两行代码存在,并且传入的资源ID(`R.string.default_input_method`和`R.string.enabled_input_methods`)与你在`defaults.xml`中定义的名称一致。如果不存在,则需要添加。####3.预置输入法应用将你的输入法APK放入系统分区,例如:-放入`packages/apps/`目录下,并在相应的`Android.mk`或`Android.bp`文件中添加编译配置。-或者,根据引用[2]中的做法,放入设备特定的目录(如`device/rockchip/rk3288`)下,并在设备配置中引入。 ####4.编译并刷机重新编译系统固件(如`make-j`),然后将新固件刷入设备。 ###验证刷机后,启动设备,可以通过以下命令检查默认输入法是否设置成功:```bashadbshell settingsget securedefault_input_method```如果返回的是你设置的输入法组件名,则表示成功。 ###注意事项-不同Android版本可能略有差异,请根据具体版本调整(如引用[3]针对Android9,引用[4]针对Android5.1)。 -如果输入法没有正确预置或启用,可能会导致设置不生效。§§相关问题§§1.如何验证Android系统默认输入法已修改成功? 2.Android系统源码中,除了修改`defaults.xml`和`DatabaseHelper.java`,还需要注意哪些配置? 3.如果修改后默认输入法没有生效,可能有哪些原因?</think>### 在Android系统固件中修改默认输入法的方法 根据提供的引用资料,修改系统固件中的默认输入法需要修改Android源码并重新编译系统。以下是具体步骤: #### 1. **确定输入法组件名** 首先获取目标输入法的完整组件名(格式:`包名/服务类名`),例如: ```bash adb shell dumpsys input_method | grep "mId=" ``` #### 2. **修改系统配置文件** 在源码中修改以下关键文件(路径示例基于Android 8.1-9.0): **a. 修改`defaults.xml`定义** 路径:`frameworks/base/packages/SettingsProvider/res/values/defaults.xml` 添加/修改以下字符串: ```xml <!-- 默认输入法 --> <string name="default_input_method" translatable="false">com.your.ime/.YourInputService</string> <!-- 启用的输入法列表 --> <string name="enabled_input_methods" translatable="false">com.your.ime/.YourInputService:com.android.inputmethod.latin/.LatinIME</string> ``` **b. 修改数据库初始化逻辑** 路径:`frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java` 在`loadSecureSettings()`方法中确保加载默认值: ```java // Android 9示例代码 loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD, R.string.default_input_method); // 加载默认输入法 loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS, R.string.enabled_input_methods); // 加载启用列表 ``` #### 3. **预置输入法APK** 将输入法APK放入系统分区: ```bash # 示例路径 device/your_company/your_device/prebuilts/inputmethods/YourIME.apk ``` 在`device.mk`中添加预置声明: ```makefile PRODUCT_PACKAGES += YourIME ``` #### 4. **重新编译系统** ```bash source build/envsetup.sh lunch your_device-eng make -j8 ``` #### 5. **烧录固件验证** 刷机后通过ADB验证: ```bash adb shell settings get secure default_input_method # 应返回:com.your.ime/.YourInputService ``` ### 关键配置说明 | **配置项** | **数据库键名** | **作用** | |--------------------------|-------------------------------|----------------------------| | 默认输入法 | `secure.default_input_method` | 指定开机默认使用的输入法 | | 启用输入法列表 | `secure.enabled_input_methods`| 控制用户可见的输入法选项 | | 输入法子类型历史 | `input_methods_subtype_history`| 记录各输入法的最后使用子类型 | > **注意**:不同Android版本路径可能略有差异,Android 5.x-6.0配置在`rk3288/device/rockchip/rk3288`类似目录,更高版本集中在`frameworks/base`[^2][^3][^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值