Skip to content

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

Notifications You must be signed in to change notification settings

CliffLeopard/RePlugin

 
 

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%