一般这种情况,你都可以在清单文件顶部找到类似如下的代码:
他的作用是:在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("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:如果有更好的方式请留言