首先说明,当然不能直接在第三方库里面直接改,还是需要通过各种方式弄到源码,重建项目之后以项目依赖的方式,或者直接导入源码的方式进行修改。

0. 文章缘起

有时候第三方库jar包或者aar包需要查看源码,但是使用Android Studio进去查看,部分代码没有解析出来。或者有时候需要修改第三方库,但是又不容易找到仓库开源代码的位置,需要在代码中引入该库的所有源码,并稍加改造。此时我们需要将该库代码导出,并导入到本地源文件包中,稍作修改后使用。

1. java源码的jar或aar包文件的导出

对于在build.gradle中使用库依赖方式引入的jar或aar包,编译成功后,会在本地会缓存完整的jar包或者aar包文件。如何将这个jar或者aar包找到呢?

  • 在Project索引窗口,以Project方式查看项目,我们可以看到External Libraries,直译作外部库
  • 展开外部库
  • 找到需要导出的第三方aar或jar文件
  • 右键 -> Library properties -> 可以看到相应的aar包或jar包的缓存 -> 复制路径锁在文件夹路径 -> 打开该文件夹,将文件拷贝到桌面或其他需要的位置
  • 用反编译工具将jar或者aar包反编译成java代码,导入到我们的源码中进行修改使用

这种方式还是建议在实在找不到源码的时候使用吧!毕竟不是很好用。这里导出的jar包或者aar包对于想把aar或者jar改成文件依赖是挺有用的。

2. google库的源码

有时候我们要修改的第三方库是google提供的,而且也能找到源码。那么我们直接将相应的源码下载下来使用。

比如要修改

androidx.navigation:navigation-fragment-ktx:2.3.0

通过google找到了一个源码路径, 这里可能需要登录google账户

https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/navigation/navigation-fragment-ktx/build.gradle

文件内容

/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import static androidx.build.dependencies.DependenciesKt.*
import androidx.build.LibraryGroups
import androidx.build.LibraryVersions
import androidx.build.AndroidXExtension
import androidx.build.Publish
plugins {
    id("AndroidXPlugin")
    id("com.android.library")
    id("org.jetbrains.kotlin.android")
}
dependencies {
    api(project(":navigation:navigation-fragment"))
    // Ensure that the -ktx dependency graph mirrors the Java dependency graph
    api(project(":navigation:navigation-runtime-ktx"))
    api("androidx.fragment:fragment-ktx:1.2.4")
    api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0")
    api(KOTLIN_STDLIB)
    androidTestImplementation(project(":fragment:fragment-testing"))
    androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
    androidTestImplementation(ANDROIDX_TEST_CORE)
    androidTestImplementation(ANDROIDX_TEST_RUNNER)
    androidTestImplementation(ANDROIDX_TEST_RULES)
    androidTestImplementation(ESPRESSO_CORE)
    androidTestImplementation(TRUTH)
    androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy)
    androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
    androidTestImplementation(project(":internal-testutils-runtime"))
    androidTestImplementation(project(":internal-testutils-navigation"))
}
androidx {
    name = "Android Navigation Fragment Kotlin Extensions"
    publish = Publish.SNAPSHOT_AND_RELEASE
    mavenGroup = LibraryGroups.NAVIGATION
    inceptionYear = "2018"
    description = "Android Navigation-Fragment-Ktx"
}

从这个文件中我们可以看到该库依赖的其他库,将该库代码下载下来准备修改时,要注意合并这些依赖,或者完整的下载该库源码,以项目依赖的形式修改

索引到该文件的上一级,点击tgz打包进行下载,此时我们就有了该库的源码,很容易重建该module项目,从而对其进行修改和使用。如果修改的好,可以以此为基础创建上传自己的lib库