代码小贴士001

001. 为什么我的 adb 老是断开连接?

开着 Android Studio 连着手机,刷着 logcat,突然就出现:

read: unexpected EOF!

这时候拔插一下手机数据线又恢复了,但老这么拔插也不是办法。根本原因是手机 adb logcat 的缓冲区不够了,解决方法其实很简单,设大一些就可以了:

$ adb logcat -G 20M

查看现在缓冲区多大:

$ adb logcat -g

如果隔断时间被自动恢复了就再设置一次

002. 升级 Android Gradle Plugin 4 后编译不过

在 Android Gradle Plugin 4.0 之前,CMake 里通过 IMPORTED 链接预编译好的 so 文件,只有将这些 so 文件放在 jniLibs 目录里,才能打包到 APK 里,其他路径的 so 将会自动被忽略。

在 Android Gradle Plugin 4.0 之后,只要在 CMake 里 IMPORTED 的 so 都会自动打包到 APK 里。而如果这个 so 又刚好也在 jniLibs 目录里的话,将会出现如下错误:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > More than one file was found with OS independent path 'lib/armeabi-v7a/libprebuilt.so'

知道了原因后,解决就很简单了,对于在 CMake 中 IMPORTED 的 so:

  1. 如果 so 需要打包进 APK 里,把 so 放到 jniLibs 之外的目录,或者在 build.gradle 里设置 packFirst
android {
  ...
  packagingOptions {
    pickFirst "**/libprebuilt.so"
  }
}
  1. 如果 so 不需要打包进 APK 里,在 build.gradle 里设置 exclude
android {
  ...
  packagingOptions {
    exclude "**/libprebuilt.so"
  }
}

003. meson.build 文件是什么?

在 Github 上有些工程有 meson.build 文件,表示它使用到是 meson 构建系统。meson 是用 Python 写的构建系统,和 CMake 类似。meson 会生成对应系统的构建配置,比如:GNU/Linux 的 ninja,Windows 的 Visual Studio,MacOS 上的 Xcode。

使用 meson 构建的知名工程:QEMU, systemdsimde, 以及很多 GNOME 项目都支持里 meson。

简单几步编译使用 meson.build 的工程:

  1. 安装
$ pip install --user meson ninja

安装后按提示将 meson 所在路径加到 PATH 环境变量里。

  1. 编译 & 测试
$ cd /path/to/source/root
$ meson builddir && cd builddir
$ meson compile
$ meson test
微信扫一扫交流

作者:CoderZh
微信关注:hacker-thinking (程序员思考者)
本文出处:https://blog.coderzh.com/2021/06/05/code-tips-1/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。