Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pull] master from Tencent:master #24

Open
wants to merge 179 commits into
base: master
Choose a base branch
from
Open

Conversation

pull[bot]
Copy link

@pull pull bot commented Jun 16, 2021

See Commits and Changes for more details.


Created by pull[bot]

Can you help keep this open source service alive? 💖 Please sponsor : )

shifujun added 3 commits June 16, 2021 16:23
specialClassLoader通常是PathClassLoader的parent,可能是DynamicRuntimeClassLoader,也可能是BootClassLoader。

从specialClassLoader优先加载,使插件在打包了和系统类的重名类时,优先使用系统实现,与正常安装app保持一致。

fix #529
@pull pull bot added the ⤵️ pull label Jun 16, 2021
shifujun and others added 26 commits June 17, 2021 11:44
否则PluginClassLoaderTest执行不到。

#439 导致2个测试用例失败没测出来。
AppCompat有一个installViewFactory逻辑,依赖于判断layoutInflater.getFactory() == null才正常安装。
而ShadowLayoutInflater已经设置了Factory,所以对于插件代码来说,虽然还能够setFactory,
但是getFactory()返回的就不是null了。

添加一个Transform,将插件中原本的getFactory()修改为ShadowLayoutInflater.getOriginalFactory,
从而保持插件代码getFactory()时总能获取到自己原本设置的Factory。

fix #214
避免4.0.0以下版本生成没有<application />的apk,在targetSdkVersion>=30时,在API 30以上的手机上Crash。

#582
1. 添加NativePluginContainerActivity
2. add ShadowNativeActivity
3. override getPackageManager返回插件ActivityInfo
否则并发情况下,其他DB操作可能会因close而中断。

DB只能在不再使用manager时手工释放,sample演示了可以在操作manager的Activity onDestroy时通过enter接口控制manager自行close。

fix #604
由于ShadowTransform只处理输入的文件,并且处理时逻辑固定。在输入文件不变的情况下,输出文件总是可替代的。所以直接声明isCacheable为true就可以使用构建缓存。

同时开启Github Action上的缓存机制,加快构建。
由于ShadowLayoutInflater不再只是一个转调壳子,有了状态(mOriginalFactory等),
不能再总是new新的对象了。换了新对象就无法还原Factory了。

fixup! c710a18
fix #614
空实现对齐已有startForeground方法。只支持第三方SDK编译通过。

fix #617
修复前对于PackageManagerTransformTest.kt改动的情况无法编译成功。因为setBody时需要编译Java代码片段。存在一些经过Proguard混淆的类使用了非法的字符作为包名,在代码里引用这些类名无法正常编译。

需要引用当前类的class时,先引用这个Placeholder,编译后再直接通过字节码修改替换回原来的名字。

fix #623
避免重复加载类时反复进行白名单逻辑判断。
改善规则较多时的字符串匹配性能。
同时采用output时相同的entryName。

fix #641
而不是像ShadowContext一样默认委托给baseContext。

baseContext可能不是一个Activity,导致Dialog等代码在
getSystemService(Context.WINDOW_SERVICE)时,
得到的WindowManager缺少mParentWindow。进而在
WindowManagerGlobal#addView时,依赖
mParentWindow.adjustLayoutParamsForSubWindow初始化
WindowManager.LayoutParams的token时失败。
从而导致Dialog.show会抛出"token is null"异常。

fix #640
shifujun and others added 30 commits April 18, 2023 13:37
note:init时调用setWebViewClient是为了应对业务代码从来没有调用setWebViewClient的场景。

fix #1175
javac总是生成new+dup,但这并不是字节码规范。proguard等工具可能会优化掉dup。

fix #1155
静态内部类getDeclaredMethod时能获取到父类定义的方法,
但它带有Volatile标志位。
看起来只是在cmdline-tools 2.0版本升级中,把这些java lib的jar文件名都加了
-classpath后缀。

fix #1179
漏了在pom中声明json-simple的依赖。
升级AGP后没有传递来的依赖就找不到类了。
判断requestedOrientation和插件manifest中不一致时主动设置它
note:增加一个删除方法,如果有子目录则先删除子目录下的文件

fix #1140
7.4.2是最高的7.4版本。升级到这个版本主要是为升级到AGP 8.0做准备。

同时对应升级Gradle到7.5版本。此版本Gradle可同时兼容JDK 11和17,也是AGP 8.0要求的JDK版本。

升级CI环境到JDK 17.

进一步统一Android模块相关版本定义到统一到versions.properties文件中。

#1212
ClassTransform是抽象的,它不知道字节码编辑工具是Javassist,也不知道Transform框架是AGP的还是Gradle的。
它定义了TransformInput,由外部Transform框架的适配器(如DeprecatedTransformWrapper)将外部Transform
框架的输入适配进来。

TransformInput支持DIR和JAR两种输入,对应ClassTransform.input中通过TransformInput拿到输入的class文件或
jar文件,然后交给loadDotClassFile和loadClassFromJar两个抽象方法加载类到字节码编辑框架中。
input同时将加载的类名记录到TransformInput.getInputClassNames中,以便output时知道该输出哪些类。
注意1个TransformInput对应多个Class。

此次简化去掉了InputClass类。这个类之前主要的作用是记录每个输入的class对应的输出文件。
这个输出文件其实不需要逐个记录路径或者entryname,可以由类名自己拼接出来。
所以这次简化改为了在output时再根据classname生成文件路径和entryname。

将ctClassInputMap: Map<CtClass, InputClass>改为allInputCtClass: Set<CtClass>
,去掉renameOutput方法,都是因为早在 f1d0f5b 引入新的Fragment支持方案时,
就不再需要修改输出类名。也就是现在所有Transform操作都不会影响输入的类名,也不会增加或减少类。
因此不再需要将控制输出文件的InputClass传给TransformManager。

最后将对已经Deprecated,即将在AGP 8中删除的Transform API的依赖代码都移到DeprecatedTransformWrapper中。

#1212
GradleTransformWrapper对接新版API实现的是最基本的全量输入和输出功能。
没有实现增量编辑的能力,也没有对齐旧版API中在getSecondaryFiles中将自身代码加入,
以便开发中更新transform代码可触发重新执行transform。
因此使用GradleTransformWrapper开发transform时可能需要手动clean。

ShadowPlugin加入了hasDeprecatedTransformApi检测,
只在判断出AGP主版本号大于等于8时才会应用GradleTransformWrapper。

增加了projects/test/gradle-plugin-agp-compat-test中对AGP 8.0+已知版本的自动化测试。

resolve #1212
典型的场景应该是androidx等库对新版本Android SDK新增API的依赖非常及时,
但这些依赖并不总是有用。在低版本Android SDK上编译时,新增API不存在对
这些库实际上没有影响。

我们检查替换类名时也应该先看看原先依赖的方法是否能找到。如果本来就找不到,
那我们的新类也没必要一定实现缺失的方法。

#1251
模仿ContextThemeWrapper的做法。
否则Android内置的View,如ProgressBar在从Theme.obtainStyledAttributes
时会获取不到自己的资源。

fix #1271
由于兼容性测试此前没有测试packagePlugin部分,导致此问题没有及时暴露。
此提交同时补充了兼容性测试。

更新AGP兼容性测试到8.4.0-rc02版本。

fix #1306
便于插件工程以Gradle更新的plugins id语法引入插件。
plugins {
    id 'com.tencent.shadow.plugin'
}
在本地不能复现这个问题,但是在CI上很稳定。
为了尽快恢复CI上的AVD自动化测试,先去掉这个用例。
更新了格式化代码的Android studio版本。
更新了AVD插件。经测试API 18虚拟机无法用AVD缓存,会卡住。
本身创建虚拟机并不是特别慢,去掉了AVD缓存。
androidx.profileinstaller.ProfileVerifier中有使用。

#1277
项目更新不频繁,ubuntu-latest总在更新。
目前项目用的Android SDK 33就在新版本中删掉了。
尽量少改动的方式增加target 34的一个冒烟测试,
只测试一个随意的插件用例能通过。
由于插件apk都是BasePluginManager负责解压缩的,所以它应该负责它们禁止可写。

但是PluginManager本身的apk更新应该由更新文件的代码本身禁止文件可写入。

#1344
大于API 33,广播插件测试case,运行崩溃
经过反复分析现有代码,无法在不改动SDK层代码的前提下修复这个问题。
主要是因为Shadow的Gradle plugin有硬编码outputs目录的情况。

并且这个Plugin还假设了Gradle配置阶段就能确定apk的最终路径,
这与现状不符。目前是配置完成后,IDE还能决定将apk的输出路径改到intermediates中。
所以很难简单的修复这个假设的错误。

考虑到主要要解决的问题还是Shdaow自身项目希望能在IDE中直接run起来。
决定还是将intermediates中的apk直接复制到原本的路径。这样其他代码都不用改动。

fix #1263
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.