当前位置:首页 > 开发 > 移动开发 > 正文

Android so lib库远程http下载和动态注册

发表于: 2015-01-05   作者:aijuans   来源:转载   浏览:
摘要: 一、背景      在开发Android应用程序的实现,有时候需要引入第三方so lib库,但第三方so库比较大,例如开源第三方播放组件ffmpeg库, 如果直接打包的apk包里面, 整个应用程序会大很多.经过查阅资料和实验,发现通过远程下载so文件,然后再动态注册so文件时可行的。主要需要解决下载so文件存放位置以及文件读写权限问题。   二、主要

一、背景

 

   在开发Android应用程序的实现,有时候需要引入第三方so lib库,但第三方so库比较大,例如开源第三方播放组件ffmpeg库, 如果直接打包的apk包里面, 整个应用程序会大很多.经过查阅资料和实验,发现通过远程下载so文件,然后再动态注册so文件时可行的。主要需要解决下载so文件存放位置以及文件读写权限问题。

 

二、主要思路

 

1、首先把so放到网络上面,比如测试放到:http://codestudy.sinaapp.com/lib/test.so

2、应用启动时,启动异步线程下载so文件,并写入到/data/data/packageName/app_libs目录下面

3、调用System.load 注册so文件。因路径必须有执行权限,我们不能加载SD卡上的so,但可以通过调用context.getDir("libs", Context.MODE_PRIVATE)把so文件写入到应用程序的私有目录/data/data/packageName/app_libs。

 

三、代码实现

 

 1、网络下载so文件,并写入到应用程序的私有目录/data/data/PackageName/app_libs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
      * 下载文件到/data/data/PackageName/app_libs下面
      * @param context
      * @param url
      * @param fileName
      * @return
      */
     public  static  File downloadHttpFileToLib(Context context, String url, String fileName) {
         long  start = System.currentTimeMillis();
         FileOutputStream outStream =  null ;
         InputStream is =  null ;
         File soFile =  null ;
         try  {
             HttpClient client =  new  DefaultHttpClient();
             HttpGet get =  new  HttpGet(url);
             HttpResponse response = client.execute(get);
             HttpEntity entity = response.getEntity();
             File dir = context.getDir( "libs" , Context.MODE_PRIVATE);
             soFile =  new  File(dir, fileName);
             outStream =  new  FileOutputStream(soFile);
             is = entity.getContent();
             if  (is !=  null ) {
                 byte [] buf =  new  byte [ 1024 ];
                 int  ch = - 1 ;
                 while  ((ch = is.read(buf)) >  0 ) {
                     outStream.write(buf,  0 , ch);
                     //Log.d(">>>httpDownloadFile:", "download 进行中....");
                 }
             }
             outStream.flush();
             long  end = System.currentTimeMillis();
             Log.d( ">>>httpDownloadFile cost time:" ,  (end-start)/ 1000  "s" );
             Log.d( ">>>httpDownloadFile:" "download success" );
             return  soFile;
         catch  (IOException e) {
             Log.d( ">>>httpDownloadFile:" "download failed"  + e.toString());
             return  null ;
         finally  {
             if  (outStream !=  null ) {
                 try  {
                     outStream.close();
                 catch  (IOException e) {
                     e.printStackTrace();
                 }
             }
             if  (is !=  null ) {
                 try  {
                     is.close();
                 catch  (IOException e) {
                     e.printStackTrace();
                 }
             }
         }
     }

 

 2、调用System.load 注册so文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
new  Thread( new  Runnable() {
       @Override
       public  void  run() {
           File soFile = FileUtils.downloadHttpFileToLib(getApplicationContext(),  "http://codestudy.sinaapp.com//lib/test.so" "test.so" );
           if  (soFile !=  null ) {
             try  {
                    Log.d( ">>>loadAppFile load path:" , soFile.getAbsolutePath());
                    System.load(soFile.getAbsolutePath());
              catch  (Exception e) {
                  Log.e( ">>>loadAppFile load error:" "so load failed:"  + e.toString());
              }
            }
       }
}).start();

  

四、需要解决的问题

 

1、so文件下载以及注册时机。测试发现libffmpeg.so  8M的文件单线程下载需要10-13s左右

2、so下载失败或者注册失败该怎么处理。例如so播放组件是否尝试采用android系统原生MediaPlayer进行播放

3、当初次so还没有下载完注册成功时,进入播放页面时,需要友好提示用户,比如loading 视频正在加载等等

4、无网络情况等等情况

 

五、说明

 

 上面的demo经过3(2.3/4.2/4.4)实际机型测试可以正常使用,然后根据第四点列举问题完善以下,即可使用。

其他精彩文章文章

 

Android KSOAP2调用.net webservice

jQuery教程(8)-DOM树操作之使用反向插入方法

android学习笔记(34)使用AlertDialog创建简单对话框

android学习笔记(33)画廊视图(Gallery)的功能和用法

android navidgation drawer 在导航抽屉中如何改变List选中项的...

 

更多关于android开发文章

Android so lib库远程http下载和动态注册

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
预备知识及环境搭建 1、NDK(native development Kit)原生开发工具包,用来快速开发C、C++动态库,
NDK编译.so动态库 为何要用到NDK? 前段时间,工作中需要用android的应用程序访问android的根文件系
把 so 库文件放置在 android studio 的 libs 目录下: 在该 module 的 build.gradle 文件 android
来源: http://billhoo.blog.51cto.com/2337751/1125559 在bill的上一篇文章【Win7下Android native
C编译: 动态连接库 (.so文件) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留
JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 参考:http://blog.sina.com.cn/s/blog_4298
转自:http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html 作者:Vamei 出处:http://w
前面一篇文章“VS2010 C++创建、调用DLL图解”简单讲述了在Windows下创建和调用动态库(.dll文件)
之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱
Android内核是Linux的,而linux的动态库是*.so文件,那么在windows要如何生成并打包到APK中呢?实现
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号