Android编译Skia库

这篇具有很好参考价值的文章主要介绍了Android编译Skia库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android编译Skia库

本文档提供两种方法编译Skia库

  1. 使用aosp源码进行编译
  2. 使用skia源码进行编译

两种编译方法都可以编译,并且都可以使用在多个平台中,且可以使用在不同Android版本中

使用aosp源码编译

第一步是拿到aosp的源码.因为写这篇教程,使用的是msm8996的源码,因此,我就直接使用了.

注意:如果是app开发人员,可能无法拿到跟我一样的源码,则可以使用aosp源码.下面是aosp源码下载教程:
https://source.android.com/docs/setup/download/downloading
大部分情况下,可能无法下载,此时可以使用清华镜像站:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

拿到aosp之后,切换到一个比较熟悉的版本中,可以切换到跟我一样的Android 奥利奥版本

第二步进入项目根目录,运行:

. build/envsetup.sh
lunch xxx-debug
mmma external/skia

第三步拷贝out/target/product/xxx/system/lib/libskia.so 和 out/target/product/xxx/system/lib64/libskia.so到app中.

第四步修改对应的错误.

  1. 运行在Android 7.1 应该没啥问题
  2. 运行在Android 7.1 以上,会出现xxx.so库未找到的问题.出现这种问题,是因为libskia.so中会加载部分系统内部的so库.现提供两种修改办法
第一种 如果属于定制rom,则可以修改rom的情况下,可以将需要暴露的so库,放入public.libraries.txt文件中

第二种 如果无法修改rom,那么只能将对应的so静态编译进libskia.so中.具体方法如下:
1. 打开external/skia/Android.bp,找到shared_libs和static_libs.将shared_libs中的文件,一个一个添加到static_libs中
2. 举个例子如下:将libdng_sdk移动到static_libs中,然后,重新运行mmma external/skia
3. 部分动态库,无法移植到static_libs的解决办法:
    a. 如libicui18n放入到static_libs之后,编译会出错,大概错误如下:error: external/skia/Android.bp:3:1: dependency "libicui18n" of "libskia" missing variant:
    b. 上面错误的原因是,libicui18n并没有静态库
    c. 接下来就是,编译libicui18n的静态库
    d. 对应步骤如下
    e. 找到libicui18n的编译文件配置文件.使用find . -name "*.mk" -exec grep -rinH --color=auto "LOCAL_MODULE.*libicui18n" {} \;
    f. 本机结果如下:
./out/soong/Android-mini_emulator_x86_64.mk:79473:LOCAL_MODULE := libicui18n
./out/soong/Android-mini_emulator_x86_64.mk:79488:LOCAL_MODULE_STEM := libicui18n
./out/soong/Android-mini_emulator_x86_64.mk:79493:LOCAL_MODULE := libicui18n
./out/soong/Android-mini_emulator_x86_64.mk:79508:LOCAL_MODULE_STEM := libicui18n
./out/soong/Android-mini_emulator_x86_64.mk:79513:LOCAL_MODULE := libicui18n
./out/soong/Android-mini_emulator_x86_64.mk:79528:LOCAL_MODULE_STEM := libicui18n-host
./out/soong/Android-mini_emulator_x86_64.mk:79533:LOCAL_MODULE := libicui18n
./out/soong/Android-mini_emulator_x86_64.mk:79548:LOCAL_MODULE_STEM := libicui18n-host
./out/soong/Android-FindPiano.mk:79034:LOCAL_MODULE := libicui18n
./out/soong/Android-FindPiano.mk:79049:LOCAL_MODULE_STEM := libicui18n
./out/soong/Android-FindPiano.mk:79054:LOCAL_MODULE := libicui18n
./out/soong/Android-FindPiano.mk:79069:LOCAL_MODULE_STEM := libicui18n
./out/soong/Android-FindPiano.mk:79074:LOCAL_MODULE := libicui18n
./out/soong/Android-FindPiano.mk:79089:LOCAL_MODULE_STEM := libicui18n-host
./out/soong/Android-FindPiano.mk:79094:LOCAL_MODULE := libicui18n
./out/soong/Android-FindPiano.mk:79109:LOCAL_MODULE_STEM := libicui18n-host

   g. 打开./out/soong/Android-FindPiano.mk并定位到79034行.可以看到libicui18n的位置为:external/icu/icu4c/source/i18n
   h. 打开对应的编译配置文件,Android.bp或者Android.mk
   i. 添加对应的静态库编译配置,如下
diff --git a/external/icu/icu4c/source/i18n/Android.bp b/external/icu/icu4c/source/i18n/Android.bp
index ef84d97..4c46b16 100644
--- a/external/icu/icu4c/source/i18n/Android.bp
+++ b/external/icu/icu4c/source/i18n/Android.bp
@@ -251,3 +251,16 @@ cc_library_shared {
         "-lpthread",
     ],
 }
+
+cc_library_static {
+    name: "libicui18n_s",
+    vendor_available: true,
+    defaults: ["libicui18n_defaults"],
+    host_supported: true,
+    unique_host_soname: true,
+    shared_libs: ["libicuuc"],
+    host_ldlibs: [
+        "-lm",
+        "-lpthread",
+    ],
+}

  j. 注意,上面已经将静态库的名字改变,将libicui18n改成了libicui18n_s.因此在libskia的静态库中,应该写成libicui18n_s而不是libicui18n
  k. 经过一些列修改之后,skia的编译配置文件,变成如下
     shared_libs: [
         "libEGL",
         "libGLESv2",
-        "libdng_sdk",
-        "libexpat",
-        "libft2",
-        "libheif",
-        "libicui18n",
-        "libicuuc",
-        "libjpeg",
-        "liblog",
-        "libpiex",
-        "libpng",
         "libvulkan",
-        "libz",
-        "libcutils",
-        "libnativewindow",
+        "libnativewindow",  
     ],
     static_libs: [
         "libarect",
         "libsfntly",
         "libwebp-decode",
         "libwebp-encode",
+        "libdng_sdk",
+           "libjpeg",
+           "libpng",
+           "libcutils",
+           "libexpat",
+           "libz",
+           "liblog",
+        "libft2_s",
+        "libpiex_s",
+        "libbinary_parse",
+        "libimage_type_recognition",
+        "libtiff_directory",
+        "libicui18n_s",
+        "libicuuc_s",
+        "libicuuc_stubdata",
     ],
     qti_whole_static_libs: [
         "libqc-skia",
     ],
 }

   l. 从上面的文件可以看到,增加一些以前不存在的库,如libbinary_parse这是因为在编译libpiex时会用到,读者可以在piex的编译配置文件中,找到libbinary_parse的依赖关系
   m. 上述文件中的shared_libs中依然有四个库,并没有编译成静态库,是因为,留下来的四个库:libEGL,libGLESv2,libvulkan,libz属于标准ndk,可以直接加载,而不会出现,诸如:libandroid_runtime.so not found的错误
   n. 使用mmma external/skia再次编译,得到libskia.so.放入APP中,成功运行.

使用skia源码进行编译

第一步, 进入官网下载源码.源码位置
https://github.com/google/skia

第二步,切换到你想要编译的分支上,比如,这次我目标安卓版本是Android 8.1所以我切到了android/o-release分支

第三步,下载NDK,NDK有不同的版本,因此,要下载对应的版本,怎么查找对应的NDK版本呢? 根据时间.Android 8.1 释放的时间在2017年12月左右,因此NDK版本,差不多也在这个附近.

翻看NDK如下:

android skia,杂记,skia,Android skia,skia编译,skia编译错误,skia移植

可以看到NDK版本应该是r16b.如果不行再试试上下版本的NDK

第四步,开始编译

1. 第一步产生编译文件:bin/gn out/arm64 --args='ndk="ndk路径" target_cpu="arm64"'
2. 在--args中还可以使用的参数有:is_debug表示是否是debug编译 is_component_build表示生成静态库还是动态库.
3. 开始编译  sudo ninja -C out/arm64 -j 8 -v
4. 下面给出本机的运行命令
skia$ bin/gn gen out/arm64 --args='ndk="/media/wanbiao/disk1t/root/SDK/android-ndk-r18b" target_cpu="arm64" is_component_build=true is_debug=false'
skia$ sudo ninja -C out/arm64 -j 8 -v
5. 如果出现部分头文件缺失,则运行tools/install_dependencies.sh 安装相对应的依赖
6. 如要生成32位的库,则将上面命令中的64取掉即可
7. 如果出现编译不通过,大概率是因为NDK的版本不对,我在本机测试过从13到24这几个版本的NDK,都无法正确的编译,只有r16b可以正确编译.
8. 如果将对应的库,放入Android studio的工程之中,进行编译,报出了诸如:__end,__start之类的错误,是因为libskia.so使用的是r16b,而Android studio的工程使用的更高版本的NDK,解决办法就是:在编译libskia.so时,手动指定ld程序.例子如下:
skia$ bin/gn gen out/arm64 --args='ndk="/media/wanbiao/disk1t/root/SDK/android-ndk-r16b" target_cpu="arm64" is_component_build=true is_debug=false extra_ldflags=["-fuse-ld=gold"]'
可以看见,在最后,加入了extra_ldflags参数.
9. 再次重新编译,生成相应的动/静态库

第五步,因为本笔记,写于skia编译之后很久,部分错误处理,可能会忘记,因此,我将本次编译的关于skia的源码,一并上传.


发现CSDN无法上传大于1000MB的文件,因此将其传入百度网盘.
链接: https://pan.baidu.com/s/1ISZ62Pead577zWNbPWcSyg 提取码: 8888 复制这段内容后打开百度网盘手机App,操作更方便哦文章来源地址https://www.toymoban.com/news/detail-552111.html

到了这里,关于Android编译Skia库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译FFmpeg4.3.1 、x264并移植到Android

    1、前言 FFmpeg 既是一款音视频编解码工具,同时也是一组音视频编解码开发套件。 2、准备工作 系统:Linux NDK:android-ndk-r21b-linux-x86_64.zip FFmpeg:ffmpeg-snapshot.tar.bz2 x264:x264 3、下载NDK 在linux环境中,使用命令如下:   4、下载FFmpeg 5、下载x264 6、开始编译x264 build_x264_android-v7a

    2024年01月19日
    浏览(41)
  • android ndk一些编译链接错误及解决办法

    链接opencv库时报链接错误缺少libz库 解决,mediann是本人所编译库的名字 链接librknnrt.so时报 解决 使用的是aarch-linux的库,报错换成android版本的librknnrt.so即可 链接opencv库时报错缺少jnigraphics 解决 链接opencv库时报错确实mediandk 解决 链接opencv时报很多std的链接错误 解决 ndk版本太

    2024年02月09日
    浏览(49)
  • Android Studio编译旧的app代码错误及解决方法

    The option ‘android.injected.build.density’ is deprecated. It was removed in version 8.0 of the Android Gradle plugin. Density property injection from Android Studio has been removed. app/build.gradle apply plugin: ‘com.android.application’ 改成 plugins { id ‘com.android.application’ } Deprecated Gradle features were used in this build, making

    2024年02月07日
    浏览(45)
  • Android.bp 构建 FFmpeg 库:从搭建编译框架到处理编译错误的全过程

    本文基于 FFmpeg 5.1.4 版本,详细讲述了使用 Android.bp 构建 FFmpeg 库的过程,旨在简化 Android 源码中 FFmpeg 库的构建以及集成过程。 构建过程需使用 NDK 工具辅助,请参考该专栏之前文章:使用 NDK 编译 FFmpeg github 仓库:FFmpegDroidBuilder 以编译 libavutil、libavcodec、libavformat、libswres

    2024年03月18日
    浏览(55)
  • 使用Android studio,安卓手机编译安装yolov8部署ncnn,频繁出现编译错误

    从编译开始就开始出现错误,解决步骤: 1.降低graddle版本,7.2-bin  ---   降低为 6.1.1-all 2.仍旧有报错,jdk从17降为 jdk 13, 在setting配置里, 进入build,excution,deployment文件夹中,(是一个文件夹,名字长,不是三个) 进入build tools,再进入 Gradle,  如图所示, 勾选,选择

    2024年04月28日
    浏览(52)
  • Android Studio在导入项目后编译出现java版本错误解决方法

    打开新项目时出现一下错误: Unsupported Java,Your build is currently configured to use Java 17.0.9 and Gradle 5.6.4. 这说明使用的java版本过高,而 gradle5.6.4对应的是java8,最新安装的编译器java版本是17 解决方法是为项目配置低版本的JDK,这里选择jdk版本为1.8的,设置好路径(注意文件夹为空

    2024年03月21日
    浏览(73)
  • Android 编译错误:CreateProcess error=206, 文件名或扩展名太长。

    最近更新了Android Studio 之后Android studio 编译错误:CreateProcess error=206, 文件名或扩展名太长。 原因为 bin 文件的路径层级太多 解决方法1: 1. Android Studio - Run - Edit Configurations - Templates - Application - shorten command line: 选择 JAR manifest    -java -cp classpath.jar classname [args] (默认为user-lo

    2024年02月07日
    浏览(51)
  • 【错误记录】Android Studio 编译报错 ( Could not resolve com.android.tools.build:gradle:7.4.2. )

    在 Mac 中安装了 Android Studio , 首次创建应用运行时 , 报如下错误 : 报错信息中有提示 : Doesn’t say anything about its target Java version (required compatibility with Java 8) A problem occurred configuring root project ‘DataBinding’. Could not resolve all files for configuration ‘:classpath’. Could not resolve com.android.

    2024年02月08日
    浏览(64)
  • 【错误记录】Android 编译报错 ( The project uses Gradle version which is incompatible with Android Studio )

    报错信息 : 使用的 ijkplayer 版本是 0.8.8 版本的 , 这是 2018 年的版本 , 生成的 Android Studio 工程源码 也是 在 2018 年运行的 , 当时使用 的 Android Studio 版本 , Gradle 构建工具版本 , Android Gradle 插件版本 , 与当前差异很大 ; 上述 构建工具 , AS 开发环境 , AGP 插件 , 版本对应关系可以参

    2024年02月08日
    浏览(46)
  • 【错误记录】Android Studio 编译报错 ( Android Gradle plugin requires Java 11 to run. You are currently using )

    使用 最新版本的 Android Studio 创建应用 , 并执行 , 报如下错误 : 当前使用的 JDK 版本是 1.8 , 将 JDK 升级为 11 版本 ; 先在指定目录 , 安装 JDK 工具 ; 选择 \\\" 菜单栏 | File | Settings \\\" 选项 , 在 \\\" Build, Execution , Deployment | Build Tools | Gradle \\\" 选项中 , 设置 刚才 安装的 JDK 即可 ; 编译通过

    2024年02月10日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包