首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安装APK时缺少lib文件夹

安装APK时缺少lib文件夹
EN

Stack Overflow用户
提问于 2020-12-22 11:15:44
回答 1查看 2.5K关注 0票数 2

我想知道如何构建我的APK,以便在安装APK时在/data/data/<package name>/lib下安装/复制我的库。

  • 我正在使用Android 4.0.1
  • 我构建一个APK,并确认当我提取它时,我有一个包含我的jni库的lib/arm64-v8a文件夹。
  • 我希望在我安装我的APK之后,在同一个设备上的一些其他应用程序可以访问我在lib/arm64-v8a中拥有的库。/data/data/<package name>文件夹似乎是正确的位置,因此我的问题;如果有另一种方法使我的库在设备上访问,我是开放的。
  • 我基于android.bundle.enableUncompressedNativeLibs=false在我的gradle.properties文件中设置了这一讨论,尽管我没有看到使用它时使用true或false的任何效果。
  • 我在我的清单中设置了android:extractNativeLibs="true"

但是,当我安装apk时,设备上的/data/data/<package name>/文件夹只包含一个cachecode_cache文件夹,这两个文件夹都是空的。

我确实在/data/app/下面看到了一个包含库的文件夹,但是它们包含了每次安装APK时随机设置的字符串:

代码语言:javascript
运行
复制
/data/app/~~sFE8-eNknFAkhKJ-1S03lg==/<package name>-rsDLNgpi4vult7yVBrPNOQ==/
   base.apk
   lib/arm64/
       <my .so in there>

这些随机字符串阻止我从任何其他应用程序可靠地访问我的库。(如果有一种方法不将这些随机字符串作为名称的一部分,并且/data/app是我的库与其他应用程序共享的推荐位置,那么我对另一种方法感兴趣。)

我还安装了其他预构建的APK,使用这些程序,我确实看到了/data/data/<package name>/lib下的库,这是我想要的。对我来说,这表明我的问题是如何用AS 4.0.1构建我的APK,而不是我的设备,它的Android版本,或者我如何安装APK。

这是我的分级文件:

代码语言:javascript
运行
复制
import java.util.regex.Matcher
import java.util.regex.Pattern

apply plugin: 'com.android.application'

android {


    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }

    sourceSets.main {
        jniLibs.srcDirs = ['libs']
        jni.srcDirs = []
    }

    defaultConfig {
        applicationId "com.example.myexample"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                version "3.17.0"
                cppFlags ""
                arguments "-DANDROID_STL=c++_shared"
            }
        }
        ndk {
            moduleName "myexample"
            abiFilter "arm64-v8a"
            ldLibs "log"
        }
        packagingOptions {
            exclude "lib/arm64-v8a/libassets.so"
        }

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            version "3.17.0"
            path "src/main/cpp/CMakeLists.txt"
            // There can be only one CMAKE per project: https://developer.android.com/studio/projects/gradle-external-native-builds
        }
    }
}


task copyFiles(type: Copy) {
    description = 'Testing a manual copy operation (confirmed it works)...'
    from file("../dsp/external/ship/libmyexample_skel.so")
    into file("$buildDir/res/raw/")
}

project.afterEvaluate {
    preBuild.dependsOn copyFiles
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

}

我还尝试过其他一些方法:我手动创建了一个src/main/jniLibs.arm64-v8a文件夹,其中放置了一个.so。当我解压缩它时,这个.so会出现在my中,但是我的/data/data/<package name>/文件夹没有库。

EN

回答 1

Stack Overflow用户

发布于 2020-12-30 10:49:43

我认为您需要添加这段代码来在适当的文件夹中添加lib,比如/data/data/<package name>/lib

将此添加到app的build.gradle文件中android{}标记中

代码语言:javascript
运行
复制
sourceSets.main {
    jniLibs.srcDirs = ['libs']
    jni.srcDirs = []
}

这是到CMakeList.txt文件

代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 3.4.1)


find_library( # Sets the name of the path variable.
        log-lib
        log)

set(distribution_DIR ${CMAKE_SOURCE_DIR}/libs)


add_library(yourLibName
        SHARED
        ...//list of your c/c++ files here from jni folder
)

target_link_libraries(yourLibName ${log-lib})

根据developer.android.com

注意:在对Gradle配置进行更改时,请单击工具栏中的Sync确保应用您的更改。此外,在您已经将CMake或ndk脚本文件链接到Gradle之后对其进行更改时,您应该通过从菜单栏中选择Build > Refresh链接的C++项目来同步Android和您的更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65407736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档