解决AndroidStudio修改代码运行没变化没生效的问题-Xposed插件重载

2023年05月28日11:52:26更新

是因为AndroidStudio对Android11之后部署优化的问题,在Run处的位置EditConfigruations, 勾选Always install with package manager 即可。
在这里插入图片描述
下面的旧内容是自己瞎整的。。。。。

一、 简介

更新了AndroidStudio4.2.1之后出现了一个问题:改了代码之后点击运行,发现运行起来的app是我没改之前的代码。

例如我开始写了一个打印Log.e("@@","测试打印"),运行app之后是正常打印,然后我又加了一句打印,运行app,发现新加的打印并没有打印。

此文章记录一下解决问题的思路以及结果。

二、尝试发现问题

2.1 搜索

遇到问题找度娘,搜了一圈AndroidStudio改代码运行没变化相关的,发现没有相关的问题或者文章,有相关的都是就版本的InstantRun问题。
百度搜索结果

2.2 InstantRun

考虑是不是Instant Run的问题,但是Instant Run已经在AndroidStudio3.5废弃了,改成了ApplyChange,但是我点的运行是Run 'App', 所以这个应该没关系。

但是我又发现了一个hot-swap,但是关掉也是没效果的
在这里插入图片描述

2.3 Apk是否包含新代码

然后我看看反编译Runapp出来的apk,看看里面有没有包含我改动的代码,默认apk在目录:app/outpus/apk/debug/app-deubg.apk,发现改的代码已经在安装包里面了!!! 第一个包我加了一个测试打印,改动代码是添加了测试打印xxxxxxx。 这里就可以判断跟打包没关系了,因为新改动的代码已经是被打包的了
反编译之后的代码
没有显示添加的打印

2.4 手动安装

正常点击AS的运行,是as帮忙做好的了 打包apk-安装-运行 这几个步骤,上一步发现了打包是没问题的,那我手动安装试试呢?
于是我手动利用了adb命令进行安装(安装debug包需要加-t参数):
命令行安装
然后手动点击运行,发现居然正常了,新加的打印出来了!!!!
第二局测试打印出来了

2.5 AS的Run

根据上面的一系列猜测,就是在as里面运行的时候,打包了,但是没有安装到手机上,然后继续运行了旧的app。

然后我把目光放到Run的过程,对比正常和不正常的情况打印的Run日志是否有异常。

下面的图是异常的,没有第二条Log打印:
这个图是异常

下面的这图是正常的,打印了两条的:
在这里插入图片描述

对比发现,没啥区别。。。。。。

2.6 换个手机

由上面的总结,得知目前是安装的问题,我一直用的小米,于是我用另一台手机(魅族16Plus)来测试,最终测试结果: 这个魅族手机正常。。。。

三、小结

到了目前,貌似是我手机的问题。

最终发现,是我写的是Xposed插件问题,然后我装的是面具magisk
+LSPosed,由于Xposed的hook的影响才出现了这个问题。。。。。

四、解决Xposed插件实时更新

解决办法,我测试出来了两种:

  • 版本号(VersionCode) +1
  • 版本名(VersionName)有变化(推荐)

方式1:版本号+1

就是让app的版本号增加,就会让Xposed重新加载插件。那怎么做呢? 总不能运行前每次都去build.gradle手动+1然后AsyncGradle吧? 办法来了,利用脚本实现自动加+1。

添加版本号记录文件

在app这个module下创建文件 version.properties,用来记录当前的版本号,内容为:

versionCode=0
添加getVersionCode

在app这个module的build.gradle里面添加getVersionCode方法,从上面的文件获取版本号,并且+1保存,然后返回。

def getVersionCode() {
    def propsFile = file('version.properties')
    def properties = new Properties()
    properties.load(new FileInputStream(propsFile))
    def vCode = properties['versionCode'].toInteger()
    properties['versionCode'] = (++vCode).toString()
    properties.store(propsFile.newWriter(), null)
    return vCode
}
设置版本号

最后在android里面定义一个变量来保存上个方法+1得到的版本号,然后设置到defaultConfig里面的verseionCode。 这样子每次点击运行的时候,打包apk的版本号都会进行+1。 这样子就可以实时实现插件重载。
在这里插入图片描述

方式2: 版本名修改

上面修改版本号的方式会导致版本号一直往上+,导致退版本的时候需要卸载app。 所以我们可以修改版本名的方式,版本名不影响更新。

还是按照上面的方式,保存生成一个数字,但是这个数字加在名字上,在 buildTypes - debug - versionNameSuffix 这里定义VersionName的后缀即可。
在这里插入图片描述

方式3:版本名修改的另一种方法

随机生成一个数字作为版本名的后缀

def currentVersionCode = Math.random().toString().substring(2, 5)

在这里插入图片描述

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KeepStudya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值