android 依赖只编译不打包到apk中

本文介绍了不同依赖方式的区别及使用场景,重点讲解了如何通过特定配置在debug模式下使用而在release版本中排除某些库的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几种依赖方式

image.png

具体每个什么意思,大家谷歌一下就知道了,这里不在陈述

区别和使用

implementation和api是取代之前的compile的,其中api和compile是一样的效果,implementation有所不同,通过implementation依赖的库只能自己库本身访问,举个例子,A依赖B,B依赖C,如果B依赖C是使用的implementation依赖,那么在A中是访问不到C中的方法的,如果需要访问,请使用api或compile依赖

开发中的注意事项

在实际开发中有些依赖在debug的时候需要参与编译并使用,而打包的时候不想打包到apk中

1 怎样查看是否打进apk中了

Stetho是Facebook推出的一款使用Chrome来调试Android Application的工具,就拿这个库来实验吧,首先采取正常的依赖方式打包apk,然后将apk拖进studio中,然后双击classes.dex

image.png

可以看到Facebook的包名,然后库的大小为200多k,实际开发中打包的时候基本是不需要的,所以能少200k就少点吧
image.png

2 解决方法

  1. 在gradle里面同时使用releaseCompileOnly和debugCompile即可

image.png

  1. 在代码中需要进行debug模式判断,只有debug模式才会初始化Stetho或者只有在debug模式才会使用Stetho
    if (BuildConfig.DEBUG) {
        //初始化Facebook网络监测
        Stetho.initializeWithDefaults(this);
    }

在Okhttp里面添加拦截器

image.png

前后对比

通过打包前后对比发现能减少很多k,呵呵能小点就小点,毕竟这只是一个测试库,以后还有更多的测试库都可以用这个方法
image.png

总结

如果单纯的用debugCompile一种依赖方式不能解决这个问题,因为在debug模式需要用到库,那代码中就会出现相应的导包和初始化代码,代码可以用debug标志位进行判断,但是导包语句就没办法通过编译了,所以在结合releaseCompileOnly就可以解决打包apk的时候报错问题了,只要编译器的时候没有错误就没问题了,因为Stetho的初始化在release版本不会执行,整体就是这样,思路很简单就是根据不同的依赖类型和不同的编译模式来进行选择性的添加依赖.

当然这几种依赖也是有优先级的,目前来看同一个依赖如果用Compile,releaseCompileOnly,debugCompile同时修饰一个依赖的话,最后以Compile为主,大概就是这样,更深的没有研究,有什么问题希望打家一起探讨.

### 如何让Android动态库参与编译在最终APK打包 在Gradle配置文件 `build.gradle` 中,可以通过特定的方式实现动态库(如 `.so` 文件或其他资源)仅参与编译打包到最终的 APK 中。以下是具体的解决方案: #### 使用 `packagingOptions` 排除指定文件 通过设置 `packagingOptions.exclude` 来排除需要打包的动态库文件。例如,假设有一个名为 `libexample.so` 的动态库文件希望被包含在最终的 APK 中,则可以在 `build.gradle` 文件中添加以下代码[^1]: ```gradle android { packagingOptions { exclude 'lib/armeabi-v7a/libexample.so' exclude 'lib/x86/libexample.so' } } ``` 上述代码的作用是告诉 Gradle 构建工具,在打包过程中忽略掉路径下的指定 `.so` 文件。 #### 使用 `sourceSets` 自定义源码目录并控制资源范围 另一种方法是利用 `sourceSets` 配置来自定义源码和资源目录,并明确指出哪些部分应该参与编译会进入最终产物。例如[^2]: ```gradle android { sourceSets { main { jniLibs.srcDirs = [] // 清空默认的jniLibs目录 } } tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask -> pkgTask.jniFolders = new HashSet<File>() // 移除所有JNI文件夹 } } ``` 此段脚本首先清除了默认用于存储本地共享对象 (`.so`) 文件的位置 (`jniLibs.srcDirs`) ,接着进一步确保没有任何 JNI 库会被加入到最后的应用程序包里。 #### 处理依赖冲突的情况 当遇到第三方库之间存在版本差异引发的冲突时,可以借助强制解析某个具体版本的方法解决这个问题。比如下面的例子展示了如何固定支持库的版本为 28.0.0 [^3]: ```gradle configurations.all { resolutionStrategy.force 'com.android.support:support-v4:28.0.0' } ``` 另外还可以单独针对某些模块应用排除策略来规避必要的组件加载进来影响整体大小或者功能正常运作 [^4]: ```gradle dependencies { implementation('some.library') { exclude group: 'org.unwanted', module: 'unneeded-feature' } } ``` 以上就是在 Android 开发环境下关于如何使动态链接库只经历编译阶段却无需实际嵌入至分发版中的几种常见技巧介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值