当前位置: 首页 > 知识库问答 >
问题:

安装APK时缺少库文件夹

房项禹
2023-03-14

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

>

  • 我正在使用Android Studio 4.0.1

    我构建了一个APK,并在提取它时确认我有一个lib/arm64-v8a文件夹,其中包含我的jni库。

    我希望在安装APK之后,同一设备上的一些其他应用程序可以访问我在lib/arm64-v8a中的库。/data/data/ 文件夹似乎是合适的位置,因此我的问题;如果有另一种方法可以让我的库在设备上访问,我是开放的。

    基于此讨论,我在gradle.properties文件中设置了android.bundle.enableuncompressednativelibs=false,尽管使用它与true或false一起使用没有任何效果。

    我在清单中设置了android:extractnativelibs=“true”

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

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

    /data/app/~~sFE8-eNknFAkhKJ-1S03lg==/<package name>-rsDLNgpi4vult7yVBrPNOQ==/
       base.apk
       lib/arm64/
           <my .so in there>
    

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

    我还安装了其他预构建的APK,使用这些APK,我可以看到/data/data/ /lib 下的库。对我来说,这表明我的问题与我如何用AS4.0.1构建我的APK有关,而不是与我的设备、它的Android版本或我如何安装APK有关。

    这是我的分级文件:

    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。当我解压缩时,That.so会出现在我的apk中,但是我的/data/data/ / 文件夹并没有lib。

  • 共有1个答案

    白翔
    2023-03-14

    我认为您需要添加这段代码,以便在适当的文件夹中添加库,如/data/data/ /lib

    将此添加到应用程序的build.gradle文件到Android{}标记中

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

    这是cmakelist.txt文件

    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配置进行更改时,请确保通过单击工具栏中的“同步项目”应用您的更改。此外,当您已经将CMake或ndk-build脚本文件链接到Gradle之后对其进行更改时,您应该通过从菜单栏中选择Build>Refresh linked C++Projects来将Android Studio与更改同步。

     类似资料:
    • 我想在我的项目的POM中引用一个jar(即vim25.jar,VMWare VSphere server management)。由于MavenRepository中没有引用此文件,我执行以下步骤: null mvn安装:install-file-dfile=./vim25.jar-dgroupid=manuallyinstalledjars-dartifactid=vim25-dversion=

    • 当我清理/安装maven时,我会得到以下错误: 1)org.apache.maven:maven-archiver:jar:2.0.1 尝试从项目网站手动下载该文件。 然后,使用命令进行安装:mvn install:install-file-dgroupid=org.codehaus.plexus-dartifactid=plexus-utils-dversion=1.0.4-dpackaging

    • 我最近重新安装了我的Windows。(Windows 10 64位) 我适当地安装了JDK 9。现在我正在尝试安装Android Studio 3,但Android SDK在安装中丢失了。当我打开程序时,安装向导出现并卡在下载包含此项目的组件上:https://dl.google.com/android/repository/android_m2repository_r47.zip 并一遍又一遍地

    • 我试图将我的应用程序安装到Android L Preview Intel Atom虚拟设备中,它失败了,错误: install_failed_no_matching_abis

    • 我是一个新的开发人员,我建立了一个应用程序Android和推到谷歌播放和出现错误时,我推一个APK文件。它需要5天,但没有修复这个错误。我使用visual studio 2017(xamarin)。 错误: 您上载的APK签名无效(了解有关签名的更多信息)。来自APKSigner的错误:错误:jar_sig_no_manifest:缺少META-INF/MANIFEST.mf