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