精华内容
参与话题
问答
  • Android知识体系总结(全方面覆盖Android知识结构,面试&进阶 Version-3.0.0 时间:2020.01) 这是一篇实时更新的Android知识体系总结的博客,如果你是一枚Android程序员,请跟随笔者的步伐,好好学习,实现所想...

    Android知识体系总结(全方面覆盖Android知识结构,面试&进阶 Version-3.0.0 时间:2020.01)

    这是一篇实时更新的Android知识体系总结的博客,如果你是一枚Android程序员,请跟随笔者的步伐,好好学习,实现所想所得。

    再一次来到金三银四,感谢大家对于这篇文章的认可,顺便道句:各位读者,新年好,希望新的一年你们能成长到自己像成长的样子,实现自己2020的目标8888888
    这一次更新笔者会更新什么呢?有所期待吗?这一次更新笔者想把知识体系重新整理一下,之前2个版本有些不够完善,有些不够深度,笔者将会在每个知识体系后面加上一些面试题,读者可以通过这些面试题进行考察,测试自己知识的掌握情况,当然初学者,中级,高级等等都能通过此系列文章进阶,这是笔者的初衷,也是笔者唯一的写博客动力源泉,希望带着梦想的你们认真努力,日复一日,年复一年提升技术。

    这份知识体系大纲包括:
    Android部分:

    • 四大组件篇
      Activity
      BroadcastReceiver
      ContentProvider
      Service

    • 第五大组件篇
      Fragment

    • 对话框 & 通知篇
      Dialog
      PopWindow
      DialogFragment
      Notification

    • Android UI控件篇
      基础布局
      基础控件
      高级控件
      自定义控件
      原生控件源码分析

    • Android系统架构篇
      系统架构
      系统版本特点 & 区别

    • Android通信篇
      线程间通信框架Handler
      进程间通信

    • Android网络编程篇
      网络请求
      Token & Session & Cookie三者联系与区别
      数据解析[Json,XML]

    • Android持久化存储篇
      文件存储
      key-value存储[SharePreference,MMKV(腾讯)]
      数据库存储[SQL语句,SQLite]
      序列化

    • Android优化篇
      内存优化
      布局优化
      UI卡顿优化
      UI适配优化
      apk安全优化

    • Android 原生音视频图片开发
      图片开发
      视频开发
      音频开发

    • Android特殊知识点【不知道如何分类的知识点】
      Android Studio入门与开发技巧
      gradle
      蓝牙
      定位
      SDK开发与接入
      Drawable
      ......

    • Android必须掌握的轮子
      异步通信[EventBus,RxJava]
      图片加载[Glide,Picasso,Fresco]
      内存优化[LeackCanary,BlockCanary]
      依赖注入[ButterKnife,Dagger]
      数据库轮子[LitePal,GreenDao...]

    • 项目架构篇
      MVC & MVP & MVVM
      组件化
      JetPack

    • Android高级进阶篇
      UI绘制过程
      一个app启动过程
      ......

    • Android职业方向篇【这是笔者新加入的,对于Andorid开发者而言非常重要,要有自己的职业规划】
      资深UI工程师[自定义控件,源码方向]
      Android底层开发工程师[C++音视频/图像算法/智能家居]
      Android资深架构师[造得一手牛逼的好轮子,熟悉Framework,Java高级知识等等]

    Java部分:
    这里笔者暂时不总结,具体以面试题为主,传送门

    Kotlin部分:
    这里笔者暂时不总结,具体以面试题为主,传送门

    数据结构与算法部分
    这里笔者暂时不总结,具体以面试题为主,传送门

    计算机网络部分

    • 五层网络模型
    • http[请求头,响应体,三次握手,四次挥手等]
    • https
    • DNS
    • Socket & WebSocket
    • 浏览器访问一个url的过程
    • Android技术应用【Andorid中能运用的网络知识点】

    注意:为什么Java,Kotlin,数据结构与算法部分部分笔者不总结?因为暂时没有精力,等笔者有时间了也会一一罗列出来的.

    以下是Android面试系列文章知识体系图以及文章的具体链接:
    Android面试系列文章知识体系图:
    2018年3月份(Version-1.0.0):

    2018年9月份(Version-1.0.1):

    2020年1月份(Version-3.0.0):
    待笔者弄完上传

    1.Android部分

    1.1 Android四大组件篇

    Android知识体系总结之Android部分之Activity篇
    CSDN
    开源中国

    Android知识体系总结之Android部分之Broadcast篇
    CSDN
    开源中国

    Android知识体系总结之Android部分之ContentProvider篇
    CSDN
    开源中国

    Android知识体系总结之Android部分之Service篇(已更新,all&Face)
    http://blog.csdn.net/clandellen/article/details/79276411

    1.2 第五大组件Fragment

    Android知识体系总结之Android部分之Fragment篇(已更新,all&Face)
    http://blog.csdn.net/clandellen/article/details/79269680

    6.Android知识体系总结之Android部分之WebView篇 (已更新,all&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79287020

    7.Android知识体系总结之Android部分之Binder机制篇 (已更新,A3&A4&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79343389

    8.Android知识体系总结之Android部分之Handler机制篇(已更新,all&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79343538

    9.Android知识体系总结之Android部分之AsyncTask篇(已更新,all&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79346383

    10.Android知识体系总结之Android部分之HandlerThread篇(已更新,all&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79346492

    11.Android知识体系总结之Android部分之IntentService篇(已更新,all&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79346624

    12.Android知识体系总结之Android部分之View绘制机制篇(龟速更新中...可以看看,all&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79365250

    13.Android知识体系总结之Android部分之事件分发机制篇(已更新,all&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79365369

    14.Android知识体系总结之Android部分之ListView篇(已更新,all&Face&Update)
    http://blog.csdn.net/ClAndEllen/article/details/79365499

    15 Android知识体系总结之Android部分之RecyclerView篇(已更新,all&Face&Update)
    https://blog.csdn.net/ClAndEllen/article/details/82859578

    16 Android面知识体系总结之Android部分之ViewPager篇(已更新,all&Face&Update)
    https://blog.csdn.net/ClAndEllen/article/details/82862804

    17 Android知识体系总结之Android部分之动画机制篇(待更新...,all&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79411999

    18 Android知识体系总结之Android部分之自定义View篇(待更新...,A2&A3&A4&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79412399

    19 Android知识体系总结之Android部分之Android中的布局篇(已更新,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/82979812

    20 Android知识体系总结之Android部分之网络数据解析篇(已更新,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/82980593

    21 Android知识体系总结之Android部分之Android中的序列化篇(已更新,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/82980677

    22 Android知识体系总结之Android部分之Android系统版本特性篇(已更新,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/82982518

    23 Android知识体系总结之Android部分之JNI和NDK篇(已更新,A2&A3&A4&Face)
    https://blog.csdn.net/ClAndEllen/article/details/82966507

    24 Android知识体系总结之Android部分之Android本地存储篇(已更新,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/82997955

    25 Android知识体系总结之Android部分之Intent篇(已更新,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/83000920

    26 Android知识体系总结之Android部分之对话框篇(已更新,all&No)
    https://blog.csdn.net/ClAndEllen/article/details/82966342

    27 Android知识体系总结之Android部分之通知篇(已更新,all&No)
    https://blog.csdn.net/ClAndEllen/article/details/83001281

    28 Android知识体系总结之Android部分之Application类篇(已更新,A2&A3&A4&Face)
    https://www.jianshu.com/p/f665366b2a47

    29 Android知识体系总结之Android部分之Context的理解篇(已更新,A2&A3&A4&Face)
    https://www.jianshu.com/p/94e0f9ab3f1d

    30 Android知识体系总结之Android部分之Window的理解篇(已更新,A2&A3&A4&Face)
    https://blog.csdn.net/yhaolpz/article/details/68936932

    31 Android知识体系总结之Android部分之系统结构与系统源码目录篇(已更新,all&Face)
    https://blog.csdn.net/itachi85/article/details/54695046/

    32 Android知识体系总结之Android部分之冷启动&热启动篇(已更新,A2&A3&A4&Face)
    https://blog.csdn.net/ClAndEllen/article/details/79383005

    33 Android知识体系总结之Android部分之Andrid中的锁屏篇(已更新,all&No&Update)
    https://www.jianshu.com/p/6c3a6b0f145e
    https://blog.csdn.net/zrf1335348191/article/details/54377042

    34 Android知识体系总结之Android部分之悬浮窗篇(已更新,all&No)
    https://blog.csdn.net/ClAndEllen/article/details/82966403

    35 Android知识体系总结之Android部分之蓝牙&相机篇(已更新,all&No&Update)
    Android部分之蓝牙
    Android部分之相机
    如何获取手机本地图片

    36 Android知识体系总结之Android部分之音视频开发篇(已更新,all&No)
    https://blog.csdn.net/ClAndEllen/article/details/83023573

    37 Android知识体系总结之Android部分之手机定位篇(已更新,all&No)
    https://blog.csdn.net/qq_33689414/article/details/54136922

    Android Studio地图开发(百度地图)

    38 Android知识体系总结之Android部分之点九切图篇(已更新,all&No)
    https://blog.csdn.net/leeccncdl/article/details/7303635

    39 Android知识体系总结之Android部分之Material Design篇(待更新...,all&No)
    Material+design非官方中文指导手册1.0 提取码:uqex

    40 Android知识体系总结之Android部分之Android Drawable篇(已更新,all&No)
    https://www.cnblogs.com/sharecenter/p/5620967.html
    RecyclerView水波纹点击效果
    Android:为Button添加圆角黑色边框及透明底色

    41 Android知识体系总结之Android部分之内存优化&布局优化篇(已更新,all&Face&Update)
    https://blog.csdn.net/carson_ho/article/details/79708444?from=singlemessage

    42 Android知识体系总结之Android部分之屏幕相关知识&屏幕适配篇(已更新,all&Face&Update)
    https://blog.csdn.net/carson_ho/article/details/51234308

    43 Android知识体系总结之Android部分之进程间通信篇(已更新,A2&A3&A4&&Face)
    https://blog.csdn.net/u011240877/article/details/72863432

    44 Android知识体系总结之Android部分之图片开发&Bitmap&高清大图显示篇(待更新...,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/79382123

    [2]Java部分

    1.Android知识体系总结之Java部分I/O流篇
    http://blog.csdn.net/ClAndEllen/article/details/79429328

    2.Android知识体系总结之Java部分多线程流篇

    3.Android知识体系总结之Java部分异常篇
    http://blog.csdn.net/ClAndEllen/article/details/79389561

    4.Android知识体系总结之Java部分注解篇
    http://blog.csdn.net/ClAndEllen/article/details/79392453

    5.Android知识体系总结之Java部分类加载器篇
    http://blog.csdn.net/ClAndEllen/article/details/79392630

    6.Android知识体系总结之Java部分反射机制篇
    http://blog.csdn.net/ClAndEllen/article/details/79393029

    7.Android知识体系总结之Java部分泛型篇

    8.Android知识体系总结之Java部分集合框架篇

    9.Android知识体系总结之Java部分设计模式篇(已更新,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/82966697

    10.Android知识体系总结之Java部分Java虚拟机篇

    [3]算法和数据结构部分(注意面试的时候回答不上来,千万别放弃,因为Android对算法的要求是次要的,也就是说算法能力并不能决定你拿不拿得到offer,当然也必须具备一些基本的算法能力,比如:冒泡,选择排序,二分查找啊等)

    1.Android知识体系总结之算法与数据结构部分之算法的效率篇

    2.Android知识体系总结之数据结构之链表篇
    https://blog.csdn.net/lishuzhai/article/details/50972779

    3.Android知识体系总结之数据结构之队列篇(已更新,all&Face)
    https://blog.csdn.net/javazejian/article/details/53375004

    4.Android知识体系总结之数据结构之栈篇
    https://blog.csdn.net/javazejian/article/details/53362993

    5.Android知识体系总结之数据结构之堆篇
    https://blog.csdn.net/wypblog/article/details/8076324

    6.Android知识体系总结之算法之排序算法
    http://blog.csdn.net/happy_wu/article/details/51841244

    7.Android知识体系总结之算法之查找算法
    http://blog.csdn.net/three_man/article/details/46799659

    8.Android知识体系总结之数据结构之树篇
    https://blog.csdn.net/u011240877/article/details/53193877

    9.Android知识体系总结之算法与数据结构部分之其它算法篇(待更新)

    [4]操作系统

    1.什么是进程?什么是线程?进程和线程之间的区别

    2.Windows剪切板的和Android的进程间通讯是不是类似

    [5]实战经验部分:

    1.Android知识体系总结之实战经验部分之Android Stdio目录结构篇
    http://blog.csdn.net/ClAndEllen/article/details/79368343

    2.Android知识体系总结之实战经验部分之代码版本控制篇
    http://blog.csdn.net/ClAndEllen/article/details/79369538

    3.Android知识体系总结之实战经验部分之Android构建流程篇
    http://blog.csdn.net/ClAndEllen/article/details/79369302

    4.Android知识体系总结之实战经验部分之gradle篇
    http://blog.csdn.net/ClAndEllen/article/details/79369643

    5.Android知识体系总结之实战经验部分之proguard混淆篇
    http://blog.csdn.net/ClAndEllen/article/details/79369761

    6.Android知识体系总结之实战经验部分之Android屏幕适配篇(已更新,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/82977894

    7.Android知识体系总结之实战经验部分之Android多渠道打包与apk签名篇

    [6]实战经验部分之常用框架部分

    1.Android知识体系总结之常用框架之网络框架篇
    http://blog.csdn.net/clandellen/article/details/79373303

    2.Android知识体系总结之常用框架之异步框架篇
    http://blog.csdn.net/ClAndEllen/article/details/79373350

    3.Android知识体系总结之常用框架之图片加载框架篇
    http://blog.csdn.net/ClAndEllen/article/details/79375228

    4.Android知识体系总结之常用框架之依赖注入框架篇
    http://blog.csdn.net/clandellen/article/details/79375249

    5.Android知识体系总结之常用框架之内存优化框架篇
    http://blog.csdn.net/ClAndEllen/article/details/79375317

    6.Android知识体系总结之常用框架之数据库存储框架篇(已更新,all&Face)
    https://blog.csdn.net/ClAndEllen/article/details/82967459

    [7]实战经验部分之网络理论基础

    1.Android知识体系总结之Android所具备的网络基础篇
    http://blog.csdn.net/ClAndEllen/article/details/79379691

    [8]实战经验部分之调试能力

    1.Android知识体系总结之异常处理ANR异常篇
    http://blog.csdn.net/ClAndEllen/article/details/79381399

    2.Android知识体系总结之异常处理OOM异常篇
    http://blog.csdn.net/ClAndEllen/article/details/79381656

    3.Android知识体系总结之内存管理之Bitmap的加载篇
    http://blog.csdn.net/ClAndEllen/article/details/79382123

    4.Android知识体系总结之内存管理之UI卡顿篇
    http://blog.csdn.net/ClAndEllen/article/details/79382430

    5.Android知识体系总结之内存管理之内存泄漏篇
    http://blog.csdn.net/ClAndEllen/article/details/79382815

    6.Android知识体系总结之内存管理篇
    http://blog.csdn.net/ClAndEllen/article/details/79382919

    7.Android知识体系总结之内存管理之冷启动过优化及其他优化篇
    http://blog.csdn.net/ClAndEllen/article/details/79383005

    http://blog.csdn.net/ClAndEllen/article/details/79383058

    8.Android知识体系总结之Android代码分析工具:Lint检查
    http://blog.csdn.net/ClAndEllen/article/details/79400555

    9.Android知识体系总结之Android代码编程规范

    10.Android知识体系总结之实战经验部分之调试能力之测试篇

    [9]实战经验部分之架构搭建篇

    1.Android知识体系总结之之架构搭建之MVC模式篇
    http://blog.csdn.net/ClAndEllen/article/details/79396116

    2.Android知识体系总结之之架构搭建之MVP模式篇
    http://blog.csdn.net/ClAndEllen/article/details/79396527

    3.Android知识体系总结之之架构搭建之MVVM模式篇
    http://blog.csdn.net/ClAndEllen/article/details/79396831

    4.Android知识体系总结之之架构搭建之谷歌官方推荐架构TODO-MVP篇
    https://www.jianshu.com/p/8b81493d1297

    [10]前沿的技术篇

    1.Android知识体系总结之前沿的技术之Android组件化开发篇(待更新,A2&A3&A4&Face)

    2.Android知识体系总结之之Android插件化&热更新篇
    插件化
    热更新

    3.Android知识体系总结之前沿的技术之进程保活篇(待更新,A2&A3&A4&Face)
    http://blog.csdn.net/ClAndEllen/article/details/79398132

    4.Android知识体系总结之Kotlin语言面试篇
    http://blog.csdn.net/ClAndEllen/article/details/79400968

    5.Android知识体系总结之Android消息推送篇:
    https://www.jianshu.com/p/b61a49e0279f

    6.Android知识体系总结之面向切面编程AOP篇:
    http://blog.csdn.net/innost/article/details/49387395

    7.Android知识体系总结之谷歌最新跨平台UI框架Flutter篇
    谷歌的移动UI框架Flutter

    由于笔者没有写源码分析文章的习惯,只是看源码的时候,自己大脑转了一遍,但没关系,我这里会贴出一些高质量大神写的源码分析的文章,希望读者被面试官问道的时候能够从容应答。

    [11]Java源码篇

    1.Android知识体系总结之LRU算法有关的集合LinkedHashMap的源码探究
    http://blog.csdn.net/justloveyou_/article/details/71713781

    2.Android知识体系总结之Java常用集合源码探究
    ArrayList:
    http://blog.csdn.net/gulu_gulu_jp/article/details/51456969
    http://blog.csdn.net/chun0801/article/details/51481877
    http://blog.csdn.net/u014136713/article/details/52089156

    ...不止这些,还有很多,请读者耐心等待笔者总结

    [12]Android源码篇

    1.启动一个app的源码分析

    2.Android中的main()方法在哪里?

    ......

    弄懂Android源码,你需要理解什么是init进程,什么是Zygote进程,SystemServer,AMS等等,这是需要时间去理解的:

    http://blog.csdn.net/itachi85/article/details/54695046

    init进程的启动流程:
    http://blog.csdn.net/itachi85/article/details/54783506

    Zygote(受精卵进程)的启动流程:
    http://blog.csdn.net/itachi85/article/details/55047104

    SyetemServer进程启动过程:
    http://blog.csdn.net/itachi85/article/details/55053356

    Launcher启动过程与系统启动流程:
    http://blog.csdn.net/itachi85/article/details/56669808

    程序启动的流程:

    http://blog.csdn.net/itachi85/article/details/64123035
    http://blog.csdn.net/itachi85/article/details/64243223

      源码分析也不能完全按照大神的角度去看,有时候自己尝试去理解,就会发现不一样的地方,觉得世界一下被打开了,笔者在研究广播机制的源码的时候,就有这样的感觉,研究的时候,笔者终于知道为什么系统广播不安全,而本地广播那么安全高效,因为系统广播的通信机制使用的Binder,而Binder是走的系统,通过AMS注册的传播广播信号,而本地广播是通过Handler机制实现的通信,这就意味着,本地广播的信号肯定不会发送到应用之外,由于采用的Handler机制,所以高效就不足为奇了。
      笔者曾被一个学弟提问道,研究源码有什么好处?除了平时能装逼,应付面试,还有什么?其实研究源码好处不止有这些,因为源码是比我们还要厉害的大神写出来的,我们可以学习这些源码里的一些实现逻辑,把这些实现逻辑搬到自己的代码中,这就厉害啦,有时候我们碰到难以实现的模块,我想源码或许会无形当中会提供一些解决方案,GitHub上那些Star比较多的项目的博主,我想他们肯定有看源码的习惯。

    [13]Android框架源码篇

    1.Android知识体系总结之网络框架OkHttp源码分析篇
    https://www.jianshu.com/p/27c1554b7fee

    2.Android知识体系总结之网络框架Retrofit源码分析篇
    https://www.jianshu.com/p/0c055ad46b6c

    3.Android知识体系总结之图片框架Glide源码分析篇
    http://blog.csdn.net/yulyu/article/details/60331803

    4.Android知识体系总结之图片框架Picasso源码分析篇
    http://blog.csdn.net/woliuyunyicai/article/details/51417839

    5.Android知识体系总结之内存分析框架LeakCanary源码分析篇
    http://blog.csdn.net/cloud_huan/article/details/53081120

    6.Android知识体系总结之依赖注入Butterknife源码分析篇
    http://blog.csdn.net/ta893115871/article/details/52497297

    7.Android知识体系总结之依赖注入Dragger2源码分析篇
    https://www.jianshu.com/p/eef7fa8136e7

    8.Android知识体系总结之异步框架EventBus源码分析篇
    http://blog.csdn.net/ljd2038/article/details/51470734

    9.Android知识体系总结之异步框架RxJava源码分析篇
    http://gank.io/post/560e15be2dca930e00da1083

    10.Android知识体系总结之图片框架ImageLoader框架源码分析
    http://blog.csdn.net/xiaanming/article/details/26810303

    http://blog.csdn.net/xiaanming/article/details/27525741

    http://blog.csdn.net/xiaanming/article/details/39057201

    以上就是Android知识体系总结的所有内容,下次更新时间预计于2019年3月左右,也就是每次跳槽最佳时间都会去更新一遍文章,即金三银四,金九银十,再次谢谢大家的阅读,觉得不错,就点个赞吧!


    一个GitHub受欢迎的Android第三方库整理的网站,读者可以收藏一下,高效率开发

    笔者上面没能将Java,Kotlin,算法与数据结构总结完善,当然这也在笔者的规划之中。
    Java知识体系
    算法与数据结构知识体系
    Kotlin知识体系(待整理)
    Python知识体系(待整理)

    展开全文
  • andrid 蓝牙开发 bluetooth

    千次下载 热门讨论 2015-04-24 16:58:17
    android 蓝牙简单通信,蓝牙开发。
  • 前提条件是,电视机没有外置...Android4.4 //当你下载完成后,并保存在指定的路径。这个路径可以写入,却无法读取 //先给权限 setUpdateDir(new File(getApplicationContext().getDir("app", MO...

    前提条件是,电视机没有外置SD卡。这时候下载应用 要存储在内置的空间里。可以写入进入却无法,打开。打开报解析包出现问题。
    最后的解决方法是:内置空间没有权限读取。
    Android4.4

    //当你下载完成后,并保存在指定的路径。这个路径可以写入,却无法读取
     //先给权限
      setUpdateDir(new File(getApplicationContext().getDir("app", MODE_WORLD_WRITEABLE) + "/" + "SPA"));
     //再安装
      installApp(getApplicationContext().getDir("app", MODE_WORLD_WRITEABLE) + "/" + "SPA");
    
    
    
    /**
         * 内置存储中给指定的文件权限。
         *
         * @param updateDir 文件路径位置
         */
        private void setUpdateDir(File updateDir) {
            try {
                Process p = Runtime.getRuntime().exec("chmod 777 " + updateDir);
                int status = p.waitFor();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
     //根据指定路径安装APP
        private void installApp(String path) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.parse("file://" + path),
                    "application/vnd.android.package-archive");
            startActivity(intent);
        }
    

    例子:
    使用okgo下载

      /**
         * 下载第三方
         * @param url      APP路径
         * @param
         */
        public void downLoadApp(String url) {
            OkGo.<File>get(url)
                    .tag(this)
                    .execute(new FileCallback(getApplicationContext().getDir("app", MODE_WORLD_WRITEABLE)+"/", "dsf") {
                        @Override
                        public void onStart(Request<File, ? extends Request> request) {
                            super.onStart(request);
                            showDialog(getResources().getString(R.string.loading_string));
                        }
                        @Override
                        public void onSuccess(Response<File> response) {//sdcard/download/ 默认下载路径
                            setUpdateDir(new File(getApplicationContext().getDir("app", MODE_WORLD_WRITEABLE) + "/" +"dsf"));//先给权限
                            //再安装
                            installApp(getApplicationContext().getDir("app", MODE_WORLD_WRITEABLE) + "/"  + "dsf" );
                            hud.dismiss();
    //                        startActivity(intent);//下载完后 启动应用。
                        }
    
                        @Override
                        public void downloadProgress(Progress progress) {
                            super.downloadProgress(progress);
    //                            dialog.setPRo((int) progress.fraction);
    
                        }
    
                        @Override public void onFinish() {
                            super.onFinish();
    
                        }
                    });
        }
    
    展开全文
  • andrid studio导入java项目

    千次阅读 2017-06-22 05:06:14
    越来越多人用android studio,但网上的大多数资源还是用eclipse写的,学习Android免不了要将java项目导入到android studio中,这篇文章就分享一个我觉得特别好用的方法。

    越来越多人用android studio,但网上的大多数资源还是用eclipse写的,学习Android免不了要将java项目导入到android studio中,这篇文章就分享一个我觉得特别好用的方法。


    只需三步,熟练后非常快

    一个java项目里的文件很多,这用到的只有三项:


    java项目包


    将状态栏的Android切换为Project,便于后面的操作。


    切到 Project 视图


    将空项目中的 res 文件删除,将java项目的 res 文件复制过来。


    替换 res 文件


    将 .java文件复制过来。这里要注意一点,如果 .java全部都在一个文件夹内,直接复制过来即可,如果 .java分布在几个文件夹内,复制这几个文件夹到自己的包名文件夹下,这样利于后面改包名。如:若 .java 所在的文件夹有两个,myapp 和 myapps,将这两个文件夹复制到 com.cloud.snake 下。

    java 项目的主 Activity 名是 MyActivity,大多数同 android studio 默认的主 Activity 名相同,即为 MainActivity,若相同,和上面的注意点一样,若 MainActivity 不在文件夹内,直接替换,若 MainActivity 在文件夹内,将内容复制到自己的 MainActivity 中。

    上述内容是我自己总结的经验,人各有异,不管怎样,自己习惯熟练了即可,没有硬性规定。


    替换 .java文件


    将AndroidManifest.xml文件复制过来,覆盖原文件。


    替换 .xml 文件


    替换包名。这一步要特别细心,如果包名替换不正确,很可能出一堆 cann't find xxx 的错误。原包名是:com.example.myapp,将之替换为自己的包名,这里是:com.cloud.snake。

    包名即 AndroidManifest.xml 中的 package = " XXX ",这里使用全部替换是因为有的文件或相互引用,只改 .xml 中的话可能出现某个 java 类找不到。


    替换包名


    简单点的项目到这里就可以运行了,少数可能 v4 包重复而报错,删掉一个 v4 包即可。还有可能少数资源文件没复制过来(复杂项目),看下报错即可。好了,看一下 android studio 运行 java 项目贪吃蛇的效果:




    展开全文
  • Qt,FFmpeg跨平台开发,iOS,Android,Mac,linux,桌面软件都不再是障碍。让学员能够,融汇贯通掌握音视频领域相关知识,从事音视频相关职业,年薪轻松三四十万不是梦。 付费学员加入QQ群,可获得1~3年的专业解答,...
  • Android 集成 FFmpeg (一) 基础知识及简单调用

    万次阅读 多人点赞 2017-08-12 23:28:19
    本系列第二篇:Android 集成 FFmpeg (二) 以命令方式调用 FFmpeg 前言 网上关于 Android 集成 FFmpeg 的文章很多,但大多数都只介绍了步骤,没有说明背后的原理,若之前没有集成底层库的经验,那就会“神知无知...

    本系列第二篇:Android 集成 FFmpeg (二) 以命令方式调用 FFmpeg

    前言

    网上关于 Android 集成 FFmpeg 的文章很多,但大多数都只介绍了步骤,没有说明背后的原理,若之前没有集成底层库的经验,那就会“神知无知”的走一步看一步,出错几率很大,出错了也不知道原因,然后会乱猜“这篇教程有问题“,“换个版本估计可以”,甚至“电脑有问题,重装下系统试试”。

    为什么会出现这种情况,答案很简单:欲速则不达,要实现 Android 端集成 FFmpeg 功能,那就要掌握必需的基础知识,如果连 JNI、NDK都不了解,一上来就参考几秒钟搜出来的集成步骤开始集成,那只会被各种莫名其妙的异常完虐,如果运气好很快就实现了功能呢? 在我看来这是更大的损失,这些你没有掌握的知识如此接近却又悄悄溜走。

    那么在 Android 端集成 FFmpeg 需要掌握哪些基础知识呢?个人认为以下内容是需要了解的:

    1. JNI
    2. CPU架构
    3. 交叉编译
    4. NDK
    5. FFmpeg 简介

    以下知识点阐述是经过反复推敲的,不是随意复制而来,其中融入自己的理解,以个人易于理解的方式记录下来,希望能给你带来帮助。

    1.JNI

    JNI,即 Java Native Interface ,是 Java 提供用来与其他语言通信的 api ,“其他语言”意味不止局限于 C 或 C++ ,也可以调用除 C 和 C++ 之外的语言,只是大多数情况下调用 C 或 C++ ; “通信”意味着 Java 和 其他语言之间可以相互调用,不止局限于 Java 调用其他语言,其他语言也可以主动调用 Java .

    Java 虚拟机实现了跨平台特性, 无法很好的实现与操作系统相关的本地操作,而 C 或 C++ 可以,同时代表着 C 或 C++ 不具备 Java 的跨平台能力,那么当我们在程序中使用 JNI 功能时,就必须关注程序的平台可移植性, JNI 标准要求本地代码至少能工作在任何Java 虚拟机环境。

    简而言之,跨平台的 Java 调用了不跨平台的 C/C++,使程序丧失了跨平台性,这就是 JNI 的副作用,所以可以不使用 JNI 时就尽量避免。而大多数不可避免的情况是:已存在用 C/C++ 写的程序/库或者 Java 语言不支持程序所要实现的特性,比如 ffmpeg 是由 C 编写的,则必须要通过 JNI 实现调用。

    JNI 的实现步骤很简单,如下:

    1. 编写带有 native 方法的 Java 类
    2. 生成该类扩展名为 .h 的头文件
    3. 创建该头文件的 C/C++ 文件,实现 native 方法
    4. 将该 C/C++ 文件编译成动态链接库
    5. 在Java 程序中加载该动态链接库

    动态链接库是一组源代码的模块,其中包含可供应用程序调用的函数。比如 Windows 下的 .dll 文件就是一种动态链接库,也就是说 Java 程序在 Windows 中运行,所需的动态链接库就是 .dll 文件; 如果 Java 程序在 Linux 中运行,所需的动态链接库就是 .so 文件 ,这里 JNI 的副作用已初见端倪,本来无视操作系统的 Java ,因为 JNI ,就要考虑运行环境是 Windows 还是 Linux 。除此之外,还要考虑 CPU 架构,这也是 Android 中使用 JNI 主要需考虑的 so 库兼容型问题。

    对于 Java 程序来说,需要的仅仅是编译后的动态链接库,不需要 C/C++ 文件和 .h 头文件。Android 亦如此,网上很多 Android NDK 教程会把需要编译的 C/C++ 源码放入 Android 工程中,形成类似这样的工程结构:

    这里写图片描述

    这对新手来说可能会产生误导,误以为 Android 工程需要 C/C++ 文件或 .h 头文件或者其他的文件,要清楚的是, Android 工程需要的仅仅是编译后的 .so 库,所以我们可以在工程之外编译完后,只将 .so 库移植到工程中。那为什么大多数教程会把源码先移植到 Android 工程中再去编译呢?目的只有一个:节省目录的切换以及 .so 库的复制时间,实际上这些时间微乎其微,我推荐新手将编译操作于工程外进行,更易理解。

    2.CPU 架构

    我们都知道 CPU 是什么,那 CPU 架构到底是什么呢?回归到“架构”这个词本身含义,CPU 架构就是 CPU 的框架结构、设计方案,处理器厂商以某种架构为基础,生产自己的 CPU,就好比“总-分-总”是文章的一种架构,多篇文章可以都基于“总-分-总”架构。

    常见的 CPU 架构有 x86、x86-64 以及 arm 等, x86-64 其实也是基于 x86 架构,只是在 x86 的基础上做了一些扩展,以支持 64 位程序的应用,常见的 Intel 、AMD 处理器都是基于 x86 架构的。

    而 x86 架构主打的是 pc 端,对于移动端,arm 架构处于霸主地位 ,由于其体积小、低功耗、低成本、高性能的优点,被广泛应用在嵌入式系统中,目前大多数安卓、苹果手机的 CPU 都基于 arm 架构,此处所说的 arm 架构指 arm 系列架构,其中包括 ARMv5 、ARMv7 等等。

    最后再看 Android 端 , Android 系统目前支持 ARMv5、ARMv7、ARMv8、 x86 、x86_64、MIPS 以及 MIPS64 共七种 CPU 架构,也就是说除此之外其他 CPU 架构的硬件并不能运行 Android 系统。

    3.交叉编译

    在某个平台上,编译该平台的可执行程序,叫做本地编译,比如在 Windows 平台上编译 Windows 自身的可执行程序;在 x86 平台上,编译 x86 平台自身的可执行程序。

    在某个平台上,编译另一种平台的可执行程序,就是交叉编译,比如在 x86 平台上,编译 arm 平台的可执行程序,这也是 Android 端使用最多的交叉编译类型。

    在交叉编译时,由于主机与目标的体系架构、环境不同,所以交叉编译比本地编译复杂很多,需要一些工具来解决主机与目标不同特性的问题,这些工具构成的工具集就叫做交叉编译链。

    既然交叉编译比本地复杂很多,那为什么不使用本地编译,比如在 arm 平台编译 arm 平台的可执行程序呢?这是因为目标平台存储空间和计算能力通常是有限的,而编译过程需要较大的存储空间和较快的计算能力,但目标平台无法提供。

    4.NDK

    我们需要的是 arm 平台的动态库,而这一编译过程往往是在 x86 平台上进行,所以属于交叉编译,需要交叉编译链来实现,所以 NDK(Native Development Kit )中提供了交叉编译链,方便开发。

    Android 中包括七种 CPU 架构,NDK 中自然就有与之对应的交叉编译链,以下是 Android 官网对此的表格描述:

    | 架构 | 工具链名称 |
    |: ------ 😐:-----------😐
    | 基于 ARM | arm-linux-androideabi- < gcc-version > |
    | 基于 ARM64 | aarch64-linux-android- < gcc-version > |
    | 基于 x86 | x86- < gcc-version > |
    | 基于 X86-64 | x86_64- < gcc-version > |
    | 基于 MIPS | mipsel-linux-android- < gcc-version > |
    | 基于 MIPS64 | mips64el-linux-android-- < gcc-version >
    |

    除此之外,NDK 还提供了一些原生标头和共享库文件,包括 C/C++ 支持库、从 C/C++ 代码中可以向 Android 系统输出日志的 < android/log.h > 等等,可以点击这里了解更多,总之,NDK 是用来帮助我们实现交叉编译的工具。

    在实际使用时,比较重要的是 Android.mk 语法,内容并不多,但你必须了解,不然只复制别人的配置很容易出错,关键是你无法真正的掌握这部分知识,而最好的学习方法就是仔细阅读几遍 Android.mk 官网教程

    另外还需要了解什么是 ABI ,ABI 即 application binary interface ,应用程序二进制接口,顾名思义,“二进制接口”说明这是程序与系统之间的底层接口,它定义了程序如何与系统交互。我们应该指定每个 CPU 架构所对应的 ABI,所以 Android 中就出现了 armeabi 、armeabi-v7a、arm64-v8a、x86、x86_64、mips 以及 mips64 目录来区分不同的 ABI ,我们将编译好的动态库放入对应 CPU 架构的 ABI 目录中就可以了。

    掌握了以上知识点,才能知道 Android 集成 FFmpeg本质上是在做什么,为什么要这样做。不只是集成 FFmpeg,这些知识对于任何底层库的集成都是通用、必要的。

    1. FFmpeg 简介
      ===

    FFmpeg 是一套可以用来记录、转换数字音频视频,并能将其转化为流的开源计算机程序

    FFmpeg 被很多开源项目和软件使用,比如暴风影音、QQ影音、格式工厂等,另外在我常用的 App 中也发现了它的身影:

    这里写图片描述

    其实写到这里,有点犹豫非操作步骤的内容是否叙述过多了,后来想想,这正是这篇文章的初衷,尽量全面清楚,透过表面操作看本质,另外最重要的一个目标,就是争取做到授人以渔,我相信这也是大家对所有技术教程文章的一个美好愿景。

    下面分为 3 个部分介绍 FFmpeg的编译及 Android 端的简单调用:

    1. 准备

    2. 编译 FFmpeg

    3. 编译动态库及调用

    4. 准备
      ===

    • Linux 环境(Ubuntu 16.04):从个人经验而谈,准备 Linux 环境比 Windows 环境编译的工作量小。
    • 下载NDK(android-ndk-r14b) :网上有些教程美言曰“NDK向后兼容”,其实查阅 NDK 版本更新说明就能解决。
    • 下载 FFmpeg (ffmpeg-3.3.3): 官网下载链接:https://ffmpeg.org/download.html
    1. 编译 FFmpeg
      ===
      编译环境为 x86 的 Linux ,运行环境为 arm 架构的 Android 系统,目标是把 FFmpeg 源码编译成 Android 端可调用的动态库,这属于交叉编译,所以需要 NDK 提供的交叉编译工具,这是这一步骤的本质意义。

    Android 工程中只支持导入 .so 结尾的动态库,形如:libavcodec-57.so 。但是FFmpeg 编译生成的动态库默认格式为 xx.so.版本号 ,形如:libavcodec.so.57 , 所以需要修改 FFmpeg 根目录下的 configure 文件,使其生成以 .so 结尾格式的动态库:

    # 将 configure 文件中的:
    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)' 
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' 
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)' 
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
    
    #替换为:
    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'
    
    

    在编译 FFmpeg 之前,我们需要修改 FFmpeg 的编译选项,主要目的如下:

    • 规定编译方式,使其通过交叉编译生成我们需要的动态库。
    • 选择所需功能,针对需求定制 FFmpeg 功能,精简动态库。

    比如我们需要对 mp3 文件进行剪切、合并等操作,则应开启 mp3 格式编码与解码功能( FFmpeg 本身不支持 mp3 格式编码,需要引入 libmp3lame 库)。

    怎么修改 FFmpeg 的编译选项呢?在 FFmpeg 根目录下通过 ./configure 命令进行设置,但是为了方便记录与修改,我们选择在根目录下建立一个脚本文件来运行 ./configure 命令。

    针对所需功能,脚本文件如下 :

    #!/bin/bash  
    NDK=/home/yhao/Android/android-ndk-r14b
    SYSROOT=$NDK/platforms/android-14/arch-arm/
    TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    
    CPU=arm
    PREFIX=$(pwd)/Android/$CPU
    MP3LAME=/home/yhao/sf/lame-3.99.5/android
    
    ./configure \
        --prefix=$PREFIX \          #规定编译文件在哪里生成
        --enable-cross-compile \    #启用交叉编译方式
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \  #交叉编译链
        --target-os=linux \         #目标系统
        --arch=arm \                #目标平台架构
        --sysroot=$SYSROOT \        #交叉编译环境
        --extra-cflags="-I${MP3LAME}/include" \                 #额外需要的头文件
        --extra-ldflags="-L${MP3LAME}/lib" \                    #额外需要的库                 
        --enable-shared \           #生成动态库(共享库)
        --disable-static \          #禁止生成静态库
        --disable-doc \             #禁用不需要的功能,下同
        --disable-ffserver \
        --disable-parsers \
        --disable-protocols \
        --disable-indevs \
        --disable-bsfs \
        --disable-muxers \
        --disable-demuxers \
        --disable-hwaccels \
        --disable-decoders \
        --disable-encoders \
        --enable-parser=mpegaudio \ #启用需要的功能,下同
        --enable-protocol=http \
        --enable-protocol=file \
        --enable-libmp3lame \
        --enable-encoder=libmp3lame \
        --enable-encoder=png \
        --enable-demuxer=mp3 \
        --enable-muxer=mp3 \
        --enable-decoder=mjpeg \
        --enable-decoder=mp3
    

    除强迫症风格的注释之外,再对个别配置进行说明:

    • –sysroot=$SYSROOT : 前言中提到 NDK 除了提供 交叉编译链 以外,还提供一些原生标头和共享库文件,通过此配置指定了交叉编译环境,使其在编译过程中能够引用到 NDK 提供的原生标头和共享库文件,其中 android-14 目录指定了生成动态库最低支持的 Android 版本,嗯~ ,这里可以说它是向后兼容的。

    • –target-os=linux :Android 内核为 Linux ,故在此指定为 linux ,如果要编译的目标系统为 ios ,则指定为 darwin 。

    • –cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- : 类似于通配符方式指定 bin 目录下以 arm-linux-androideabi-
      开头的交叉编译工具,假如不支持这种配置方式则需分别指定,比如在交叉编译 libmp3lame 时就是分别指定的:

    这里写图片描述

    • –extra-cflags 和 --extra-ldflags : 由于开启 mp3 编码需要引入 libmp3lame 库,所以需要指定编译好的 libmp3lame 头文件和库文件的路径,这样在编译时才能正确引用到 libmp3lame 。这里是我编译好的 libmp3lame 库,下载后指定对应路径即可 。

    • FFmpeg 功能的开启和禁用 : 在 FFmpeg 源码根目录下通过 ./configure --help 命令查看所有配置选项,针对需求配置,这里针对 mp3 文件操作的功能进行配置,禁用了很多不需要的功能,大幅精简动态库,从而减小 APK 大小。

    接下来运行该脚本文件使配置生效,比如我的脚本文件名为 config.sh :

    sh config.sh
    

    运行成功后会输出生效的配置,可以看到此时支持的编解码:

    这里写图片描述

    ok ,现在已经配置完编译选项了,接下来就可以开始编译了啦~

    sudo make -j4
    

    编译完成不要忘记安装:

    sudo make install
    

    然后就可以看到成功生成:

    这里写图片描述

    1. 编译动态库及调用
      ====
      你可能会疑问,上一步已经编译 FFmpeg 源码生成动态库了,为什么这一步还是“编译动态库”呢?其实这个问题等效于:上一步中生成的动态库可以直接在 Android 工程中使用吗?

    答案是否定的,回到文章开头 JNI 的使用步骤,在编写带有 native 方法的 Java 类后,紧接着就是用 C/C++ 实现本地接口,这是 Java 与 C/C++ 交互的必要通道。

    所以接下来需要编写本地接口,在本地接口中调用上一步编译好的 FFmpeg 动态库,然后将本地接口也编译成动态库,供 Android 调用,这一步还需要“编译动态库”。

    网上有些教程在这一步把 FFmpeg 源码、动态库全部复制到 Android 工程中,然后在工程中新建本地接口、mk文件… 花里胡哨的看的我头皮发麻~ 这一步我推荐在 Android 工程之外进行,直到生成最终可用的动态库之后,再拷贝到 Android 工程中直接使用。

    首先新建一个文件夹,取名随意,比如 “ndkBuild ”,这个目录就作为我们的工作空间,然后在 ndkBuild 下新建 jni 文件夹, 作为编译工作目录。 OK~ 接下来按照前言中的 jni 步骤来划分操作:

    1. 编写带有 native 方法的 Java 类

    package com.jni;
    
    public class FFmpeg {
        
        public static native void run();
    
    }
    
    

    2. 生成该类扩展名为 .h 的头文件

    在 Android Studio 的 Terminal 中 切换到 java 目录下,运行 javah 命令生成头文件:

    javah -classpath .  com.jni.FFmpeg
    

    网上很多教程需要先生成 .class 文件,而我在 java 1.8 环境下亲测以上一句命令即可。

    3. 创建该头文件的 C/C++ 文件,实现 native 方法

    将生成的 com_jni_FFmpeg.h 文件剪切到 ndkBuild 的 jni 目录下,创建对应的 C 文件 com_jni_FFmpeg.c :

    #include <android/log.h>
    #include "com_jni_FFmpeg.h"
    
    #include <stdlib.h>
    #include <stdbool.h>
    #include <stdio.h>
    #include "libavcodec/avcodec.h"
    #include "libavformat/avformat.h"
    #include "libavfilter/avfilter.h"
    
    JNIEXPORT void JNICALL Java_com_jni_FFmpeg_run(JNIEnv *env, jclass obj) {
      
        char info[40000] = {0};
        av_register_all();
        AVCodec *c_temp = av_codec_next(NULL);
        while(c_temp != NULL){
           if(c_temp->decode!=NULL){
              sprintf(info,"%s[Dec]",info);
           }else{
              sprintf(info,"%s[Enc]",info);
           }
           switch(c_temp->type){
            case AVMEDIA_TYPE_VIDEO:
              sprintf(info,"%s[Video]",info);
              break;
            case AVMEDIA_TYPE_AUDIO:
              sprintf(info,"%s[Audio]",info);
              break;
            default:
              sprintf(info,"%s[Other]",info);
              break;
           }
           sprintf(info,"%s[%10s]\n",info,c_temp->name);
           c_temp=c_temp->next;
        }
    __android_log_print(ANDROID_LOG_INFO,"myTag","info:\n%s",info);
    }
    

    这段程序用于输出 FFmpeg 支持的编解码信息,通过 < android/log.h > 的 __android_log_print 方法可以直接将信息输出到 Android Studio 的 logcat 。

    4. 将该 C/C++ 文件编译成动态链接库

    编译 FFmpeg 源码时的实际入口是通过 FFmpeg 提供的 makefile ,而在这一步,将直接使用 NDK 提供的编译方法,需要提供 Application.mk 和 Android.mk 文件。

    首先在 jni 目录下创建 Application.mk 文件 :

    APP_ABI := armeabi
    APP_PLATFORM=android-14
    

    APP_ABI 表示编译生成 armeabi 架构的 so 库,APP_PLATFORM 表示最低支持的 Android 版本。

    然后在 jni 目录下创建 Android.mk 文件:

    LOCAL_PATH:= $(call my-dir)
    
    INCLUDE_PATH:=/home/yhao/sf/ffmpeg-3.3.3/Android/arm/include
    FFMPEG_LIB_PATH:=/home/yhao/sf/ffmpeg-3.3.3/Android/arm/lib
    
    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavcodec
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavcodec-57.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)
     
    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavformat
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavformat-57.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)
     
    include $(CLEAR_VARS)
    LOCAL_MODULE:= libswscale
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libswscale-4.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)
     
    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavutil
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavutil-55.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)
     
    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavfilter
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavfilter-6.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)
     
    include $(CLEAR_VARS)
    LOCAL_MODULE:= libswresample
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libswresample-2.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE:= libpostproc
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libpostproc-54.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE:= libavdevice
    LOCAL_SRC_FILES:= $(FFMPEG_LIB_PATH)/libavdevice-57.so
    LOCAL_EXPORT_C_INCLUDES := $(INCLUDE_PATH)
    include $(PREBUILT_SHARED_LIBRARY)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE := ffmpeg
    LOCAL_SRC_FILES := com_jni_FFmpeg.c 
    LOCAL_C_INCLUDES := /home/yhao/sf/ffmpeg-3.3.3
    LOCAL_LDLIBS := -lm -llog
    LOCAL_SHARED_LIBRARIES := libavcodec libavfilter libavformat libavutil libswresample libswscale libavdevice
    include $(BUILD_SHARED_LIBRARY)
    

    对于 Android.mk 文件前面提到过,最好的学习方法就是仔细阅读几遍 Android.mk 官网教程 。 简要说明一下,此文件将之前编译好的 FFmepg 动态库通过 NDK 提供的预编译方式编译,通过 prebuilt 这个单词也能猜到它的含义,点击了解 NDK 预编译, 最后将 com_jni_FFmpeg.c 编译成名为 ffmpeg 的动态库。

    此时 jni 目录下应有以下四个文件:

    这里写图片描述

    请无视 Android.mk 文件上的小锁儿~ 。然后在 jni 目录下运行 (注意要把 ndk 添加到环境变量) :

    ndk-build
    

    大功告成 ,此时在 ndkBuild 目录下生成了 libs 和 obj 目录,而 Android 需要的最终的动态库就在 libs 目录下:

    5. 在Java 程序中加载该动态链接库

    将 libs 目录下的 armeabi 文件夹整体拷贝到 Android Studio 工程的 libs 文件夹下,当然如果你的工程已经存在 armeabi 目录,就把该目录下的动态库拷贝到工程的 armeabi 目录下。

    在 FFmpeg 中加载动态库:

    package com.jni;
    
    
    public class FFmpeg {
    
        static {
            System.loadLibrary("avutil-55");
            System.loadLibrary("avcodec-57");
            System.loadLibrary("avformat-57");
            System.loadLibrary("avdevice-57");
            System.loadLibrary("swresample-2");
            System.loadLibrary("swscale-4");
            System.loadLibrary("postproc-54");
            System.loadLibrary("avfilter-6");
            System.loadLibrary("ffmpeg");
        }
    
        public static native void run();
    }
    
    

    记得在应用的 build.gradle 文件中 android 节点下添加动态库加载路径:

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

    然后在程序中调用 FFmpeg.run() 方法 ,可以看到 logcat 输出了 FFmpeg 的编解码信息:

    这里写图片描述

    总结

    这篇文章较多篇幅介绍了 JNI 相关的基础知识,对 JNI 经验缺乏的人应该会有较多帮助,尤其是交叉编译和 CPU 架构部分,如果一个月前的我看到估计都感激涕零了,当初一脸茫然的按照网上的教程集成,殊不知不了解这些知识是真的愣头青。

    此文中仅仅实现了 Android 端获取 FFmpeg 编解码信息,而要实际使用的话,就要掌握 FFmpeg 提供的函数或者通过命令方式调用,后者难度较小,另外还有 libmp3lame 库的编译,下篇文章一起总结。

    关注公众号,Get 更多知识点

    展开全文
  • 1.搭建编译环境 1.安装ubuntu14.04,安装完成后执行以下命令 apt-get update apt-get install yasm ...我用的是ndk r14b,附上下载地址:https://dl.google.com/android/repository/android-ndk-r14b-linux-x8...
  • 最简单的基于FFmpeg的移动端例子:Android HelloWorld

    万次阅读 多人点赞 2015-07-23 20:09:22
    从本文开始打算记录一系列FFmpegAndroid/IOS开发的示例程序。前面几篇文章记录FFmpeg安卓端开发的例子,后面几篇文章记录FFmpeg IOS端开发的例子。这些例子中FFmpeg相关的代码源自于《FFmpeg示例合集》中的程序。...
  • Android 集成 FFmpeg (二) 以命令方式调用 FFmpeg

    万次阅读 热门讨论 2017-08-29 12:00:50
    网上教程实现 FFmpeg 内部日志输出到 logcat 的并不多,但这一步是十分有必要的。很多教程中需要将 ffmpeg 中的 main 方法名字修改为 "run" 、"exec" 等等,其实完全没必要,为什么要对方法名这么在意,乃至不惜徒增...
  • FFmpeg4AndroidFFmpegAndroid端的使用

    千次阅读 2017-12-26 19:35:25
    3 FFmpegAndroid端的使用 3.1 编写Java端代码 创建HelloFFmpeg项目,修改MainActivity代码,准备调用C语言函数。使用JNI调用C语言代码有两点需要做的步骤: 1)声明C语言函数对应的Java函数; 2)声明要加载...
  • 利用FFmpeg玩转Android视频录制与压缩(一)

    万次阅读 多人点赞 2017-03-19 00:02:43
    Android下利用FFmpeg玩转视频录制与压缩(一) 说明: 本库暂时是在秒拍开源库上做的二次开发,旨在开发简单好用高效的视频录制库。本篇文档只涉及Java层次逻辑,正在业余修炼c语言与JNI相关的东西,如果有幸写第...
  • 编译Android下可执行命令的FFmpeg

    万次阅读 热门讨论 2017-06-07 22:36:22
    本人环境与工具: ...本文是经过实战总结出的经验,本文将用两种方式编译可以在Android下执行命令的FFmpeg,一种是传统的ndk-build工具,一种是cmake工具,经过我的项目实战,非常推荐cmake,因为AS
  • Android集成FFmpeg并实现视频转码

    万次阅读 热门讨论 2019-03-28 16:07:14
    Android Studio中新建工程,选择Native C++ 在工程的\app\src\main\cpp\目录下新建ffmpeg目录,将编译好的.so文件和头文件拷贝到此目录,还需要将FFmpeg源码根目录下的config.h和以下文件拷贝到此目录: fftools\...
  • FFmpegAndroid平台移植—编译篇

    万次阅读 多人点赞 2014-04-01 19:11:20
    FFmpegAndroid平台移植—编译篇 Dennis Hu 2014年3月28日 摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程。 环境准备: Ubuntu12.04 TLS android-ndk-r9d-linux-x86_64.tar.bz...
  • android ffmpeg视频硬解码例子

    千次阅读 热门讨论 2018-03-19 23:38:47
    android ffmpeg mediacodec 硬解码 ffmpeg 3.1以后 ffmpeg加入了硬解。 用法其实很简单,首先编译一个带硬解码的ffmpeg 库文件。 #!/bin/bash PLATFORM=/Users/lake/test/android-ndk-r14b/platforms/android-...
  • 本例基于 android全平台编译ffmpeg合并为单个库实践 进行的 目录 环境准备 新建cmd工程 修改源文件 运行输出 环境准备 操作系统 ubuntu 16.05 编译准备好libffmpeg库和需要include头文件,我们还需要抽取ffmpeg-...
  • Android录屏并利用FFmpeg转换成gif(三) 写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方式还是比较困难的。本来...
  • FFmpeg编译成Android动态库

    万次阅读 2018-05-14 15:51:08
    项目需要,网上也有现成的FFmpeg Android动态库,但是本着亲力亲为的宗旨,做了不断地尝试,最终也是成功了,在此做一个笔记,以备日后查阅。 附上给我帮助的资料链接: 王英豪大神的博客 雷霄骅大神的博客 因为...
  • 实现android ffmpeg播放视频

    千次阅读 2019-05-12 16:02:43
    前面两篇文章已经可以生成so,并且可以在Android studio中通过配置可以运行,并且可以打印出ffmpeg的配置信息。 准备: 在进行播放视频时需要一个吧yuv图像数据转换成argb的图像数据,这里还需要一个libyuv.so 的一...
  • 最简单的基于FFmpeg的移动端例子:Android 推流器

    万次阅读 多人点赞 2015-07-25 14:10:50
    本文记录一个安卓平台下基于FFmpeg的视频推流器。该推流器C语言的源代码来自于《最简单的基于FFMPEG的推流器》... Android程序Java端代码位于src\com\leixiaohua1020\sffmpegandroidstreamer\MainActivity.java,如下
  • Android Java调用ffmpeg命令

    千次阅读 2017-02-23 17:45:19
    0. 前言ffmpeg命令很强大,但是在Android工程中无法执行可执行文件ffmpeg,即无法使用ffmpeg。 本文介绍把ffmpeg改造成库文件,然后通过JNI调用它,即可实现在Java中使用ffmpeg命令。PS: 本工程依赖于前文Android...
  • Android FFmpeg系列——1 播放视频

    千次阅读 2018-10-16 17:54:42
    由于公司项目原因,现在才得空来学习关于FFmpeg库的使用。...Android Studio 创建Demo项目,记得把 “Include c++ support” 勾上。 这里主要说2点: 项目目录结构; 文件配置,主要是app模块build.gradle 和 C...
  • 2 FFmpeg编译(Windows + Linux) 各操作系统编译环境介绍: - Windows:需要用到MinGW+msys或Cygwin; - Linux(推荐):有现成的命令可使用,省去很多麻烦(Windows下可装虚拟机或买云主机); - Mac:与...
  • android 引入ffmpeg

    千次阅读 2019-02-15 09:25:06
    android studio 3.2.1 ndk: 15.2.4203891 新建一个工程 新建工程时,勾选 c++支持 将文件复制到项目内 需要复制的文件 .h 头文件 so文件 在 cpp 中新建一个文件夹include/ffmpeg 把 include 中的文件...
  • Android cmake编译FFmpeg

    2018-10-06 20:54:41
    Android cmake编译FFmpeg 项目地址 通过阅读本文,你将学到以下内容: 如何编译多种CPU指令集的FFmpeg动态库 如何配置CMakeLists.txt和build.gradle构建Android项目 编译环境 ndk-r16 ffmpeg-4.0.2 一、交叉编译...
  • 目录 编译环境 配置config.sh脚本 配置合并脚本build_ffmpeg_merge.sh ...android-ndk-r10e ...注意 这里如果使用高版本比如android-ndk-r16b 编译会报错 ...ffmpeg-3.3.8版本 ...export ANDROID_NDK_ROOT=/home...
  • Android开发学习之路--Android Studio cmake编译ffmpeg

    万次阅读 热门讨论 2016-10-20 22:33:00
    最新的android studio2.2引入了cmake可以很好地实现ndk的编写。...1.ffmpeg编译  进入正题,既然是ffmpeg的移植编译,那么就先下载ffmpeg,https://ffmpeg.org/download.html#releases。这里下载
  • Android Studio通过cmake创建FFmpeg项目

    千次阅读 热门讨论 2017-07-15 00:02:54
    我的视频课程(基础):《(NDK)FFmpeg打造Android万能音频播放器》 我的视频课程(进阶):《(NDK)FFmpeg打造Android视频播放器》 我的视频课程(编码直播推流):《Android视频编码和直播推流》 我的视频...
  • androidFfmpeg解码实时流

    热门讨论 2018-04-27 13:57:35
    android 使用Ffmpeg 解码实时播放视频流,支持RTSP,RTMP,海康主码流高清画质,使用时,在startActivity中修改代码:startActivity(Intent(this@StartActivity, PlayVideoActivity::class.java))为startActivity...
  • android平台,利用ffmpegandroid摄像头采集编码demo,

空空如也

1 2 3 4 5 ... 20
收藏数 2,849,885
精华内容 1,139,954
关键字:

andrid