解决:The application could not be installed: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

15 篇文章 0 订阅
8 篇文章 0 订阅

一般这种情况,你都可以在清单文件顶部找到类似如下的代码:

 他的作用是:在AndroidManife.xml 中添加android:sharedUser可以将不同的程序加入到同一个进程中,方便数据的共享。

但是有个前提是需要签名相同

而报这个错有可能是因为签名和系统签名不相同, android.uid.system是表示系统进程

解决方案

1.如果是自己定制的系统可以使用系统签名,如果是上传到应用市场的,每个应用市场都不相同,所以可能就用不了

2.如果不想和系统一个进程,就删掉这行代码

扩展

 从as运行的时候有时候会出现: Couldn't terminate the existing process for com.xxx.xxx  或者 一运行就wait for devxxx

我这边也有两个解决方案:

1.如果暂时测试用不到和系统进程相关的事,就暂时把这行代码删掉

2.如果需要测试和系统进程相关的事,则每次运行之前先把应用卸载掉,然后在安装,手动可能比较麻烦,但是写到运行的任务中就比较方便了,加到任务中的方式如下:

先在app:build.gradle中加入如下代码: 就是使用adb卸载当前的app(如果执行不了的请自行配置adb环境变量)

Groovy:

task unInsApk() {
    doLast {
        Runtime.getRuntime().exec("adb uninstall $android.defaultConfig.applicationId").waitFor()
    }
}

kts:

tasks.register<Task>("unInsApk") {
    doLast {
        Runtime.getRuntime().exec("adb uninstall ${android.defaultConfig.applicationId}").waitFor()
    }
}

 

 然后点上下箭头或拖动,将卸载app的task移动到执行安装apk之前,这样就可以先卸载在编译安装apk了

 然后就可以好好的玩耍了,亲测可用

ps:如果下面一直提示wait to devxxx的话可以先clean project ,然后重启所有as,卸载在重新运行一般就可以了

发现如果手动编译并安装就不会出现wait to devxxx,所以我们也可以直接写一个task,每次运行都使用它,就可以一键部署apk了,代码如下(可能需要根据你的目录小改)

Groovy:

task buildAndInstallApk(dependsOn: assemble) {
    doLast {
        def apkDir = new File(getBuildDir(), "outputs/apk/release")
        def apkFile = null
        for (File file : apkDir.listFiles().sort()) {
            if (file.name.lastIndexOf(".apk") > 0) {
                apkFile = file
                break
            }
        }
        Runtime.getRuntime().exec("adb install -r -d -t $apkFile.absolutePath").waitFor()
        //如果需要启动某个页面的话,可以用上一行的代码执行以下命令:adb shell am start xxx,命令参考:https://blog.csdn.net/qq_33505109/article/details/79515747
    }
}

kts:

tasks.register("buildAndInstallApk") {
    doLast {
        val apkFile = File(buildDir, "outputs/apk/release")
            .listFiles()
            ?.sorted()
            ?.find {
                it.name.endsWith(".apk")
            } ?: throw RuntimeException("找不到apk文件")
        Runtime.getRuntime().exec("adb install -r -d -t ${apkFile.absolutePath}").waitFor()
        //如果需要启动某个页面的话,可以用上一行的代码执行以下命令:adb shell am start xxx,命令参考:https://blog.csdn.net/qq_33505109/article/details/79515747
    }
}.dependsOn("assemble")

ps:如果有更好的方式请留言

对Kotlin或KMP感兴趣的同学可以进Q群 101786950

如果这篇文章对您有帮助的话

可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
根据提供的引用内容,出现错误 "INSTALL_FAILED_SHARED_USER_INCOMPATIBLE" 是因为应用程序的签名文件发生了更改,导致与之前安装的应用程序不兼容。这可能是由于以下几个原因引起的: 1. 签名文件不匹配:如果你更换了项目的签名文件,确保新的签名文件与之前的签名文件匹配。签名文件包括.keystore文件和签名密钥。 2. 应用程序已安装:如果之前已经安装了相同包名的应用程序,但是签名文件不同,那么你需要先卸载之前的应用程序,然后再安装新的应用程序。 3. 共享用户不兼容:如果你的应用程序是作为共享用户安装的,而新的签名文件与之前的签名文件不兼容,那么你需要删除共享用户数据,然后再安装新的应用程序。 以下是解决此问题的一些步骤: 1. 确保签名文件匹配:检查你的签名文件是否正确,并与之前的签名文件匹配。你可以使用以下命令检查签名文件的信息: ```shell keytool -list -v -keystore your_keystore_file.keystore ``` 2. 卸载应用程序:如果之前已经安装了相同包名的应用程序,但是签名文件不同,你需要先卸载之前的应用程序。你可以在设备上手动卸载应用程序,或者使用以下命令卸载应用程序: ```shell adb uninstall your_package_name ``` 3. 删除共享用户数据:如果你的应用程序是作为共享用户安装的,而新的签名文件与之前的签名文件不兼容,你需要删除共享用户数据。你可以使用以下命令删除共享用户数据: ```shell adb shell pm clear your_package_name ``` 请注意,卸载应用程序和删除共享用户数据将删除应用程序的所有数据,包括用户数据和设置。因此,在执行这些操作之前,请确保你已经备份了重要的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值