缺少创建新 AS 项目并在安装后在我的设备上填充 lib 文件夹的步骤
Missing step to create a new AS project and get a lib folder populated on my device upon installation
目标
我希望我的 APK 中存在的库在我安装 APK 时可以从固定位置在我的设备上使用。
我根据我现有的项目打开了another question about this issue。这一次,我从头开始了一个全新的项目,以减少未知数并使我的问题更容易解决。
我遵循的步骤
使用 Android Studio 4.0.1,我执行以下操作:
开始新的 Android Studio 项目
Select 本机 C++
将项目名称设置为测试
Select Java 作为语言
使用默认工具链
构建 -> 制作项目
在项目视图下,我确认我的 app-debug.apk
有一个包含几个子目录的 lib
文件夹,每个子目录至少包含为此项目构建的 libnative-lib.so
默认 CMakeLists.txt 规则。
我希望在安装 APK 时可以从我的设备访问这个 .so(我有一个更复杂的项目,我在其中创建了 .so 以便我希望从 APK 外部访问)。
但是,从我的项目文件夹中,当我 运行:
c:\Users\xxx\AndroidStudioProjects\test>adb install app\build\outputs\apk\debug\app-debug.apk
Performing Streamed Install
Success
c:\Users\xxx\AndroidStudioProjects\test>adb shell ls /data/data/com.example.test
cache
code_cache
我尝试的其他更改
None 以下进一步更改使我可以在 /data/data/com.example.test
下查看其他文件
添加 android.bundle.enableUncompressedNativeLibs=false
到 gradle.properties
已添加
android {
...
sourceSets.main {
jniLibs.srcDirs = ['libs']
jni.srcDirs = []
}
到build.gradle
不要对此做任何改变。
已将 set(distribution_DIR ${CMAKE_SOURCE_DIR}/libs)
添加到 CMakeLists.txt
原生库没有放在 /data/data/your.app
中,而是放在 /data/app/your.aapp-<key-hash>==/lib/<ABI>
中,例如在我的目标上:
hikey960:/ # cd /data/app/com.example.dlopen-6BSPeAN9VvjFlCxIzLHX9A\=\=/lib/arm64
hikey960:/data/app/com.example.dlopen-6BSPeAN9VvjFlCxIzLHX9A==/lib/arm64 # ls -als
total 1352
4 drwxr-xr-x 2 system system 4096 2020-11-06 12:43 .
4 drwxr-xr-x 3 system system 4096 2020-11-06 12:43 ..
1044 -rwxr-xr-x 1 system system 1067256 1981-01-01 01:01 libnative-lib.so
300 -rwxr-xr-x 1 system system 305360 1981-01-01 01:01 libplugin.so
此外,默认情况下本机库已存档且无法访问,要提取它们,需要在 AndroidManifest.xml
中设置 android:extractNativeLibs="true"
(例如此处:https://github.com/nkh-lab/ndk-dlopen/blob/master/dlopen/app/src/main/AndroidManifest.xml)。
目标
我希望我的 APK 中存在的库在我安装 APK 时可以从固定位置在我的设备上使用。
我根据我现有的项目打开了another question about this issue。这一次,我从头开始了一个全新的项目,以减少未知数并使我的问题更容易解决。
我遵循的步骤
使用 Android Studio 4.0.1,我执行以下操作:
开始新的 Android Studio 项目
Select 本机 C++
将项目名称设置为测试
Select Java 作为语言
使用默认工具链
构建 -> 制作项目
在项目视图下,我确认我的 app-debug.apk
有一个包含几个子目录的 lib
文件夹,每个子目录至少包含为此项目构建的 libnative-lib.so
默认 CMakeLists.txt 规则。
我希望在安装 APK 时可以从我的设备访问这个 .so(我有一个更复杂的项目,我在其中创建了 .so 以便我希望从 APK 外部访问)。
但是,从我的项目文件夹中,当我 运行:
c:\Users\xxx\AndroidStudioProjects\test>adb install app\build\outputs\apk\debug\app-debug.apk
Performing Streamed Install
Success
c:\Users\xxx\AndroidStudioProjects\test>adb shell ls /data/data/com.example.test
cache
code_cache
我尝试的其他更改
None 以下进一步更改使我可以在 /data/data/com.example.test
添加
android.bundle.enableUncompressedNativeLibs=false
到gradle.properties
已添加
android { ... sourceSets.main { jniLibs.srcDirs = ['libs'] jni.srcDirs = [] }
到
build.gradle
不要对此做任何改变。已将
set(distribution_DIR ${CMAKE_SOURCE_DIR}/libs)
添加到CMakeLists.txt
原生库没有放在 /data/data/your.app
中,而是放在 /data/app/your.aapp-<key-hash>==/lib/<ABI>
中,例如在我的目标上:
hikey960:/ # cd /data/app/com.example.dlopen-6BSPeAN9VvjFlCxIzLHX9A\=\=/lib/arm64
hikey960:/data/app/com.example.dlopen-6BSPeAN9VvjFlCxIzLHX9A==/lib/arm64 # ls -als
total 1352
4 drwxr-xr-x 2 system system 4096 2020-11-06 12:43 .
4 drwxr-xr-x 3 system system 4096 2020-11-06 12:43 ..
1044 -rwxr-xr-x 1 system system 1067256 1981-01-01 01:01 libnative-lib.so
300 -rwxr-xr-x 1 system system 305360 1981-01-01 01:01 libplugin.so
此外,默认情况下本机库已存档且无法访问,要提取它们,需要在 AndroidManifest.xml
中设置 android:extractNativeLibs="true"
(例如此处:https://github.com/nkh-lab/ndk-dlopen/blob/master/dlopen/app/src/main/AndroidManifest.xml)。