- 本项目Fork自Qihoo360/Replugin
- 进行了一系列更新
- 使用Kotlin重构Gradle-plugin
- 使用并发Transform和InstantRun提升编译速度。插件构建不需要clean
- gradle-plugin 更新至4.2.2
- gradle 更新至6.7.1
- 仅支持AndroidX,不再支持Support包
-
将支持项目发布到本地:
gradle.properties
中修改配置SDK_PUBLISH=true
gradle.properties
中修改配置android.useAndroidX=true
android.enableJetifier=true
- 版本号见
rp-config.gradle
: 默认版本号为:2.3.8-SNAPSHOT-androix
- 执行工程Task的
publishToMavenLocal
-
发布到个人部署的Maven仓库:
local.properties
中添加以下配置- SONATYPE_NEXUS_USERNAME
- SONATYPE_NEXUS_PASSWORD
- RELEASE_REPOSITORY_URL
- SNAPSHOT_REPOSITORY_URL
- 执行
publishReleasePublicationToMavenRepository
:四个组件一起发布
-
运行Demo项目:
gradle.properties
中修改配置SDK_PUBLISH=false
- 运行工程目录下的
publish_plugin_install_to_host.sh
- fresco-sample:运行工程目录下的
build_fresco_host.sh
-
本工程的Demo项目已经全部更改为依赖
androix
,所以运行demo请保证一下配置- 项目已经发布到本地maven
gradle.properties
中修改配置SDK_PUBLISH=false
gradle.properties
中修改配置android.useAndroidX=true
android.enableJetifier=true
Replugin只对ClassLoader进行了Hook. Hook的主要内容为以下:
- 拿到
android.app.ContextImpl
的mPaclageInfo
字段,类型为android.app.LoadedApk
- 修改
mPaclageInfo
的mClassLoader
字段,改为自己的RePluginClassLoader
- 将
mPaclageInfo
的原来的mClassLoader
的放入RePluginClassLoader
中,供反射调用各种方法,和pathList
字段 - 由于原来的
mClassLoader
为dalvik.system.PathClassLoader
,没有重写以上方法,所以实际调用的是其父类dalvik.system.BaseDexClassLoader
的pathList
字段和如下方法:findResource
findResources
findLibrary
getPackage
-
查看Android11 API限制,下载
hiddenapi-flags.csv
. 可知,以上的hook点如下:Landroid/app/ContextImpl;->mPackageInfo:Landroid/app/LoadedApk;,greylist
Landroid/app/LoadedApk;->mClassLoader:Ljava/lang/ClassLoader;,greylist
Landroid/app/ContextImpl;->mClassLoader:Ljava/lang/ClassLoader;,greylist
Ldalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList;,greylist
Ldalvik/system/BaseDexClassLoader;->findLibrary(Ljava/lang/String;)Ljava/lang/String;,core-platform-api,public-api,system-api,test-api,whitelist
Ldalvik/system/BaseDexClassLoader;->findResource(Ljava/lang/String;)Ljava/net/URL;,core-platform-api,public-api,system-api,test-api,whitelist
Ldalvik/system/BaseDexClassLoader;->findResources(Ljava/lang/String;)Ljava/util/Enumeration;,core-platform-api,public-api,system-api,test-api,whitelist
Ldalvik/system/BaseDexClassLoader;->getPackage(Ljava/lang/String;)Ljava/lang/Package;,core-platform-api,public-api,system-api,test-api,whitelist
-
查看Android12 API限制,下载
hiddenapi-flags.csv
. 可知,以上的hook点如下:Landroid/app/ContextImpl;->mPackageInfo:Landroid/app/LoadedApk;,unsupported
Landroid/app/LoadedApk;->mClassLoader:Ljava/lang/ClassLoader;,unsupported
Landroid/app/ContextImpl;->mClassLoader:Ljava/lang/ClassLoader;,unsupported
Ldalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList;,unsupported
Ldalvik/system/BaseDexClassLoader;->findLibrary(Ljava/lang/String;)Ljava/lang/String;,core-platform-api,public-api,sdk,system-api,test-api
Ldalvik/system/BaseDexClassLoader;->findResource(Ljava/lang/String;)Ljava/net/URL;,core-platform-api,public-api,sdk,system-api,test-api
Ldalvik/system/BaseDexClassLoader;->findResources(Ljava/lang/String;)Ljava/util/Enumeration;,core-platform-api,public-api,sdk,system-api,test-api
Ldalvik/system/BaseDexClassLoader;->getLdLibraryPath()Ljava/lang/String;,core-platform-api,unsupported
Ldalvik/system/BaseDexClassLoader;->getPackage(Ljava/lang/String;)Ljava/lang/Package;,core-platform-api,public-api,sdk,system-api,test-api
-
查看Android10 注释释意可知。
greylist
和unsupported
都是不受限制的灰名单whitelist
在白名单中,更不受限制
-
所以综合上述可知。Replugin至少在
Android11:API30
和Android12:API31
上依然是可用的。