㈠ android TV 盒子APP开发(一)--连接机顶盒与常用adb命令
1.进入机顶盒设置页,打开开发者模式,开枝郑启调试模式
2.查看机顶盒的ip地址,保证电脑和机顶盒在同一网络
3.使用Android Studio的Terminal输入命令
adb connect 192.168.198.178:5555(ip为机顶盒的ip地址,端口号默认为5555)
4.如果报错refuse connect 说明没有获得机顶盒的调试权限,需要和厂家联系,开启权限,或输入adb root开启root权限
1.连接机顶盒:adb connect 192.168.198.178:5555(ip为机顶盒的猛陆颂ip地址,端口号默认为5555)
2.查看连接的计算机设备的信息:adb devices
3.重启设备:adb reboot
4.查看log: adb logcat
5.终止adb服务进程:adb kill-server
6.重启adb服务进程:adb start-server
7.查看cpu信息:adb shell cat /proc/cpuinfo
8.安装apk:adb install <apkfile>//adb install mytest.apk
9.保留数据和缓存文件,重新安装apk:adb install -r <apkfile> //adb install -r mytest.apk
10.卸载apk:adb uninstall <package>
11.卸载app但保留数据和缓存文件:adb uninstall -k <package> //adb uninstall -k com.mytest.cn
12.查看设备cpu和内存占用情况:adb shell top
13.查看占用内存前5的app:悉野adb shell top -m 5
14.杀死一个进程:adb shell kill [pid]
更多adb命令查看:
1. Android ADB命令大全(通过ADB命令查看wifi密码、MAC地址、设备信息、操作文件、查看文件、日志信息、卸载、启动和安装APK等) | 张明云的博客
2. GitHub - mzlogin/awesome-adb: ADB Usage Complete / ADB 用法大全
㈡ Android TV-电视开发知识点速览
原文链接: Android-Tv
本文总结 Android-TV 开发过程中,常见的基础知识点。主要分为TV-UI,IPTV,OTT,DVB,TVOS,DEBUG等几大模块展开。适用于常见盒子,电视,投影仪等TV开发。
开局一张图,直接上脑图
Android TV 界面开发有别与传统的移动手机端开发,TV端的交互主要是有用户遥控器操作完成,因而在TV上按键和焦点的处理显得尤为重要,其次TV端的输出显示媒介主要是电视显示屏,不同的电视所能支持的输入显示分辨率也不一样,因而分辨率的适配也是TV界面开发需要考虑的一点,除此之外TV界面的设计也与手机上的小屏显示不一样,由于是大屏显示,对UI的设计需更加偏平话,便捷化。
IPTV概念的普及,国内主要靠电信,联通,移动,广电四大宽带运营商。IPTV主要特点如下:
OTT的概率,国内主要靠互联网行业推动,类似小米/乐视电视,盒子,创维,康佳,海信等智能电视。OTT主要特点如下:
DVB的概念,存在时间最早,即传统的广电业务。DVB系统按照信号传播的顺序可以分成前端系统,传输系统和终端系统。其中前端系统一般位于节目生产部门(例如电视台等部门),而终端系统一般用户设备中(例如机顶盒)
区别于传送方式的不同,DVB的通用国际标准又可以分为以下:
DVB标准中描述的系统根据所属的层次不同从上层到底层可以分为:音视频编码层,服务信息层,基带传输层,信道编码层,射频层。对于Android开发而言,主要涉及的为服务信息层。服务信息层主要分为:
PSI信息由节目关联表PAT、条件接收表CAT、节目映射表PMT和网络信息表NIT组成,这些表会被插入到TS流中。 PSI信息是对单一TS流的描述,它是TS流的引导信息;PSI信息指定了如何从一个携带多个节目的传输流中找到指定的节目。 下面给出的是节目引导信息(或称节目特定信息,PSI)的四个表结构
PSI只提供了单个TS流的信息,使接收机能够对单个TS流中的不同节目进行解码; 但是,它不能提供多个TS流的相关业务,也不能提供节目的类型、节目名称、开始时间、节目简介等信息。 因此,DVB对PSI进行了扩展,提供了其他不同类型的表,形成了SI。
SI定义的表,并不需要全部传输, 其中,SDT、EIT和TDT是必须传输的; 而又以SDT和EIT最为重要,利用这2个表可以构成功能不同的EPG, 如提供节目附加信息、节目分类、节目预定和家长分级控制等。
S 业务I信息表分为以下几类:
DVB的搜台从用户角度来说,一般可以分为自动搜台,全频点搜台,手动搜台。其中手动搜台实质是单频点搜台,自动搜台是检索到ts流里面的频点信息后,还是回到单频点搜台,全频点搜台一般是固定了频率的数组,依次扫描单频点。
机顶盒搜台的实质是从TS流中获取并存储每套节目的音视频PID值和构建出电子节目节目指南。
以下总结三种搜台实现流程:
播放主要分为大屏播放以及画中画播放,一直搞不懂为啥还要有画中画这种业务场景的需求。画中画一般需要双demux支持。
dvb的播放流程与传统的播放器调用有所差别,一般需要底层,jni层封装单独的播放器接口调用。
dvb播放需传入频点信息,音视频pid,以及音视频类型等。
先看下官方简介-NGB TVOS,全称Next Generation Broadcasting Network TVOS,是中华人民共和国国家新闻出版广电总局科技司带头研发的基于Linux和安卓系统的一套应用于网络电视的操作系统。其开发者自称“兼顾现有操作系统的技术,比如Linux、安卓”,并增加信息安全模块,加强用户的信息安全保障,是专门针对电视终端的操作系统。
根据以上描述,结合NGB相关规范,不难看出,TVOS其实还是基于Android系统开发改造,主要是通用规范了中间层接口规范,为硬件软件厂家集成通用接口。
一套完整的TVOS系统,基本集合了DVB+IPTV的业务功能。TVOS应用层面基本覆盖如下几个方面
TV端的开发调试工作,与手机端也有些差异,TV端调试方式大致如下:
㈢ Android TV(一)(入门准备)
以下内容是对Google Android TV文档的翻译,可能存在错误,请读者以官方文档为准
官方地址
在文档中Google对Android TV的提出了许多要求,如果你只是使用它的一些UI元素,你可以不用太注意这些要求。
官方地址 镜像地址
TV应用在手机和平板电脑上使用相同的项目结构。这意味着你可以修改已经存在的应用使其在电视设备上运行或者在你已知的Android知识上创建新的应用。这部分内容主要是准备开发环境和开发TV应用的一些最低要求。(开发TV应用和手机应用本质是一致的,下面的一些要求只是你要使用到一些Google的库(Leanback support)或者要将应用在GooglePlay上线,否则,要求不必遵守)
Supported Media Formats
DRM
android.drm
ExoPlayer
android.media.MediaPlayer
这一部分主要关于如何修改一个已存在的Android项目或者创建一个新的项目。
下面是让app在电视设备上运行的主要部分:
1.Activity for TV,在manifest中声明一个activity。
2.TV Support Libraries
1.SDK tools version 24.0.0 或者更高
2.SDK with android5.0 或者更高
3.创建或更新项目(如果你要修改已存在的Android项目应该是该项目的target为5.0或者更高)
可以兼容到API17
如果一个应用打算运行在电视设备上它必须在manifest文件中声明一个TV activity。如下:
如果设置required属性为true,你的APP在设备上将只运行leanback ui。
运行在TV设备上的应用不需要通过触摸屏幕来输入。
v17 leanback library 为电视应用程序提供用户界面部件,特别是用于媒体播放的应用程序。
v7 recyclerview library
v7 cardview library
在完成上述步骤之后,是时候开始为大屏幕构建应用程序了!检查这些额外的主题,以帮助您建立您的应用程序的电视:
构建电视播放应用
帮助用户搜索内容
Building TV Games
Building TV Channels
㈣ android系统编译jar包给app使用
最近在android O编译系统jar包给应用使用遇到了点问题,网上也没有找到解决方案,这里记录下。
编译方法参考网上博客就可以, android源码编译jar包
最终生成了javalib.jar,改名为 tvManager.jar即可。注意:如果没有指定LACAL_JACK_ENABLED选项,则默认是enabled,将会生成classes.jack文件,不会产生classes.jar包!
正常按照上面方案就可以编译出jar包,导入到AS里面就可以使用,下面说下我遇到的问题
遇到classes.jar.toc被依赖, 但是怎么编译都没有编译出来,网上也没有找到对应的方法,编译错误如下:
https://www.cnblogs.com/wangqiang9/p/9679466.html
https://stackoverflow.com/questions/43471694/how-to-generate-classes-dex-toc-files
㈤ Andorid TV 开发之连接机顶盒及常用 adb 命令
国内的 Android TV 应用虽然是在 TV 上显示,但是实际上大都运行在各类机顶盒中(当然也可以运行在智能电视本身定制的 Android 系统中),这些机顶盒运行的都是各个厂商基于 Android 各个版本系统定制的 ROM,并不是 Google 原生的Android TV 系统。
开发手机 app 应用,手机开启调试模式,用数据线连上手机,就能对手机进行 debug 开发。然而,机顶盒并没有手机的 micro usb 接口,并不能连数据线进行直接调试(据说,用 USB to USB 数据线连接机顶盒,也无法识别机顶盒),这时需要使用 adb 命令连接和调试机顶盒。打开 Android Studio 的 Terminal 或者 cmd( windows )、终端( mac ),输入 adb 出现如下结果,证明 adb命令可以正常使用,否则参照 adb 错误“ 'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件 ( windows ) 或 在 MAC OS X 安装 ADB (Android 调试桥)
( mac )开启 adb 命令。
如果没有提示任何错误信息,表示连接机顶盒成功,接着输入
adb devices 查看连接的机顶盒的状态信息。
如果提示 xxxxx refused connect 证明还未获取机顶盒的调试权限,需要和机顶盒厂家获取调试工具、开启调试功能的方法、调试端口等(许多机顶盒的厂商都留有调试后门),也可以 root 机顶盒的系统。
adb connect [ip]:[port] 连接机顶盒(默认端口为薯则雀5555)
adb devices 查看所有连接设备 名称、ip、端口已经数早状态( device 或 offline )
adb install [apk 安装包所在路径(如:d:\a.apk)] 将对应路径的 apk 安装包安装到机顶盒
adb install -r [apk 安装包所在路径(如:d:\a.apk)] 将对应路径的apk 安装包强制(覆盖)安装到机顶盒
adb -s [设备名称或设备IP:端口] install [apk 安装包所在路径(如:d:/a.apk)] 当 adb 连接多个设备时,将 apk 安装到指定设备中
adb uninstall [应用包名,例如:com.example.tmall] 卸载应用(通过包名指定)
adb shell 进入系统目录(通过 exit 退出)
adb shell am start -n [包名]/盯碧[包名+类名] 启动指定类名的 Activity
adb shell input text **** 在已经获取焦点的EditText中输入内容
adb shell ps 查看当前终端中的进程信息
adb shell mpsys activity activites 查看当前终端所以前后台Acitivity的堆栈
adb shell logcat > d:\log.txt 打印日志到本地文件(会打印缓存的日志,可能会有昨天等之前日志。windows下,按 ctrl+c 停止日志打印)
adb logcat *:D > d:\log.txt 过滤出 D 级别以上的日志,打印日志到本地文件( 在 macOS 下需要给 *:W 这样以 * 作为 tag 的参数加双引号,如 adb logcat "*:W" )
awesome-adb
Android ADB 命令大全(通过 ADB 命令查看 wifi 密码、MAC 地址、设备信息、操作文件、查看文件、日志信息、卸载、启动和安装 APK 等)
连接上机顶盒的一小步,是机顶盒开发的一大步。
㈥ android 导进来的工程修改源码后怎么编译
1、Android的文件系统结构是怎样的,我们安装的程序放在那里?
编译Android源码之后,在out/target/proct/generic一些文件:
ramdisk.img、system.img、userdata.img、 system、 data、root
其中, system.img是由 system打包压缩得到的, userdata.img是由 data打包压缩得到的。
ramdisk.img是模拟器的文件系统,把ramdisk.img解压出来可知道,ramdisk.img里的文件跟root文件夹的文件基本一样。模拟器装载ramdisk.img并解压到内存,接着分别把system.img和userdata.img挂载到 ramdisk下的system和data目录。我们编译出来的应用程序就是放在system/app下的。用户安装的程序则是放在data/app下。
2、Android SDK和android源码能为我们提供什么工具?
AndroidSDK提供有很多工具,如adb,ddms,emulator,aapt等,并提供kernel-qemu、ramdisk.img、system.img、userdata.img。因此,只要有android SDK,我们就可以在模拟器上把android跑起来。
Android源码可以编译出android SDK、adb等工具、android文件系统,以及ADT插件,也就是说,我们可以从android源码编译出所有android相关的东西。
3、 把Android源 码”make”之后会生成许多工具和android文件系统(system.img等),我们又可以使用“makesdk”来生成android SDK,android
SDK也包括有工具和android文件系统(system.img等),而原来安装的时候我们也安装了androidSDK,那么我们在开发时应该使用那些工具和android文件系统呢?
㈦ android tv 怎么编译
很多开发者可能下载后编译的Android SDK是Linxu下使用的,如何编译Windows下的Android SDK呢? 这里Android123总结如下: 1. 首先必须在Linux下执行完源码下载,就是reop sync后,首先做一次完整编译,执行make,然后编译Linux下的SDK,执行make s...
㈧ Android TV 焦点原理源码解析
相信很多刚接触AndroidTV开发的开发者,都会被各种焦点问题给折磨的不行。不管是学技术还是学习其他知识,都要学习和理解其中原理,碰到问题我们才能得心应手。下面就来探一探Android的焦点分发的过程。
Android焦点事件的分发是从ViewRootImpl的processKeyEvent开始的,源码如下:
源码比较长,下面我就慢慢来讲解一下具体的每一个细节。
dispatchKeyEvent方法返回true代表焦点事件被消费了。
ViewGroup的dispatchKeyEvent()方法的源码如下:
(2)ViewGroup的dispatchKeyEvent执行流程
(3)下面再来瞧瞧view的dispatchKeyEvent方法的具体的执行过程
惊奇的发现执行了onKeyListener中的onKey方法,如果onKey方法返回true,那么dispatchKeyEvent方法也会返回true
可以得出结论:如果想要修改ViewGroup焦点事件的分发,可以这么干:
注意:实际开发中,理论上所有焦点问题都可以通过给dispatchKeyEvent方法增加监听来来拦截来控制。
(1)dispatchKeyEvent方法返回false后,先得到按键的方向direction值,这个值是一个int类型参数。这个direction值是后面来进行焦点查找的。
(2)接着会调用DecorView的findFocus()方法一层一层往下查找已经获取焦点的子View。
ViewGroup的findFocus方法如下:
View的findFocus方法
说明:判断view是否获取焦点的isFocused()方法, (mPrivateFlags & PFLAG_FOCUSED) != 0 和view 的isFocused()方法是一致的。
其中isFocused()方法的作用是判断view是否已经获取焦点,如果viewGroup已经获取到了焦点,那么返回本身即可,否则通过mFocused的findFocus()方法来找焦点。mFocused其实就是ViewGroup中获取焦点的子view,如果mView不是ViewGourp的话,findFocus其实就是判断本身是否已经获取焦点,如果已经获取焦点了,返回本身。
(3)回到processKeyEvent方法中,如果findFocus方法返回的mFocused不为空,说明找到了当前获取焦点的view(mFocused),接着focusSearch会把direction(遥控器按键按下的方向)作为参数,找到特定方向下一个将要获取焦点的view,最后如果该view不为空,那么就让该view获取焦点。
(4)focusSearch方法的具体实现。
focusSearch方法的源码如下:
可以看出focusSearch其实是一层一层地网上调用父View的focusSearch方法,直到当前view是根布局(isRootNamespace()方法),通过注释可以知道focusSearch最终会调用DecorView的focusSearch方法。而DecorView的focusSearch方法找到的焦点view是通过FocusFinder来找到的。
(5)FocusFinder是什么?
它其实是一个实现 根据给定的按键方向,通过当前的获取焦点的View,查找下一个获取焦点的view这样算法的类。焦点没有被拦截的情况下,Android框架焦点的查找最终都是通过FocusFinder类来实现的。
(6)FocusFinder是如何通过findNextFocus方法寻找焦点的。
下面就来看看FocusFinder类是如何通过findNextFocus来找焦点的。一层一层往下看,后面会执行findNextUserSpecifiedFocus()方法,这个方法会执行focused(即当前获取焦点的View)的findUserSetNextFocus方法,如果该方法返回的View不为空,且isFocusable = true && isInTouchMode() = true的话,FocusFinder找到的焦点就是findNextUserSpecifiedFocus()返回的View。
(7)findNextFocus会优先根据XML里设置的下一个将获取焦点的View ID值来寻找将要获取焦点的View。
看看View的findUserSetNextFocus方法内部都干了些什么,OMG不就是通过我们xml布局里设置的nextFocusLeft,nextFocusRight的viewId来找焦点吗,如果按下Left键,那么便会通过nextFocusLeft值里的View Id值去找下一个获取焦点的View。
可以得出以下结论:
1. 如果一个View在XML布局中设置了focusable = true && isInTouchMode = true,那么这个View会优先获取焦点。
2. 通过设置nextFocusLeft,nextFocusRight,nextFocusUp,nextFocusDown值可以控制View的下一个焦点。
Android焦点的原理实现就这些。总结一下:
为了方便同志们学习,我这做了张导图,方便大家理解~
㈨ android编译命令的说明
android源码目录下的build/envsetup.sh文件,描述编译的命令
- m: Makes from the top of the tree.
- mm: Builds all of the moles in the current directory.
- mmm: Builds all of the moles in the supplied directories.
要想使用这些命令,首先需要设置android脚本编译环境,在源码根目录执行 source build/envsetup.sh
m:编译所有的模块
mm:编译当前目录下的模块,当前目录下要有Android.mk文件
mmm:编译指定路径下的模块,指定路径下要有Android.mk文件
下面举个例子说明,假设我要编译android下的\framework\av\cmds\screenrecord模块,
当前目录为源码根目录,方法如下:
1、source build/envsetup.sh
2、mmm framework/av/cmds/screenrecord
或者 :
1、source build/envsetup.sh
2、cd framework/av/cmds/screenrecord
3、mm
㈩ Android APK编译流程
apk 是Android Package的简写, 在平时的开发过程中,通过点击 Run app 按钮 或者 在命令行中输入
这样Android Studio就会启动构建流程,最终输出一个我们想要的APK。
直达官网介绍
对于小白来说,上面一张图已经可以解释apk的构建过程了,不过对于Andoid开发者而言还需要了解一些更详细的构建过程。
详细的对应步骤 和 使用工具如下:
资源文件(res文件夹下的文件)通过 AAPT(Android Asset Packaging Tool)打包生成R.java类(资源索引表)、.arsc资源文件 和res文件。
resources.arsc 是一个App的资源索引表,通过R.java 文件 和 resources.arsc 可以定位到资源的内存地址,resources.arsc文件的作用是通过一样的ID,根据不同的配置索引到最佳的资源显示在UI中。
AIDL (Android Interface Definition Language), 是Android接口定义语言,是Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。
如果有aidl文件,这个阶段会生成对应的Java接口文件。
R.java文件、工程源码文件、aidl.java文件, 在这一步通过javac生成.class文件。
源码.class文件和第三方jar或者library通过dx工具打包成dex文件
Android系统的Dalvik虚拟机的可执行文件为DEX格式,所以这里会将上一步中生成的.class文件 和 引用的第三方jar等过程中的.class 一起通过dx工具打包成dex文件
apkbuilder工具会将所有没有编译的资源、.arsc资源、.dex文件打包到一个完成apk文件中
tips:
apksigner工具会对未签名的apk验证签名。得到一个签名后的apk(signed.apk)
apksigner 是google 退出的V2签名方式
Jarsigner 是之前一直使用的V1签名方式
可以通过在命令行中输入apksigner --help来获取详情信息,如果没有特殊需求,使用下面命令即可完成签名
release mode 下使用 aipalign进行align,即对签名后的apk进行对齐处理
所谓对齐,主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用主要是为了减少运行时内存的使用。
zipalign是一个android平台上整理APK文件的工具,它对apk中未压缩的数据进行4字节对齐,对齐后就可以使用mmap函数读取文件,可以像读取内存一样对普通文件进行操作。如果没有4字节对齐,就必须显式的读取,这样比较缓慢并且会耗费额外的内存。
参考文章:
Android-Studio配置构建
浅谈Android打包流程
apk打包流程
END!