Skip to content

CliffLeopard/RePlugin

This branch is 87 commits ahead of, 10 commits behind Qihoo360/RePlugin:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

5607b3c · Dec 9, 2022
Aug 16, 2017
Sep 12, 2021
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Nov 17, 2021
Dec 9, 2022
Dec 9, 2022
Sep 12, 2021
Dec 9, 2022
Sep 12, 2021
Sep 13, 2021
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Jan 14, 2022

Repository files navigation

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

Gradle和Hook相关

关于Android限制访问隐藏API的说明

Hook点:

Replugin只对ClassLoader进行了Hook. Hook的主要内容为以下:

  1. 拿到android.app.ContextImplmPaclageInfo字段,类型为android.app.LoadedApk
  2. 修改mPaclageInfomClassLoader字段,改为自己的RePluginClassLoader
  3. mPaclageInfo的原来的mClassLoader的放入RePluginClassLoader中,供反射调用各种方法,和pathList字段
  4. 由于原来的mClassLoaderdalvik.system.PathClassLoader,没有重写以上方法,所以实际调用的是其父类dalvik.system.BaseDexClassLoaderpathList字段和如下方法:
    • findResource
    • findResources
    • findLibrary
    • getPackage

Android SDK 限制

  • 查看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 注释释意可知。

    • greylistunsupported都是不受限制的灰名单
    • whitelist在白名单中,更不受限制
  • 所以综合上述可知。Replugin至少在Android11:API30Android12:API31上依然是可用的。

About

RePlugin - A flexible, stable, easy-to-use Android Plug-in Framework

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 91.3%
  • Kotlin 8.0%
  • Other 0.7%