導航:首頁 > 源碼編譯 > androiduvc庫源碼分析

androiduvc庫源碼分析

發布時間:2022-05-14 01:24:34

『壹』 android app 如何與uvc攝像頭通訊

來看看是怎麼操作UVC攝像頭的吧.我們實現了一個專門檢測UVC攝像頭的服務:UVCCameraService類,主要代碼如下:
監聽
mUSBMonitor = new USBMonitor(this, new USBMonitor.OnDeviceConnectListener() { @Override
public void onAttach(final UsbDevice device) {
Log.v(TAG, "onAttach:" + device);
mUSBMonitor.requestPermission(device);
} @Override
public void onConnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock, final boolean createNew) {
releaseCamera(); if (BuildConfig.DEBUG) Log.v(TAG, "onConnect:"); try { final UVCCamera camera = new MyUVCCamera();
camera.open(ctrlBlock);
camera.setStatusCallback(new IStatusCallback() { // ... uvc 攝像頭鏈接成功

Toast.makeText(UVCCameraService.this, "UVCCamera connected!", Toast.LENGTH_SHORT).show(); if (device != null)
cameras.append(device.getDeviceId(), camera);
}catch (Exception ex){
ex.printStackTrace();
}
} @Override
public void onDisconnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock) { // ... uvc 攝像頭斷開鏈接
if (device != null) {
UVCCamera camera = cameras.get(device.getDeviceId()); if (mUVCCamera == camera) {
mUVCCamera = null;
Toast.makeText(UVCCameraService.this, "UVCCamera disconnected!", Toast.LENGTH_SHORT).show();
liveData.postValue(null);
}
cameras.remove(device.getDeviceId());
}else {
Toast.makeText(UVCCameraService.this, "UVCCamera disconnected!", Toast.LENGTH_SHORT).show();
mUVCCamera = null;
liveData.postValue(null);
}
} @Override
public void onCancel(UsbDevice usbDevice) {
releaseCamera();
} @Override
public void onDettach(final UsbDevice device) {
Log.v(TAG, "onDettach:");
releaseCamera();// AppContext.getInstance().bus.post(new UVCCameraDisconnect());
}
});

這個類主要實現UVC攝像頭的監聽\鏈接\銷毀\反監聽.當有UVC攝像頭鏈接成功後,會創建一個mUVCCamera對象.
然後在MediaStream里, 我們改造了switchCamera,當參數傳2時,表示要切換到UVCCamera(0,1分別表示切換到後置\前置攝像頭).
創建
在創建攝像頭時,如果是要創建uvc攝像頭,那直接從服務裡面獲取之前創建的mUVCCamera實例:
if (mCameraId == 2) {
UVCCamera value = UVCCameraService.liveData.getValue(); if (value != null) { // uvc camera.
uvcCamera = value;
value.setPreviewSize(width, height,1, 30, UVCCamera.PIXEL_FORMAT_YUV420SP,1.0f); return; // value.startPreview();
}else{
Log.i(TAG, "NO UVCCamera");
uvcError = new Exception("no uvccamera connected!"); return;
} // mCameraId = 0;
}123456789101112131415

預覽
在預覽時,如果uvc攝像頭已經創建了,那執行uvc攝像頭的預覽操作:
UVCCamera value = uvcCamera;if (value != null) {
SurfaceTexture holder = mSurfaceHolderRef.get(); if (holder != null) {
value.setPreviewTexture(holder);
} try {
value.setFrameCallback(uvcFrameCallback, UVCCamera.PIXEL_FORMAT_YUV420SP/*UVCCamera.PIXEL_FORMAT_NV21*/);
value.startPreview();
cameraPreviewResolution.postValue(new int[]{width, height});
}catch (Throwable e){
uvcError = e;
}
}1234567891011121314

這里我們選的colorFormat為PIXEL_FORMAT_YUV420SP 相當於標准攝像頭的NV21格式.
關閉預覽
同理,關閉時,調用的是uvc攝像頭的關閉.
UVCCamera value = uvcCamera; if (value != null) {
value.stopPreview();
}1234

銷毀
因為我們這里並沒有實質性的創建,所以銷毀時也僅將實例置為null就可以了.
UVCCamera value = uvcCamera;if (value != null) { // value.destroy();
uvcCamera = null;
}12345

有了這些操作,我們看看上層怎麼調用,
首先需要在Manifest裡面增加若干代碼,具體詳見UVCCamera工程說明.如下:
<activity android:name=".UVCActivity" android:launchMode="singleInstance">

<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>

<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />

</activity>

然後,的代碼在UVCActivity里,這個類可以在library分支的myapplication工程里找到.即這里.
啟動或者停止UVC攝像頭推送:
public void onPush(View view) { // 非同步獲取到MediaStream對象.
getMediaStream().subscribe(new Consumer<MediaStream>() { @Override
public void accept(final MediaStream mediaStream) throws Exception { // 判斷當前的推送狀態.
MediaStream.PushingState state = mediaStream.getPushingState(); if (state != null && state.state > 0) { // 當前正在推送,那終止推送和預覽
mediaStream.stopStream();
mediaStream.closeCameraPreview();
}else{ // switch 0表示後置,1表示前置,2表示UVC攝像頭
// 非同步開啟UVC攝像頭
RxHelper.single(mediaStream.switchCamera(2), null).subscribe(new Consumer<Object>() { @Override
public void accept(Object o) throws Exception { // 開啟成功,進行推送.
// ...
mediaStream.startStream("cloud.easydarwin.org", "554", id);
}
}, new Consumer<Throwable>() { @Override
public void accept(final Throwable t) throws Exception { // ooop...開啟失敗,提示下...
t.printStackTrace();
runOnUiThread(new Runnable() { @Override
public void run() {
Toast.makeText(UVCActivity.this, "UVC攝像頭啟動失敗.." + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
});
}

這樣,整個推送就完成了.如果一切順利,應當能在VLC播放出來UVC攝像頭的視頻了~~
我們再看看如何錄像.也非常簡單…
public void onRecord(View view) { // 開始或結束錄像.
final TextView txt = (TextView) view;
getMediaStream().subscribe(new Consumer<MediaStream>() { @Override
public void accept(MediaStream mediaStream) throws Exception { if (mediaStream.isRecording()){ // 如果正在錄像,那停止.
mediaStream.stopRecord();
txt.setText("錄像");
}else { // 沒在錄像,開始錄像...
// 表示最大錄像時長為30秒,30秒後如果沒有停止,會生成一個新文件.依次類推...
// 文件格式為test_uvc_0.mp4,test_uvc_1.mp4,test_uvc_2.mp4,test_uvc_3.mp4
String path = getExternalFilesDir(Environment.DIRECTORY_MOVIES) + "/test_uvc.mp4";
mediaStream.startRecord(path, 30000); final TextView pushingStateText = findViewById(R.id.pushing_state);
pushingStateText.append("\n錄像地址:" + path);
txt.setText("停止");
}
}
});
}21

UVC攝像頭還支持後台推送,即不預覽的情況下進行推送,同時再切換到前台繼續預覽.只需要調用一個介面即可實現,如下:
@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
ms.setSurfaceTexture(surfaceTexture); // 設置預覽的surfaceTexture}@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
ms.setSurfaceTexture(null); // 設置預覽窗口為null,表示關閉預覽功能
return true;
}123456789

如果要徹底退出uvc攝像頭的預覽\推送,那隻需要同時退出服務即可.
public void onQuit(View view) { // 退出
finish(); // 終止服務...
Intent intent = new Intent(this, MediaStream.class);
stopService(intent);
}1234567

## 獲取更多信息 ##

『貳』 如何讀懂和分析Android的logcat以及stack traces

一般在平時工作中,基本上很多代碼可以在eclipse+ndk進行調試,但如果需要用到具體的硬體設備,如媒體播放設備無法模擬的情況下,只能上硬體(盒子或手機)上進行調試。此時唯一的調試手段就是logcat產生log信息進行分析問題了。
什麼時候會有Log文件的產生 ?一般在如下幾種情況會產生log文件 。
1、程序異常退出 uncaused exception
2、程序強制關閉 Force Closed (簡稱FC)
3、程序無響應 Application No Response(簡稱ANR),一般主線程超過5秒么有處理就會ANR
4、手動生成
進入控制台輸入:logcat命令即可進行輸出
第一部分
1、分析工具介紹
a、cat /proc/meminfo 顯示基本的內存信息
------ MEMORY INFO (/proc/meminfo) ------
MemTotal: 285184 kB
MemFree: 106360 kB
Buffers: 0 kB
Cached: 60036 kB
SwapCached: 0 kB
Active: 98160 kB
Inactive: 49100 kB
Active(anon): 87260 kB
Inactive(anon): 288 kB
Active(file): 10900 kB
Inactive(file): 48812 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 87240 kB
Mapped: 26500 kB
Shmem: 324 kB
Slab: 13340 kB
SReclaimable: 1672 kB
SUnreclaim: 11668 kB
KernelStack: 2160 kB
PageTables: 5600 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 142592 kB
Committed_AS: 1065600 kB
VmallocTotal: 417792 kB
VmallocUsed: 137700 kB
VmallocChunk: 254980 kB
重點關注這下面幾個值:
MemTotal: 285184 kB //總計物理內存的大小
MemFree: 106360 kB //可用內存有多少
Buffers: 0 kB //磁碟緩存內存的大小
Cached: 60036 kB
# free
free
total used free shared buffers
Mem: 285184 178884 106300 0 0
Swap: 0 0 0
Total: 285184 178884 106300
linux中有這么一種思想,內存不用白不用,因此它盡可能的cache和buffer一些數據,以方便下次使用。
但實際上這些內存也是可以立刻拿來使用的。
所以空閑內存=free+buffers+cached=total-used
還有幾個命令可使用:
/proc/meminfo 機器的內存使用信息
/proc/pid/maps pid為進程號,顯示當前進程所佔用的虛擬地址。
/proc/pid/statm 進程所佔用的內存
b、查看進程信息
------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------
能夠實時顯示系統中各個進程的資源佔用狀況,類似於 Windows 的任務管理器
c、android提供的一些操作工具
------ PROCRANK (procrank) ------
------ PROCMEM (procmem) ------
------ SHOWMAP (showmap) ------
... 就不一一列舉了,有興趣的朋友可以去看看
這此工具的代碼位於android的 /system/extras
d、虛擬內存的查看工具
------ VIRTUAL MEMORY STATS (/proc/vmstat) ------
------ VMALLOC INFO (/proc/vmallocinfo) ------
2、時間信息,也是我們主要分析的信息
格式如下:
------ SYSTEM LOG (logcat -b system -v time -d *:v) ------
$:logcat -b system -v time -d *:v
01-02 08:00:02.570 I/SystemServer( 957): Notification Manager
01-02 08:00:02.570 I/SystemServer( 957): Device Storage Monitor
01-02 08:00:02.580 I/SystemServer( 957): Location Manager
01-02 08:00:02.580 I/SystemServer( 957): Search Service
01-02 08:00:02.590 I/SystemServer( 957): DropBox Service
01-02 08:00:02.590 I/SystemServer( 957): Wallpaper Service
3、虛擬機信息,包括進程的,線程的跟蹤信息,這是用來跟蹤進程和線程具體點的好地方 。
------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-15 16:49:02) ------
------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02) ------
格式如下 :
----- pid 1516 at 1970-01-02 08:03:07 -----
Cmd line: com.ipanel.join.appstore
DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x4001f188 self=0xd028
| sysTid=1516 nice=0 sched=3/0 cgrp=[fopen-error:2] handle=-1345017744
第二部分
如何分析log信息
1、查找錯誤信息的關鍵字眼
"error" "failxx" "E/" 等的錯誤信息
將這些問題先行解決掉
2、動態庫死機
查看類似的「Build fingerprint:」這些關鍵字
I/DEBUG ( 692): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 692): Build fingerprint: 'generic/generic/generic:2.3.1/GRH78/eng.userdev-rd6-input.20120221.113348:eng/test-keys'
I/DEBUG ( 692): pid: 694, tid: 694 >>> /system/bin/mediaserver <<<
I/DEBUG ( 692): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000input mole init -->
010
對於這此信息,可以查看動態庫的分析:
http://blog.csdn.net/andyhuabing/article/details/7074979
3、解決java拋異常的問題解決
E/UsbObserver( 957): java.lang.NullPointerException
E/UsbObserver( 957): at com.android.server.UsbObserver.init(UsbObserver.java:131)
E/UsbObserver( 957): at com.android.server.UsbObserver.<init>(UsbObserver.java:65)
E/UsbObserver( 957): at com.android.server.ServerThread.run(SystemServer.java:419)
I/SystemServer( 957): UI Mode Manager Service
這個直接找到java代碼,分析其實現即可解決
4、ANR問題
搜索「ANR」關鍵詞,快速定位到關鍵事件信息 。
定位到關鍵的事件信息如下:
I/dalvikvm( 1014): Wrote stack traces to '/data/anr/traces.txt'
I/Process ( 957): Sending signal. PID: 1124 SIG: 9

指定哪個java包出問題
E/ActivityManager( 957): ANR in com.ipanel.join.appstore
進程號為957發生了如下錯誤:com.ipanel.join.appstore 包下面 Broadcast問題
ANR原因:
E/ActivityManager( 957): Reason: Broadcast of Intent { act=android.appwidget.action.APPWIDGET_UPDATE cmp=com.ipanel.join.appstore/.widget.SmallWidget1 (has extras) }
這是ANR的堆棧調用文件
I/dalvikvm( 1014): Wrote stack traces to '/data/anr/traces.txt'
通過上面的log信息分析,應該是接收一個廣播消息時超時了
我們再分析虛擬機信息 ,打開/data/anr/traces.txt,可有通過adb pull /data/anr/traces.txt .
這里每一段都是一個線程 ,當然我們還是看線程號為1的主線程了。通過分析發現關鍵問題是這樣:
搜索「DALVIK THREADS」關鍵詞,快速定位到本應用程序的虛擬機信息日誌
----- pid 1516 at 1970-01-02 08:03:07 -----
Cmd line: com.ipanel.join.appstore
DALVIK THREADS:
。。。
at com.ipanel.join.appstore.widget.AbsSmallWidget.getRemoteViews(AbsSmallWidget.java:56)
其實從這句話:
at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
基本上確認是 socket ->connect 連接超時了,導致主線程5s內沒有響應從而產生ANR錯誤。默認的connect連接timeout時間是75s
其實解決辦法就是利用非阻塞方式進行連接即可。
從CPU佔用率上也可以看出是在kernel中執行堵塞住了
E/ActivityManager( 957): 75% TOTAL: 4.7% user + 70% kernel
5、執行DexOpt錯誤
W/dalvikvm( 1803): DexOpt: --- END 'SettingsProvider.apk' --- status=0x000a, process failed
E/dalvikvm( 1803): Unable to extract+optimize DEX from '/system/app/SettingsProvider.apk'
。。。。android.app.ActivityThread.installProvider(ActivityThread.java:3557)

E/SystemServer( 1803): at android.app.ActivityThread.getProvider(ActivityThread.java:3356)
從上面的列印看,是在解壓或優化extract+optimize DEX的apk文件時出錯了
1、沒有出現magic number錯誤,這個原因與原子操作無關(這是一快速的加鎖和解鎖的輕量級操作函數)
2、執行dexopt出錯
查明是伺服器硬碟沒空間了,導致引導文件系統的時候沒有空間進行解壓而失敗
6、系統啟動後默認其妙或隨機死機情況
出現這種錯誤:
12-01 08:11:56.027: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:11:57.315: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:11:59.318: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:12:03.332: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:12:05.329: WARN/SharedBufferStack(312): waitForCondition(LockCondition) timed out (identity=19, status=0). CPU may be pegged. trying again.
12-01 08:12:07.216: WARN/KeyCharacterMap(312): No keyboard for id 0
12-01 08:12:07.216: WARN/KeyCharacterMap(312): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

『叄』 大牛們是怎麼閱讀 Android 系統源碼

由於工作需要大量修改framework代碼, 在AOSP(Android Open Source Project)源碼上花費了不少功夫, Application端和Services端都看和改了不少.
如果只是想看看一些常用類的實現, 在Android包管理器里把源碼下載下來, 隨便一個IDE配好Source Code的path看就行.
但如果想深入的了解Android系統, 那麼可以看下我的一些簡單的總結.

知識
Java
Java是AOSP的主要語言之一. 沒得說, 必需熟練掌握.
熟練的Android App開發
Linux
Android基於Linux的, 並且AOSP的推薦編譯環境是Ubuntu 12.04. 所以熟練的使用並了解Linux這個系統是必不可少的. 如果你想了解偏底層的代碼, 那麼必需了解基本的Linux環境下的程序開發. 如果再深入到驅動層, 那麼Kernel相關的知識也要具備.
Make
AOSP使用Make系統進行編譯. 了解基本的Makefile編寫會讓你更清晰了解AOSP這個龐大的項目是如何構建起來的.
Git
AOSP使用git+repo進行源碼管理. 這應該是程序員必備技能吧.
C++
Android系統的一些性能敏感模塊及第三方庫是用C++實現的, 比如: Input系統, Chromium項目(WebView的底層實現).

硬體
流暢的國際網路
AOSP代碼下載需要你擁有一個流暢的國際網路. 如果在下載代碼這一步就失去耐心的話, 那你肯定沒有耐心去看那亂糟糟的AOSP代碼. 另外, 好程序員應該都會需要一個流暢的Google.
一台運行Ubuntu 12.04的PC.
如果只是閱讀源碼而不做太多修改的話, 其實不需要太高的配置.
一台Nexus設備
AOSP項目默認只支持Nexus系列設備. 沒有也沒關系, 你依然可以讀代碼. 但如果你想在大牛之路走的更遠, 還是改改代碼, 然後刷機調試看看吧.
高品質USB線
要刷機時線壞了, 沒有更窩心的事兒了.
軟體
Ubuntu 12.04
官方推薦, 沒得選.
Oracle Java 1.6
注意不要用OpenJDK. 這是個坑, 官方文檔雖然有寫, 但還是單獨提一下.
安裝:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
sudo apt-get install oracle-java6-set-default

Eclipse
估計會有不少人吐槽, 為什麼要用這個老古董. 其實原因很簡單, 合適. 剛開始搞AOSP時, 為了找到效率最優的工具, 我嘗試過Eclipse, IntelliJ IDEA, Vim+Ctags, Sublime Text+Ctags. 最終結果還是Eclipse. 主要優點有:
有語法分析 (快速准確的類, 方法跳轉).
支持C++ (IntelliJ的C++支持做的太慢了).
嵌入了DDMS, View Hierarchy等調試工具.
為了提高效率, 花5分鍾背下常用快捷鍵非常非常值得.
調整好你的classpath, 不要導入無用的代碼. 因為AOSP項目代碼實在是太多了. 當你還不需要看C++代碼時, 不要為項目添加C++支持, 建索引過程會讓你崩潰.
Intellij IDEA
開發App必備. 當你要調試系統的某個功能是, 常常需要迅速寫出一個調試用App, 這個時候老舊的Eclipse就不好用了. Itellij IDEA的xml自動補全非常給力.
巨人的肩膀

這個一定要先讀. 項目介紹, 代碼下載, 環境搭建, 刷機方法, Eclipse配置都在這里. 這是一切的基礎.

這個其實是給App開發者看的. 但是裡面也有不少關於系統機制的介紹, 值得細讀.

此老羅非彼老羅. 羅升陽老師的博客非常有營養, 基本可以作為指引你開始閱讀AOSP源碼的教程. 你可以按照博客的時間順序一篇篇挑需要的看.但這個系列的博客有些問題:
早期的博客是基於舊版本的Android;
大量的代碼流程追蹤. 讀文章時你一定要清楚你在看的東西在整個系統處於什麼樣的位置.

鄧凡平老師也是為Android大牛, 博客同樣很有營養. 但是不像羅升陽老師的那麼系統. 更多的是一些技術點的深入探討.

Android官方Issue列表. 我在開發過程中發現過一些奇怪的bug, 最後發現這里基本都有記錄. 當然你可以提一些新的, 有沒有人改就是另外一回事了.

一定要能流暢的使用這個工具. 大量的相關知識是沒有人系統的總結的, 你需要自己搞定.
其它
代碼組織
AOSP的編譯單元不是和git項目一一對應的, 而是和Android.mk文件一一對應的. 善用mmm命令進行模塊編譯將節省你大量的時間.
Binder
這是Android最基礎的進程間通訊. 在Application和System services之間大量使用. 你不僅要知道AIDL如何使用, 也要知道如何手寫Binder介面. 這對你理解Android的Application和System services如何交互有非常重要的作用. Binder如何實現的倒不必著急看.
HAL
除非你對硬體特別感興趣或者想去方案公司上班, 否則別花太多時間在這一層.
CyanogenMod
這是一個基於AOSP的第三方Rom. 從這個項目的wiki里你能學到很多AOSP官方沒有告訴你的東西. 比如如何支持Nexus以外的設備.
DIA
這是一個Linux下畫UML的工具, 能夠幫你梳理看過的代碼.
XDA

這里有最新資訊和最有趣的論壇.
想到了再補充.

『肆』 如何閱讀android framework源碼

由於工作需要大量修改framework代碼,在AOSP(AndroidOpenSourceProject)源碼上花費了不少功夫,Application端和Services端都看和改了不少.如果只是想看看一些常用類的實現,在Android包管理器里把源碼下載下來,隨便一個IDE配好SourceCode的path看就行.但如果想深入的了解Android系統,那麼可以看下我的一些簡單的總結.知識JavaJava是AOSP的主要語言之一.沒得說,必需熟練掌握.熟練的AndroidApp開發LinuxAndroid基於Linux的,並且AOSP的推薦編譯環境是Ubuntu12.04.所以熟練的使用並了解Linux這個系統是必不可少的.如果你想了解偏底層的代碼,那麼必需了解基本的Linux環境下的程序開發.如果再深入到驅動層,那麼Kernel相關的知識也要具備.MakeAOSP使用Make系統進行編譯.了解基本的Makefile編寫會讓你更清晰了解AOSP這個龐大的項目是如何構建起來的.GitAOSP使用git+repo進行源碼管理.這應該是程序員必備技能吧.C++Android系統的一些性能敏感模塊及第三方庫是用C++實現的,比如:Input系統,Chromium項目(WebView的底層實現).硬體流暢的國際網路AOSP代碼下載需要你擁有一個流暢的國際網路.如果在下載代碼這一步就失去耐心的話,那你肯定沒有耐心去看那亂糟糟的AOSP代碼.另外,好程序員應該都會需要一個流暢的Google.一台運行Ubuntu12.04的PC.如果只是閱讀源碼而不做太多修改的話,其實不需要太高的配置.一台Nexus設備AOSP項目默認只支持Nexus系列設備.沒有也沒關系,你依然可以讀代碼.但如果你想在大牛之路走的更遠,還是改改代碼,然後刷機調試看看吧.高品質USB線要刷機時線壞了,沒有更窩心的事兒了.軟體Ubuntu12.04官方推薦,沒得選.OracleJava1.6注意不要用OpenJDK.這是個坑,官方文檔雖然有寫,但還是單獨提一下.安裝:sudoapt-getinstallpython-software-propertiessudoadd-apt-repositoryppa:webupd8team/javasudoapt-getupdatesudoapt-getinstalloracle-java6-installersudoapt-getinstalloracle-java6-set-defaultEclipse估計會有不少人吐槽,為什麼要用這個老古董.其實原因很簡單,合適.剛開始搞AOSP時,為了找到效率最優的工具,我嘗試過Eclipse,IntelliJIDEA,Vim+Ctags,SublimeText+Ctags.最終結果還是Eclipse.主要優點有:有語法分析(快速准確的類,方法跳轉).支持C++(IntelliJ的C++支持做的太慢了).嵌入了DDMS,ViewHierarchy等調試工具.為了提高效率,花5分鍾背下常用快捷鍵非常非常值得.調整好你的classpath,不要導入無用的代碼.因為AOSP項目代碼實在是太多了.當你還不需要看C++代碼時,不要為項目添加C++支持,建索引過程會讓你崩潰.IntellijIDEA開發App必備.當你要調試系統的某個功能是,常常需要迅速寫出一個調試用App,這個時候老舊的Eclipse就不好用了.ItellijIDEA的xml自動補全非常給力.巨人的肩膀這個一定要先讀.項目介紹,代碼下載,環境搭建,刷機方法,Eclipse配置都在這里.這是一切的基礎.這個其實是給App開發者看的.但是裡面也有不少關於系統機制的介紹,值得細讀.此老羅非彼老羅.羅升陽老師的博客非常有營養,基本可以作為指引你開始閱讀AOSP源碼的教程.你可以按照博客的時間順序一篇篇挑需要的看.但這個系列的博客有些問題:早期的博客是基於舊版本的Android;大量的代碼流程追蹤.讀文章時你一定要清楚你在看的東西在整個系統處於什麼樣的位置.鄧凡平老師也是為Android大牛,博客同樣很有營養.但是不像羅升陽老師的那麼系統.的是一些技術點的深入探討.Android官方Issue列表.我在開發過程中發現過一些奇怪的bug,最後發現這里基本都有記錄.當然你可以提一些新的,有沒有人改就是另外一回事了.一定要能流暢的使用這個工具.大量的相關知識是沒有人系統的總結的,你需要自己搞定.其它代碼組織AOSP的編譯單元不是和git項目一一對應的,而是和Android.mk文件一一對應的.善用mmm命令進行模塊編譯將節省你大量的時間.Binder這是Android最基礎的進程間通訊.在Application和Systemservices之間大量使用.你不僅要知道AIDL如何使用,也要知道如何手寫Binder介面.這對你理解Android的Application和Systemservices如何交互有非常重要的作用.Binder如何實現的倒不必著急看.HAL除非你對硬體特別感興趣或者想去方案公司上班,否則別花太多時間在這一層.CyanogenMod這是一個基於AOSP的第三方Rom.從這個項目的wiki里你能學到很多AOSP官方沒有告訴你的東西.比如如何支持Nexus以外的設備.DIA這是一個Linux下畫UML的工具,能夠幫你梳理看過的代碼.XDA這里有最新資訊和最有趣的論壇.想到了再補充.

『伍』 安卓系統手機怎麼裝uvc

具體可以參考如下操作:

1、首先下載個安卓USB檢測程序,插入UVC攝像頭,在程序中檢測看是在/dev/video中新增了節點,還是在/bus/usb下新增了節點,如果沒新增video節點,則沒有UVC驅動;

2、如果沒有新增節點,有3個辦法:一是自己寫一個video固件,通常平板上都有前後兩個攝像頭,video0和video1都已經被佔用,是無法通過這兩個來調用外置攝像頭的;二是幹掉一個前置或者後置攝像頭,這樣就可以讓外置USB用video0或video1來啟動,這就是為什麼在沒有攝像頭的安卓上能成功;三是找到系統的源碼,配置其中的UVC驅動,編譯後再安裝;

3、如果新增了節點那就好辦了,如果板子上已經有2個攝像頭,自己寫個程序調用ID為3的camera就好了;如果沒有2個攝像頭,那直接用系統自帶的相機程序前後切換就可以看到USB的信息了。如果是AV通過採集卡轉換的UVC,還能在相機應用里看;

『陸』 Android Studio如何配置UVC類

重新檢查下JAVA_HOME,PATH,CLASSPATH。。我安裝android Studio的時候也出現過你這情況,設置好了JAVA_HOME,PATH,CLASSPATH之後就能啟動了重新檢查下JAVA_HOME,PATH,CLASSPATH。。我安裝android Studio的時候也出現過你這情況,設置好了JAVA_HOME,PATH,CLASSPATH之後就能啟動了重新檢查下JAVA_HOME,PATH,CLASSPATH。。我安裝android Studio的時候也出現過你這情況,設置好了JAVA_HOME,PATH,CLASSPATH之後就能啟動了重新檢查下JAVA_HOME,PATH,CLASSPATH。。我安裝android Studio的時候也出現過你這情況,設置好了JAVA_HOME,PATH,CLASSPATH之後就能啟動了重新檢查下JAVA_HOME,PATH,CLASSPATH。。我安裝android Studio的時候也出現過你這情況,設置好了JAVA_HOME,PATH,CLASSPATH之後就能啟動了重新檢查下JAVA_HOME,PATH,CLASSPATH。。我安裝android Studio的時候也出現過你這情況,設置好了JAVA_HOME,PATH,CLASSPATH之後就能啟動了55555555666666666

『柒』 安卓系統上的app識別不了camera的uvc

成像的時候沒轉化正確,看看log。
無論使用哪種Camera的api,Camera的封裝都可以大致分為兩個流程:數據採集、渲染。於是我們就可以定義出這兩塊功能的介面:數據採集
publicinterfaceICamera{ListgetCameras();interfaceOnPhotoTake{voidonPhotoTake(Bitmapreader,Stringpath);}booleanopen(Stringid);voidclose();voidtakePicture(OnPhotoTakeonPhotoTake,Stringid);}
雖然是多個攝像頭,但是我們可以用一個單例類來統一管理——UVCCameraHelper。在這個類中我們要做的事有:連接上usb攝像頭設備,開啟攝像頭採集數據並將數據渲染到surface上,此外還需要提供拍照、視頻錄制等api。那麼這里就需要用到UVCCcamera這個開源庫了。我們需要在UVCCameraHelper定義一個USBMonitor對象,這個類的核心介面提供了USB設備的連接狀態維護。

『捌』 android設備插上uvc攝像頭後,怎麼確定設備的節點

<6>[ 812.640000] usb 1-2.3.4: new high-speed USB device number 8 using s5p-ehci

<6>[ 812.820000] usb 1-2.3.4: New USB device found, idVendor=1908, idProct=23
10
<6>[ 812.820000] usb 1-2.3.4: New USB device strings: Mfr=1, Proct=2, SerialN
umber=3
<6>[ 812.820000] usb 1-2.3.4: Proct: USB2.0 PC CAMERA
<6>[ 812.820000] usb 1-2.3.4: Manufacturer: Generic
<6>[ 812.820000] usb 1-2.3.4: SerialNumber: 20100331010203
<6>[ 812.835000] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (1908:2310)
<6>[ 812.840000] input: USB2.0 PC CAMERA as /devices/platform/s5p-ehci/usb1/1-2
/1-2.3/1-2.3.4/1-2.3.4:1.0/input/input6

『玖』 基於android的內核與系統架構源碼分析怎麼樣

如今,大家面對市場中種類繁多的手機必然挑的眼花繚亂。不過,在智能手機占據主要地位的今天,挑選手機的主要因素就是挑選一款性能高的手機操作系統,Android就是其中的一個必然選擇。Android系統架構和其操作系統一樣,採用了分層的架構。Android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和linux核心層。 Android系統架構之應用程序 Android會同一系列核心應用程序包一起發布,該應用程序包包括email客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯系人管理程序等。所有的應用程序都是使用JAVA語言編寫的。 Android系統架構之應用程序框架 開發人員也可以完全訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序都可以發布它的功能塊並且任何其它的應用程序都可以使用其所發布的功能塊(不過得遵循框架的安全性限制)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件。 隱藏在每個應用後面的是一系列的服務和系統, 其中包括; * 豐富而又可擴展的視圖(Views),可以用來構建應用程序, 它包括列表(lists),網格(grids),文本框(text boxes),按鈕(buttons), 甚至可嵌入的web瀏覽器。 * 內容提供器(Content Providers)使得應用程序可以訪問另一個應用程序的數據(如聯系人資料庫), 或者共享它們自己的數據 * 資源管理器(Resource Manager)提供 非代碼資源的訪問,如本地字元串,圖形,和布局文件( layout files )。 * 通知管理器 (Notification Manager) 使得應用程序可以在狀態欄中顯示自定義的提示信息。 * 活動管理器( Activity Manager) 用來管理應用程序生命周期並提供常用的導航回退功能。 有關更多的細節和怎樣從頭寫一個應用程序,請參考 如何編寫一個 Android 應用程序. Android系統架構之系統運行庫 1)程序庫 Android 包含一些C/C++庫,這些庫能被Android系統中不同的組件使用。它們通過 Android 應用程序框架為開發者提供服務。以下是一些核心庫: * 系統 C 庫 - 一個從 BSD 繼承來的標准 C 系統函數庫( libc ), 它是專門為基於 embedded linux 的設備定製的。 * 媒體庫 - 基於 PacketVideo OpenCORE;該庫支持多種常用的音頻、視頻格式回放和錄制,同時支持靜態圖像文件。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。 * Surface Manager - 對顯示子系統的管理,並且為多個應用程序提 供了2D和3D圖層的無縫融合。 * LibWebCore - 一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。 * SGL - 底層的2D圖形引擎 * 3D libraries - 基於OpenGL ES 1.0 APIs實現;該庫可以使用硬體 3D加速(如果可用)或者使用高度優化的3D軟加速。 * FreeType -點陣圖(bitmap)和矢量(vector)字體顯示。 * SQLite - 一個對於所有應用程序可用,功能強勁的輕型關系型資料庫引擎。 2)Android 運行庫 Android 包括了一個核心庫,該核心庫提供了JAVA編程語言核心庫的大多數功能。 每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。Dalvik被設計成一個設備可以同時高效地運行多個虛擬系統。 Dalvik虛擬機執行(.dex)的Dalvik可執行文件,該格式文件針對小內存使用做了優化。同時虛擬機是基於寄存器的,所有的類都經由JAVA編譯器編譯,然後通過SDK中 的 “dx” 工具轉化成.dex格式由虛擬機執行。 Dalvik虛擬機依賴於linux內核的一些功能,比如線程機制和底層內存管理機制。 Android系統架構之Linux 內核 Android 的核心系統服務依賴於 Linux 2.6 內核,如安全性,內存管理,進程管理, 網路協議棧和驅動模型。 Linux 內核也同時作為硬體和軟體棧之間的抽象層。

閱讀全文

與androiduvc庫源碼分析相關的資料

熱點內容
農村低保認證app怎麼認證 瀏覽:815
文件夾該項目不存在無法刪除 瀏覽:914
linux啟動mysql服務命令 瀏覽:735
python模擬登錄並截圖發送微信 瀏覽:87
javasocket報文 瀏覽:784
程序員番茄西瓜 瀏覽:407
任天堂的安卓平板能玩什麼游戲 瀏覽:675
伺服器集群如何實現硬碟共享 瀏覽:404
長虹空調壓縮機多少錢 瀏覽:15
pdf是動圖 瀏覽:726
matlab聚類分析演算法 瀏覽:337
ue4引擎程序員 瀏覽:175
App番茄英語怎麼樣 瀏覽:163
神策Python 瀏覽:255
cto壓縮炭的危害 瀏覽:217
小數點加減乘除法演算法 瀏覽:328
肯德基app怎麼找人工 瀏覽:643
網易有道優課編程課 瀏覽:339
一鍵網站伺服器地址 瀏覽:573
工行app怎麼注冊 瀏覽:781