apk安装时so库存放路径

apk和so库的安装目录

    <div class="article_manage clearfix">
    <div class="article_r">
        <span class="link_postdate">2015-03-24 17:00</span>
        <span class="link_view" title="阅读次数">2366人阅读</span>
        <span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0)</span>
        <span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('apk%e5%92%8cso%e5%ba%93%e7%9a%84%e5%ae%89%e8%a3%85%e7%9b%ae%e5%bd%95','44593885');return false;" title="收藏">收藏</a></span>
         <span class="link_report"> <a href="#report" onclick="javascript:report(44593885,2);return false;" title="举报">举报</a></span>

    </div>
</div>    <style type="text/css">        
        .embody{
            padding:10px 10px 10px;
            margin:0 -20px;
            border-bottom:solid 1px #ededed;                
        }
        .embody_b{
            margin:0 ;
            padding:10px 0;
        }
        .embody .embody_t,.embody .embody_c{
            display: inline-block;
            margin-right:10px;
        }
        .embody_t{
            font-size: 12px;
            color:#999;
        }
        .embody_c{
            font-size: 12px;
        }
        .embody_c img,.embody_c em{
            display: inline-block;
            vertical-align: middle;               
        }
         .embody_c img{               
            width:30px;
            height:30px;
        }
        .embody_c em{
            margin: 0 20px 0 10px;
            color:#333;
            font-style: normal;
        }
</style>
<script type="text/javascript">
    $(function () {
        try
        {
            var lib = eval("("+$("#lib").attr("value")+")");
            var html = "";
            if (lib.err == 0) {
                $.each(lib.data, function (i) {
                    var obj = lib.data[i];
                    //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                    html += ' <a href="' + obj.url + '" target="_blank">';
                    html += ' <img src="' + obj.logo + '">';
                    html += ' <em><b>' + obj.name + '</b></em>';
                    html += ' </a>';
                });
                if (html != "") {
                    setTimeout(function () {
                        $("#lib").html(html);                      
                        $("#embody").show();
                    }, 100);
                }
            }      
        } catch (err)
        { }

    });
</script>
  <div class="category clearfix">
    <div class="category_l">
       <img src="http://static.blog.csdn.net/images/category_icon.jpg">
        <span>分类:</span>
    </div>
    <div class="category_r">
                <label onclick="GetCategoryArticles('1543467','yhtppp','top','44593885');">
                    <span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">android<em>(31)</em></span>
                  <img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
                  <img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
                    <div class="subItem">
                        <div class="subItem_t"><a href="http://blog.csdn.net/yhtppp/article/category/1543467" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
                        <ul class="subItem_l" id="top_1543467">                            
                        </ul>
                    </div>
                </label>                    
    </div>
</div>

Android 4.4.2

1、

/data/system/packages.xml     记录了apk安装的相关信息,包括包名、位置等,比如:

    <package name=”com.android.systemui” codePath=”/system/app/SystemUI.apk” nativeLibraryPath=”/data/app-lib/SystemUI” flags=”4734477” ft=”14bdce1c6d8” it=”14b8c5b61b0” ut=”14bdce1c6d8” version=”19” userId=”10077”>
        <sigs count=”1”>
            <cert index=”0” />
        </sigs>
        <signing-keyset identifier=”1” />
        <signing-keyset identifier=”5” />
    </package>


2、第三方apk,比如使用adb install安装的
/data/app         第三方apk安装位置,比如:/data/app/com.youku.phone-1.apk
/data/app-lib    第三方apk的so库安装位置,比如:/data/app-lib/com.youhu.phone-1/xxxxx.so


3、系统apk
/system/app      系统apk安装位置,比如:/system/app/SystemUI.apk
                                        /system/app/SystemUI.odex
                                        /system/app/TelephonyProvider.apk
                                        /system/app/TelephonyProvider.odex
                                        /system/app/Stk.apk
                                        /system/app/Stk.odex
                                        
/system/priv-app   系统某些apk安装位置,比如:/system/delapp/InCallUI.apk
                                            /system/delapp/InCallUI.odex
                                            /system/delapp/Keyguard.apk
                                            /system/delapp/Keyguard.odex
                                            /system/delapp/Settings.apk
                                            /system/delapp/Settings.odex
                                            /system/delapp/Shell.apk
                                            /system/delapp/Shell.odex
                                            /system/delapp/TeleService.apk
                                            /system/delapp/TeleService.odex
                                            /system/delapp/Browser.apk
                                            /system/delapp/Browser.odex
                                            /system/delapp/Email.apk
                                            /system/delapp/Email.odex

/system/lib      系统apk的so库安装位置,也包括系统某些so库,比如:/system/lib/libril.so
                                                                  /system/lib/libreference-ril.so
                                                                  /system/lib/libssl.so
                                                                  /system/lib/libsqlite.so
                                                                  /system/lib/libsqlite3.so
                                                                  /system/lib/libstdc++.so


4、

/data/data/     存放apk运行时的数据,包括数据库、文件等,比如:/data/data/com.android.incallui
                                                               /data/data/com.android.systemui
                                                               /data/data/com.youku.phone
                                                               /data/data/com.android.settings
                                                               /data/data/com.android.providers.settings
                                                               /data/data/com.android.stk


5、

/data/dalvik-cache/     缓存apk对应的dex文件,比如:/data/dalvik-cache/system@app@TelephonyProvider.apk@classes.dex
                                                    /data/dalvik-cache/system@framework@telephony-common.jar@classes.dex
                                                    /data/dalvik-cache/system@app@SystemUI.apk@classes.dex
                                                    /data/dalvik-cache/system@app@Stk.apk@classes.dex
                                                    /data/dalvik-cache/system@priv-app@InCallUI.apk@classes.dex


6、android源码中,/system/core/init/Init.c 加载的配置文件 /system/core/rootdir/init.rc 中,

# setup the global environment
    export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
    export LD_LIBRARY_PATH /vendor/lib:/system/lib
    export ANDROID_BOOTLOGO 1
    export ANDROID_ROOT /system
    export ANDROID_ASSETS /system/app
    export ANDROID_DATA /data

    # give system access to wpa_supplicant.conf for backup and restore
    mkdir /data/misc/wifi 0770 wifi wifi
    chmod 0660 /data/misc/wifi/wpa_supplicant.conf    明文保存wifi密码
    mkdir /data/local 0771 shell shell
    mkdir /data/local/tmp 0771 shell shell
    mkdir /data/data 0771 system system    如果没有会创建
    mkdir /data/app-private 0771 system system
    mkdir /data/app 0771 system system
    mkdir /data/property 0700 root root

    # create dalvik-cache, so as to enforce our permissions
    mkdir /data/dalvik-cache 0771 system system

参考:深入理解android卷1 第3章 深入理解init


document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
    <div id="digg" articleid="44593885">
        <dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">

             <dt>顶</dt>
            <dd>0</dd>
        </dl>


        <dl id="btnBury" class="digg digg_enable" onclick="btnburya();">

              <dt>踩</dt>
            <dd>0</dd>               
        </dl>

    </div>
 <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);">&nbsp;</a>   </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);">&nbsp;</a></div>
<script type="text/javascript">
    function btndigga() {
        $(".tracking-ad[data-mod='popu_222'] a").click();
    }
    function btnburya() {
        $(".tracking-ad[data-mod='popu_223'] a").click();
    }
        </script>


<think>嗯,用户现在遇到了在Android上使用OpenCV的VideoCapture.open方法报错的问题。错误信息显示找不到目录,具体路径是/data/app/.../base.apk!/lib/arm64-v8a。我需要仔细分析这个问题可能的原因,然后给出解决方案。 首先,用户提到的错误信息提到了无法打开目录,路径中包含base.apk和arm64-v8a。这看起来和Android应用的结构有关。APK文件实际上是一个压缩包,里面的lib目录存了不同架构的本地库。当应用安装,系统会根据设备的CPU架构解压对应的库到/data/app/.../lib/目录下。但错误中的路径是base.apk内部的路径,这说明OpenCV可能在尝试访问APK文件内部的路径,而不是解压后的本地库路径。 接下来,我需要考虑用户可能在使用VideoCapture来打开视频文件,但错误发生在初始化阶段,而不是视频文件本身的问题。错误出现在glob_rec函数,这可能是在加载依赖库或查找某些资源发生的。这候需要检查是否正确加载了OpenCV的本地库,或者是否有库的路径配置错误。 可能的原因有几个: 1. **NDK配置问题**:用户可能在build.gradle中配置了多个ABI(比如armeabi-v7a和arm64-v8a),但OpenCV的库没有正确包含所有需要的架构,导致在运行找不到对应的库。 2. **动态链接库加载顺序**:Android系统在加载库可能会有顺序问题,如果依赖库没有被正确加载,可能导致初始化失败。 3. **权限问题**:虽然用户提到的是打开视频,但错误信息指向的是库路径,所以可能和文件权限无关,但也不能完全排除。不过更可能的还是库加载的问题。 然后,我需要回忆OpenCV在Android中的使用方式。通常需要将OpenCV的本地库(.so文件在项目的jniLibs目录下对应的ABI子目录中。如果用户使用了动态加载的方式,比如通过OpenCV Manager,可能需要检查是否初始化正确。但现在用户已经将OpenCV静态链接到应用中,所以问题可能出在库的打包或加载顺序上。 用户提供的错误路径显示是在arm64-v8a架构下,所以需要确认该架构的库是否被正确打包到APK中。如果APK中缺少对应的库,或者库没有被正确解压到安装目录,就会导致加载失败。 解决方案可能包括: - 检查NDK的ABI配置,确保只包含所需的架构,避免冲突。 - 在加载OpenCV库之前,先加载依赖的其他库,如libopencv_java4.so。 - 确保所有需要的本地库都被正确打包到APK中,并且路径正确。 另外,用户可能在使用VideoCapture尝试打开网络摄像头或视频文件,但错误似乎和视频源无关,而是和库的加载有关。因此,需要优先解决库加载的问题。 总结下来,可能的解决步骤是: 1. 检查build.gradle中的ndk配置,过滤掉不需要的ABI。 2. 确保正确加载OpenCV的本地库,注意加载顺序。 3. 确认APK中包含了正确的库文件,并且路径没有错误。 4. 如果使用多个库,确保它们的ABI兼容性一致。 此外,用户可能需要检查是否在应用启动正确初始化了OpenCV,比如使用OpenCVLoader.initDebug(),并在加载库之前调用System.loadLibrary()。 最后,建议用户检查APK文件的内容,确认lib/arm64-v8a目录下是否存在OpenCV的.so文件,如果没有,说明打包过程中出现了问题,需要调整构建配置。</think>这个问题通常与OpenCV在Android平台的本地库加载机制有关。我将从错误现象到解决方案分步骤说明: --- ### **错误原因分析** 错误信息中关键部分: ```plaintext could not open directory: /data/app/.../base.apk!/lib/arm64-v8a ``` 表示OpenCV在尝试访问APK内的本地库路径失败。核心问题在于: 1. **ABI不匹配**:APK中缺少对应CPU架构的OpenCV本地库(如arm64-v8a) 2. **库加载顺序**:动态库依赖未正确初始化 3. **打包配置问题**:Gradle未正确打包.so文件 --- ### **解决方案步骤** #### **1. 检查NDK配置** 在模块的 `build.gradle` 中 **显式指定ABI过滤**: ```groovy android { defaultConfig { ndk { // 只保留需要的ABI abiFilters 'armeabi-v7a', 'arm64-v8a' } } } ``` #### **2. 验证.so文件打包** 检查APK内的 `lib/arm64-v8a` 目录是否包含以下文件: ``` libopencv_java4.so libopencv_videoio_ffmpeg.so // 视频解码相关库 ``` *若缺失则需手动复制到项目 `src/main/jniLibs/arm64-v8a`* #### **3. 修改库加载顺序** 在Java代码中 **优先加载OpenCV本地库**: ```java static { // 先加载依赖库 System.loadLibrary("opencv_java4"); // 再加载其他库(如果有) } ``` #### **4. 初始化视频编解码器** 对于视频处理需额外加载FFmpeg库: ```java OpenCVLoader.initDebug(); VideoCapture capture = new VideoCapture(); if (!capture.open(videoPath)) { Log.e("TAG", "Failed to open video: " + capture.grab()); } ``` --- ### **验证流程** 1. **检查APK内容**: ```bash unzip -l your_app.apk | grep 'lib/arm64-v8a' ``` 输出应包含OpenCV相关.so文件 2. **运行ABI验证**: ```java Log.d("ABI", Build.SUPPORTED_ABIS[0]); // 查看设备首选ABI ``` 3. **最小化测试**: ```java // 测试基础OpenCV功能 Mat mat = new Mat(); Log.d("OpenCV", "Mat created: " + mat.empty()); ``` --- ### **补充说明** - **视频编解码依赖**:OpenCV的视频解码功能需要 `libopencv_videoio_ffmpeg.so`,需确保该库存在 - **ProGuard配置**:在proguard-rules.pro中添加保留规则: ```pro -keep class org.opencv.** { *; } -keep class org.opencv.videoio.** { *; } ``` --- 通过以上步骤可解决90%以上的OpenCV Android库加载问题。若仍有异常,建议通过 `adb logcat` 查看完整的加载日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值