Android13 预装搜狗输入法报错

文章描述了在Android12(SDK30)更新后,系统遇到的APK签名问题,即SougouIME.apk缺少APKSignatureSchemeV2签名。解决方法是修改ApkSignatureVerifier.java文件中的getMinimumSignatureSchemeVersionForTargetSdk方法以允许V1签名。

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

报错

12-28 18:53:50.019  1183  1183 W System.err: com.android.server.pm.PackageManagerException: No APK Signature Scheme v2 signature in package /system/app/SougouIME/SougouIME.apk
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.pm.ScanPackageUtils.collectCertificatesLI(ScanPackageUtils.java:968)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.pm.InstallPackageHelper.scanSystemPackageLI(InstallPackageHelper.java:4004)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.pm.InstallPackageHelper.addForInitLI(InstallPackageHelper.java:3650)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.pm.InstallPackageHelper.installPackagesFromDir(InstallPackageHelper.java:3504)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.pm.InitAppsHelper.scanDirTracedLI(InitAppsHelper.java:386)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.pm.InitAppsHelper.scanSystemDirs(InitAppsHelper.java:358)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.pm.InitAppsHelper.initSystemApps(InitAppsHelper.java:194)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.pm.PackageManagerService.<init>(PackageManagerService.java:2050)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.pm.PackageManagerService.main(PackageManagerService.java:1531)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.SystemServer.startBootstrapServices(SystemServer.java:1266)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.SystemServer.run(SystemServer.java:961)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.server.SystemServer.main(SystemServer.java:665)
12-28 18:53:50.019  1183  1183 W System.err: 	at java.lang.reflect.Method.invoke(Native Method)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:703)
12-28 18:53:50.019  1183  1183 W System.err: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:889)
12-28 18:53:49.985   698   698 E         : SPRDDEBUG gpu core power on polling SUCCESS !
12-28 18:53:50.019   209   209 E         : GPU_DVFS kbase_platform_modify_target_freq gpu_boost_level:10 min_freq=850MHz max_freq=850MHz target_freq=850MHz
12-28 18:53:50.023  1183  1183 W System.err: Caused by: android.util.apk.SignatureNotFoundException: No APK Signing Block before ZIP Central Directory
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSigningBlockUtils.findApkSigningBlock(ApkSigningBlockUtils.java:722)
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSigningBlockUtils.findSignature(ApkSigningBlockUtils.java:82)
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSignatureSchemeV2Verifier.findSignature(ApkSignatureSchemeV2Verifier.java:155)
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSignatureSchemeV2Verifier.verify(ApkSignatureSchemeV2Verifier.java:142)
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSignatureSchemeV2Verifier.verify(ApkSignatureSchemeV2Verifier.java:127)
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSignatureVerifier.verifyV2Signature(ApkSignatureVerifier.java:346)
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSignatureVerifier.verifyV3AndBelowSignatures(ApkSignatureVerifier.java:168)
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSignatureVerifier.verifySignaturesInternal(ApkSignatureVerifier.java:141)
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSignatureVerifier.verifySignatures(ApkSignatureVerifier.java:99)
12-28 18:53:50.023  1183  1183 W System.err: 	at android.util.apk.ApkSignatureVerifier.unsafeGetCertsWithoutVerification(ApkSignatureVerifier.java:88)
12-28 18:53:50.023  1183  1183 W System.err: 	at com.android.server.pm.pkg.parsing.ParsingPackageUtils.getSigningDetails(ParsingPackageUtils.java:3115)
12-28 18:53:50.024  1183  1183 W System.err: 	at com.android.server.pm.pkg.parsing.ParsingPackageUtils.getSigningDetails(ParsingPackageUtils.java:3063)
12-28 18:53:50.024  1183  1183 W System.err: 	at com.android.server.pm.ScanPackageUtils.collectCertificatesLI(ScanPackageUtils.java:964)
12-28 18:53:50.024  1183  1183 W System.err: 	... 14 more
12-28 18:53:50.024  1183  1183 W PackageManager: Failed to scan /system/app/SougouIME: No APK Signature Scheme v2 signature in package /system/app/SougouIME/SougouIME.apk

原因

android sdk 30后不支持v1版本签名

解决方法

修改/framework/base/core/java/android/util/apk/ApkSignatureVerifier.java,中的getMinimumSignatureSchemeVersionForTargetSdk方法。

public static int getMinimumSignatureSchemeVersionForTargetSdk(int targetSdk) {
        //modify add start
        //default allow v1 signature app
        /*
        if (targetSdk >= Build.VERSION_CODES.R) {
            return SignatureSchemeVersion.SIGNING_BLOCK_V2;
        }*/
        //modify add end
        return SignatureSchemeVersion.JAR;
}

注意:预装输入法时,一定要保留LatinIME输入法。因为在开机未解锁时出于加密状态,第三方输入法未设置directBootAware="true"无法启动,导致开机锁屏输入密码时无法弹出。

详见:

支持“直接启动”模式  |  App quality  |  Android Developers

<think>好的,我现在需要帮助用户了解如何在Android手机上让预装搜狗输入法可以升级或卸载。首先,我需要整理已有的引用内容,看看里面有哪些相关的信息。 用户提供的引用中有几个关键点: 1. 引用[2]和[5]提到了如何将搜狗输入法设置为默认输入法以及预置无源码APK的方法,包括使用Settings.Secure.putString和preinstall.sh脚本安装APK。 2. 引用[3]和[4]讨论了如何禁止用户卸载应用,以及预装应用是否可以删除的情况。例如,酷比魔方C1预装搜狗输入法是可以删除的。 3. 引用[5]中的preinstall.sh脚本将APK复制到/data/app目录并设置权限,这可能影响应用是否可以升级,因为/data/app下的应用通常可以被用户更新。 现在,用户的问题是关于如何让预装搜狗输入法能够升级或卸载。根据Android系统,预装应用通常分为系统应用(安装在/system分区)和用户应用(安装在/data分区)。系统应用默认不可卸载,除非有root权限,而用户应用可以卸载。 从引用[5]中的preinstall.sh脚本来看,APK被安装到/data/app目录,这里通常是用户应用的位置,所以理论上用户是可以卸载的。但实际情况可能取决于厂商的设置。如果应用被预置到/system分区(如/system/app或/system/priv-app),则用户无法卸载,除非有root权限。 关于升级问题,如果应用安装在/data/app,用户可以正常通过应用商店升级。如果安装在/system分区,可能需要覆盖安装到用户分区,或者厂商提供系统更新来升级。 根据引用[3],禁止卸载的方法涉及修改系统设置,而允许卸载可能需要将应用预装到用户可写的位置,如/data/app,而不是/system分区。此外,引用[4]提到某些预装应用可以删除,可能因为它们被安装到用户分区。 因此,解决方案可能包括: 1. 将搜狗输入法预装到/data/app目录,这样用户可卸载,且能通过应用商店升级。 2. 如果必须预装到/system分区,需要修改系统配置,允许卸载或升级,可能需要签名一致,或者在系统更新时替换APK。 另外,引用[5]的脚本中使用pm install安装APK到/data/app,这种情况下应用应该可以被用户卸载,但需要确保预装脚本正确设置权限和路径。 可能还需要考虑Android版本的不同,如引用[1]提到安卓8.1和5.1路径不同,但实现方法相同,需要注意路径的正确性。 总结步骤: - 预装到用户可写目录(如/data/app)以实现可卸载和升级。 - 避免将应用放入/system分区,或使用可卸载的配置。 - 确保APK签名一致,允许市场更新。 最后,检查是否有其他因素,如设备厂商的定制限制,可能需要调整预装方法或配置。</think>### Android预置搜狗输入法实现可升级/卸载的方法 #### 1. 控制预装路径实现可卸载 将搜狗输入法预置到用户可写目录(如$data/app$),而非系统只读目录(如$system/app$)。 **实现代码示例**: ```shell # preinstall.sh脚本中指定用户目录 cp -r /vendor/operator/app/sougou.apk /data/app/ chmod 0644 /data/app/sougou.apk ``` - 此路径下的应用用户拥有卸载权限[^5] - 需确保APK签名与后续市场版本一致才能升级[^4] #### 2. 系统分区预装的特殊处理 若必须预装到$system$分区: ```mk # Android.mk配置 LOCAL_MODULE := SogouInput LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_PATH := $(TARGET_OUT)/app # 而非system/priv-app LOCAL_CERTIFICATE := PRESIGNED # 允许签名更新 ``` - 配置$LOCAL_MODULE_PATH$为非特权目录 - 声明$PRESIGNED$证书允许覆盖安装[^3] #### 3. 禁用厂商卸载限制 在设备系统配置中: ```xml <!-- packages.xml中移除保护标记 --> <package name="com.sohu.inputmethod.sogou" protected="false" /> ``` - 需系统签名或root权限修改 - 部分厂商ROM需关闭系统写保护 #### 4. 输入法管理优化 ```java // 动态检测默认输入法状态 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(imm.getInputMethodList().contains("com.sohu.inputmethod.sogou")) { Settings.Secure.putString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD, "com.sohu.inputmethod.sogou/.SogouIME"); // 保持默认状态[^2] } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值