㈠ 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!