- 本项目Fork自Qihoo360/Replugin
- 进行了一系列更新
- 使用Kotlin重构Gradle-plugin
- 使用并发Transform和InstantRun提升编译速度。插件构建不需要clean
- gradle-plugin 更新至4.2.2
- gradle 更新至6.7.1
- 仅支持AndroidX,不再支持Support包
-
将支持项目发布到本地:
gradle.properties中修改配置SDK_PUBLISH=truegradle.properties中修改配置android.useAndroidX=trueandroid.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=falsegradle.properties中修改配置android.useAndroidX=trueandroid.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字段和如下方法:findResourcefindResourcesfindLibrarygetPackage
-
查看Android11 API限制,下载
hiddenapi-flags.csv. 可知,以上的hook点如下:Landroid/app/ContextImpl;->mPackageInfo:Landroid/app/LoadedApk;,greylistLandroid/app/LoadedApk;->mClassLoader:Ljava/lang/ClassLoader;,greylistLandroid/app/ContextImpl;->mClassLoader:Ljava/lang/ClassLoader;,greylistLdalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList;,greylistLdalvik/system/BaseDexClassLoader;->findLibrary(Ljava/lang/String;)Ljava/lang/String;,core-platform-api,public-api,system-api,test-api,whitelistLdalvik/system/BaseDexClassLoader;->findResource(Ljava/lang/String;)Ljava/net/URL;,core-platform-api,public-api,system-api,test-api,whitelistLdalvik/system/BaseDexClassLoader;->findResources(Ljava/lang/String;)Ljava/util/Enumeration;,core-platform-api,public-api,system-api,test-api,whitelistLdalvik/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;,unsupportedLandroid/app/LoadedApk;->mClassLoader:Ljava/lang/ClassLoader;,unsupportedLandroid/app/ContextImpl;->mClassLoader:Ljava/lang/ClassLoader;,unsupportedLdalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList;,unsupportedLdalvik/system/BaseDexClassLoader;->findLibrary(Ljava/lang/String;)Ljava/lang/String;,core-platform-api,public-api,sdk,system-api,test-apiLdalvik/system/BaseDexClassLoader;->findResource(Ljava/lang/String;)Ljava/net/URL;,core-platform-api,public-api,sdk,system-api,test-apiLdalvik/system/BaseDexClassLoader;->findResources(Ljava/lang/String;)Ljava/util/Enumeration;,core-platform-api,public-api,sdk,system-api,test-apiLdalvik/system/BaseDexClassLoader;->getLdLibraryPath()Ljava/lang/String;,core-platform-api,unsupportedLdalvik/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上依然是可用的。