显示标签为“Android Studio”的博文。显示所有博文
显示标签为“Android Studio”的博文。显示所有博文

2022年3月25日星期五

Android项目使用预编译库

 

APP使用预编译库

默认路径

预编译库中的so放到src/main/jniLibs/<ABI>下,AndroidStudio打包时会自动将预编译的so文件打包进生成的产物APK/AAR

.
├── build.gradle
└── src
    ├── main
    │   ├── AndroidManifest.xml
    │   ├── java
    │   └── jniLibs
    │       ├── arm64-v8a
    │       │   └── libprebuilt.so
    │       └── armeabi-v7a
    │           └── libprebuilt.so
    

自定义路径

预编译库中的so放置到任意路径:

.
├── build.gradle
├── libs
│   ├── arm64-v8a
│   │   └── libprebuilt.so
│   └── armeabi-v7a
│       └── libprebuilt.so
└── src
    ├── main
    │   ├── AndroidManifest.xml
    │   └── java
    

配置如下:

android {
    sourceSets {
main {
jniLibs.srcDirs 'libs'
}
}
}

NDK引用预编译库

NDK项目中也可以引用预编译库。

这里注意不要将预编译库放到src/main/jniLibs/<ABI>下,或者使用android.sourceSets.main.jniLibs.srcDirs来配置预编译库路径;而是在Android.mdCMakeLists.txt中配置

ndk-build

TODO

cmake

下面是一个简单项目:

.
├── mylib
│   ├── build.gradle
│   └── src
│       └── main
│           └── cpp
│               ├── CMakeLists.txt
│               ├── include
│               │   └── my_lib.h
│               └── my_lib.cpp
└── prebuilt
    ├── include
    │   └── prebuilt.h
    └── lib
        ├── arm64-v8a
        │   └── libprebuilt.so
        └── armeabi-v7a
            └── libprebuilt.so

配置如下:

cmake_minimum_required(VERSION 3.10.2)

# prebuilt lib root dir
set(PREBUILT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../prebuilt)
set(PREBUILT_LIB_DIR ${PREBUILT_DIR}/lib/${ANDROID_ABI})

# libprebuilt.so
add_library(prebuilt STATIC IMPORTED)
set_target_properties(prebuilt PROPERTIES IMPORTED_LOCATION
        ${PREBUILT_LIB_DIR}/libprebuilt.so)

# my_lib project
project("my_lib")

# add source files to my_lib project
add_library(
        my_lib
        SHARED
        my_lib.cpp)

# hide symobols
set_target_properties(my_lib PROPERTIES CXX_VISIBILITY_PRESET hidden)

# find android log library
find_library(
        log-lib
        log)

# include dirs
target_include_directories(
        my_lib
        PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include # include dir of my_lib
        ${PREBUILT_DIR}/include # include dir of prebuilt library
)

# link prebuilt library & android log library to my_lib
target_link_libraries(
        my_lib

        prebuilt

        ${log-lib})

如上,在my_lib项目中引入了libprebuilt.so库,在打包时libprebuilt.so会自动打包到生成的APK/AAR

NDK禁止打包预编译库

譬如我们创建的Android library项目引用了三方库libprebuilt.so,但是我们希望在生成的产物中不包含libprebuilt.so文件,单独提供该文件或由接入方自己导入这个库文件,可以在打包时排除这个文件:

plugins {
id 'com.android.library'
}

android {
defaultConfig {
externalNativeBuild {
cmake {
cppFlags ''
}
}
}

externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
version '3.18.1'
}
}
packagingOptions {
jniLibs.excludes += '**/libprebuilt.so' // 打包时排除libprebuilt.so文件
}
}

参考

JniLibsPackagingOptions

2021年12月6日星期一

Android Studio Arctic Fox中-Xbootclasspath/p选项失效问题

 

问题描述

新项目中需要使用新的类覆盖系统framework里的类,在Android 4.1.3版本中配置如下:

allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:<path to my framework jar file>')
        }
    }
}

在下载最新版本Android Studio Arctic Fox | 2020.3.1 Patch 3后,运行报错,新类里的方法、变量都无法识别,新增的类也无法识别,以上配置已失效

问题原因

网上搜索,发现是java 9版本中移除了java -Xbootclasspath-Xbootclasspath/p选项:https://www.oracle.com/java/technologies/javase/9-relnotes.html,建议使用JEP 261中描述的--patch-module选项。

然而无法找到如何在Android Studio中配置--patch-module选项的方法。

解决方法

目前自己摸索加网上搜索找到了两种方法:

降级jdk

Android Studio Arctic Fox | 2020.3.1 Patch 3默认使用了内置的jdk11,手动配置选择使用旧版本的jdk1.8可以解决问题

这个方案有局限性,编译用的jdk被限制在jdk1.8及以下版本

使用bootstrapClasspath选项

https://blog.csdn.net/zou249014591/article/details/109752786这篇博文中介绍了如下方案:

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        Set<File> fileSet = options.bootstrapClasspath.getFiles()
        List<File> newFileList =  new ArrayList<>();
        newFileList.add(new File("<path to my framework jar file>""))
        newFileList.addAll(fileSet)
        options.bootstrapClasspath = files(
                newFileList.toArray()
        )
    }
}

同样解决问题,这个方案使用jdk1.8jdk11都可以编译

--patch-module选项

官方建议采用--patch-module选项来替换-Xbootclasspath/p选项,目前还没研究出来怎么配置

TODO

参考

-Xbootclasspath/p is no longer a supported option

JDK 9 Release Notes

android编译 配置-Xbootclasspath/p优先级无效(AndroidStudio升级到4.2.2后失效,或者jenkins 多模块依赖不同framework.jar导致失效)

2021年11月3日星期三

手动安装IntelliJ IDEA及Android Studio插件

下载

IntelliJ IDEAAndroid Studio的插件可以在官网https://plugins.jetbrains.com/下载

譬如Kotlin插件,打开https://plugins.jetbrains.com/plugin/6954-kotlin/versions,在插件版本列表的头部,选择插件兼容的IDE(Android StudioIntelliJ Idea Ultimate等),然后在列表里找到和你安装的IDE版本匹配的插件下载

譬如我的Android Studio Bumblebee | 2021.1.1 Patch3,其构建ID为Build #AI-211.7628.21.2111.8309675,匹配的最新Kotlin插件版本号为211-1.6.21-release-334-AS7442.40,这个插件对应的IDE的版本号为211.7442—211.*,表示兼容从211.7442版本开始到所有后续211版本

插件也可以从插件开发者提供的下载地址下载

安装

一般插件下载到本地为zip压缩包,解压到本地

譬如上面的Kotlin插件解压到本地是一个名称为Kotlin的目录:

Kotlin
|____kotlinc
|____lib

找到IDE的插件目录,将解压的文件夹移动到插件目录:

# macOS
/Users/<username>/Library/Application Support/Google/AndroidStudio<version>/plugins/

# Windows 10
C:\Users\<username>\AppData\Roaming\Google\AndroidStudio<version>/plugins

# Linux
~/.local/share/Google/AndroidStudio<version>/

重启IDE即可

参看

Directories used by the IDE to store settings, caches, plugins and logs

Configure Android Studio#Find your configuration files

Android logcat

Log等级 Android log 等级在 android/log.h 中定义如下: typedef   enum   android_LogPriority {    /** For internal use only. */ ANDROID_LOG_UNKNOWN =...