導航:首頁 > 源碼編譯 > dt編譯vendor

dt編譯vendor

發布時間:2023-05-23 00:19:59

① SElinux許可權

在了解SELinux之前,我們先來了解一下Linux的兩種訪問控制策略:DAC和MAC

DAC,自主訪問控制(Discretionary Access control)。系統只提供基本的驗證, 完整的訪問控制由開發者自己控制。
 DAC將資源訪問者分成三類:Owner、Group、Other 。
 將訪問許可權也分成三類:read、write、execute
資源針對資源訪問者設置不同的訪問許可權。訪問者通常是各個用戶的進程,有自己的uid/gid,通過uid/gid 和文件許可權匹配, 來確定是否可以訪問。DAC機制下,每一個用戶進程默認都擁有該用戶的所有許可權。
DAC 有兩個嚴重問題:
 問題一:
 因為Root用戶是擁有所有許可權的,所以DAC對Root用戶的限制是無效的。並且在Linux Kernel 2.1以後,Linux將Root許可權根據不同的應用場景劃分成許多的Root Capabilities, 普通用戶也可以被設置某個Root Capability。普通用戶如果被設置了CAP_DAC_OVERRIDE, 也可以繞過 DAC 限制。
 問題二:
 用戶進程擁有該用戶的所有許可權,可以修改/刪除該用戶的所有文件資源, 難以防止惡意軟體。

可見,DAC 有明顯的缺陷,一旦被入侵,取得Root許可權的用戶進程就可以無法無天,胡作非為,早期android版本就深受其害。

MAC, 強制性訪問控制(Mandatory Access control)。 系統針對每一項訪問都進行嚴格的限制, 具體的限制策略由開發者給出。

Linux MAC 針對DAC 的不足, 要求系統對每一項訪問, 每訪問一個文件資源都需要根據已經定義好了的策略進行針對性的驗證。系統可以針對特定的進程與特定的文件資源來進行許可權的控制。即使是root用戶,它所屬的不同的進程,並不一定能取得root許可權,而得要看事先為該進程定義的訪問限制策略。如果不能通過MAC 驗證,一樣無法執行相關的操作。

與DAC相比,MAC訪問控制的「主體」變成了「進程」而不是用戶。這樣可以限制了Root 許可權的濫用,另外要求對每一項許可權進行了更加完整的細化, 可以限制用戶對資源的訪問行為。

SELinux就是目前最好的MAC機制,也是目前的行業標准。

SELinux,安全增強Linux(Security-Enhanced Linux),是由美國國家安全局(NSA)發起, 多個非營利組織和高校參與開發的強制性安全審查機制(Mandatory Access control,簡稱MAC)。SELinux最早於2000年12月採用GPL許可發布。目前,Linux Kernel 2.6 及以上的版本都已經集成了SELinux。

SELinux 分成三種模式:

Android 5.x及以上強制開啟,因此,disabled(關閉)模式並沒有什麼用了。 通常在調試時,我們會啟用Permissve(寬容模式), 以便盡可能的發現多的問題, 然後一次修正。 在量產時啟用Enfocing mode(強制模式)來保護系統。

查看SELinux模式:adb shell getenforce
設置SELinux模式:adb shell setenforce 1 //0是Permissve,1是Enfocing

SELinux 的訪問控制示意圖:

通常我們開發的過程中,就是配置Subject、Object、Security Policy。

SELinux 給Linux 的所有對象都分配一個安全上下文(Security Context), 描述成一個標準的字元串。

安全上下文的標准格式: user:role:type[:range]

Security Label 用來綁定被訪問資源和安全上下文,描述它們的對應關系。標准格式為:resource security_context。即:res user:role:type[:range]。這里也可以使用通配符,例如 net.就可以綁定所有以net.開頭的屬性,除此之外,還有類似正則表達式的*、?等等通配符。Security Label 都定義在type_contexts當中,例如file的定義在file_contexts中,service定義在service_contexts中,property定義在property_contexts中。
舉例:
file_contexts:

service_contexts:

查看進程安全上下文: ps -AZ 。例如,查看Settings進程的安全上下文,ps -AZ | grep settings:
  u:r:system_app:s0 system 1381 585 4234504 201072 0 0 S com.android.settings
查看文件安全上下文: ls -Z 。例如,查看文件build.prop的安全上下文:
  u:object_r:system_file:s0 build.prop

Type Enforcement (TE) 是根據Security Context中的 type 進行許可權審查, 審查 subject type 對 object type 的某個class 類型中某種permission 是否具有訪問許可權,是目前使用最為廣泛的MAC 審查機制, 簡單易用。

TE控制語句格式 : rule_name source_type target_type : class perm_set

Type Enforcement規則說明:

舉個例子,logd.te、tombstoned.te中定義的TE規則:
  allow logd runtime_event_log_tags_file:file rw_file_perms;
  dontaudit domain runtime_event_log_tags_file:file { open read };
  auditallow tombstoned anr_data_file:file { append write };
  neverallow logd { app_data_file system_data_file }:dir_file_class_set write;

SELinux 中每一個進程或者文件都對應一個type, 而每一個type 都對應有一個或幾個attribute。所有常見的attribute定義在以下文件中:
  system/sepolicy/public/attributes
  system/sepolicy/prebuilts/api/[build version]/public/attributes
  system/sepolicy/prebuilts/api/[build version]/private/attributes
其中的[build version]即為android版本號,例如android O為28.0。常見的attribute定義:

Type對應一個或者幾個attribute,Type的定義格式:
  type type_name, attribute1, attribute2;
Type的定義通常分散在各個te文件中。例如,常用普通文件的type定義在file.te中:

SEAndroid對於不同的資源類型,定義了不同的Class。比如普通的file、socket等等,比如SELinux 使用的security, 比如針對每個process 參數的process 等定義相關的class。這些class,每一個class 都有相對應的permissions。 比如file 就有 read, write, create, getattr, setattr, lock, ioctl 等等. 比如process 就有fork, sigchld, sigkill, ptrace, getpgid, setpgid 等等。這些相關的class, 以及他們具有那些Permissions都定義在以下文件中:
  system/sepolicy/private/access_vectors
  system/sepolicy/reqd_mask/access_vectors
  system/sepolicy/prebuilts/api/版本號/private/access_vectors
例如:

定義完之後,在以下對應的security_classes 文件中聲明定義的classes。
  system/sepolicy/private/security_classes
  system/sepolicy/reqd_mask/security_classes
  system/sepolicy/prebuilts/api/版本號/private/security_classes
例如:

注意,Classes 和Permissions的定義與Kernel 中相關API是強相關的,普通用戶嚴禁修改。

在SELinux 中, 我們通常稱一個進程是一個domain, 一個進程fork 另外一個進程並執行(exec) 一個執行檔時, 我們往往會涉及到domain 的切換. 比如init 進程, SELinux 給予了它很大的許可權, 而它拉起的服務, 我們要限制這個服務的許可權,於是就涉及到從一個domain 切換到另外一個domain, 不然默認就使用init 進程的domain.

在SELinux 裡面有專門的一條語法: type_transition statement.
在准備切換前我們先要確保有相關的許可權操作:

如下面的demo, init 拉起apache 並且切換到 apache 的domain.
(1). 首先,你得讓init_t域中的進程能夠執行type為apache_exec_t的文件
  allow init_t apache_exec_t : file {read getattr execute};
(2). 然後,你還得告訴SELinux,允許init_t做DT切換以進入apache_t域
  allow init_t apache_t : process transition;
(3). 然後,你還得告訴SELinux,切換入口(對應為entrypoint許可權)為執行apache_exec_t類型 的文件
  allow apache_t apache_exec_t : file entrypoint;
(4).最後,Domain Transition
  type_transition init_t apache_exec_t : process apache_t;

可以看到,整個domain切換過程寫起來非常麻煩。因此,Google 為了使用方便, 在system/sepolicy/public/te_macros 文件中定義了宏:

我們可以使用這些宏來完成domain切換。

舉例:
kernel啟動init進程切換domain:
  domain_auto_trans(kernel, init_exec, init)
init啟動netd、vold、zygote、installd切換domain:
  init_daemon_domain(netd)
  init_daemon_domain(vold)
  init_daemon_domain(zygote)
  init_daemon_domain(installd)

一個進程創建在一個目錄下創建文件時, 默認是沿用父目錄的Security Context, 如果要設置成特定的Label, 就必須進行Object Transitions.
同樣是使用:type_transition statement.
對應的必須有兩個前提條件:

下面是一個demo, ext_gateway_t 這個domain 在類型為in_queue_t 的目錄下,創建類型為 in_file_t 的文件.

(1). 首先,你得讓ext_gateway_t 對in_queue_t 目錄具備訪問許可權
  allow ext_gateway_t in_queue_t : dir { write search add_name };
(2). 然後,你還得告訴SELinux,允許ext_gateway_t 訪問in_file_t的文件
  allow ext_gateway_t in_file_t : file { write create getattr };
(3).最後,Object Transition
  type_transition ext_gateway_t in_queue_t : file in_file_t;

同樣的,為了方便使用,Google 也在system/sepolicy/public/te_macros 文件中定義了宏:

使用舉例:
  file_type_auto_trans(factory, system_data_file, factory_data_file)

android O 以前sepolicy 集中放在boot image 。前面提到SELinux在Android的主要變更歷史時,有提到android O 開始,Google將system image 和 vendor image 分離。因此,sepolicy 也相應的被分離存放到system image 以及 vendor image。與system 相關的sepolicy 就存放system image, 與SoC vendor 相關的sepolicy 就存放在vendor image。

對於原生AOSP,Google 設定了不同的存放目錄, 以便進行分離, 以Google 默認的sepolicy 為例,sepolicy主目錄為 /system/sepolicy,我們主要關注三個子目錄:

對於不同的平台,不同平台廠商也設定了不同的存放目錄,以MTK平台為例:
首先,根據不同的platform共用sepolicy、platform獨有、project獨有,分為:

對應的,不同版本會導入不同目錄下的sepolicy配置

以mt6763平台為例,導入時:
[common] 路徑為:/device/mediatek/sepolicy
[platfrom] 路徑為:/device/mediatek/mt6763/sepolicy/
具體的定義在BoardConfig.mk文件中:

然後,basic、bsp、full又可以主要細分為:

Google 在system/sepolicy 中定義了相關的neverallow 規則, 對SELinux Policy 的更新進行了限制, 以防止開發者過度開放許可權,從而引發安全問題。並且還會通過CTS測試檢測開發者是否有違法相關的規則。

因此,我們需要注意以下幾點:

出現SELinux Policy Exception時常見的兩種解決方案:

(1). 修改對應節點的SELinux Security Label, 為特定的Subject,如system_app、platform_app、priv_app,例如Settings,SystemUI等內置APP開啟許可權, 但嚴禁為untrsted app 開啟許可權。
(2). 通過system server service 或者 init 啟動的service 讀寫操作, 然後app 通過binder/socket 等方式連接訪問. 此類安全可靠, 並且可以在service 中做相關的安全審查, 推薦這種方法.

情景: 定義由 init 進程啟動的service, factory, 其對應的執行檔是 /vendor/bin/factory。

(1). 在device/mediatek/mt6763/sepolicy/basic/non_plat 目錄下創建一個factory.te , 然後將te文件加入編譯,如放到這種指定目錄下不需要額外配置,sytem/sepolicy/Android.mk中定義的build_policy函數會遍歷指定目錄導入te文件。

(2). 在factory.te 中定義factory類型,init 啟動service 時類型轉換,
  type factory, domain;
  type factory_exec, exec_type, file_type, vendor_file_type;
  init_daemon_domain(factory)

(3). 在file_contexts中綁定執行檔
  /(system/vendor|vendor)/bin/factory u:object_r:factory_exec:s0

(4). 根據factory需要訪問的文件以及設備, 定義其它的許可權在factory.te 中.
  #Purpose: For key and touch event
  allow factory input_device:chr_file r_file_perms;
  allow factory input_device:dir rw_dir_perms;

情景: 添加一個自定義的system property: persist.demo,並為platform_app設置讀寫許可權

(1). 在property.te中定義system property類型
  type demo_prop, property_type

(2). 在property_contexts中綁定system property的安全上下文。
  persist.demo u:object_r:demo_prop:s0

(3). 在platform_app.te 中新增寫許可權,可以使用set_prop宏。
  set_prop(platform_app, demo_prop)

(4). 在platform_app.te 中新增讀許可權,可以get_prop 宏。
  get_prop(platform_app, demo_prop)

情景: 有一個設備節點/dev/demo,有一個platform_app進程需要讀寫這個設備節點。

(1). 在device.te中定義device 類型
  type demo_device dev_type;

(2). 在 file_contexts中綁定demo_device
  /dev/demo u:object_r:demo_device:s0

(3). 在platform_app.te中,允許platform_app使用demo device 的許可權
  allow platform_app demo_device:chr_file rw_file_perms;

情景: 有一個擴展的系統服務demo_service供APP調用。

(1). 在service.te 中定義service 類型
  type demo_service, app_api_service, system_server_service, service_manager_type;

(2). 在service_contexts 中綁定service
  demo u:object_r:demo_service:s0

(3). 在frameworks/base/core/java/android/content/Context.java中定義服務常量
  public static final String DEMO_SERVICE = "demo";

(4). 在frameworks/base/core/java/android/app/SystemServiceRegistry.java中,參照其它系統服務注冊demo_service

(5). 在frameworks/base/services/java/com/android/server/SystemServer.java中,啟動DemoService,添加到service_manager進行管理。

(6). 最後一步,參考其它系統服務,實現DemoManager、DemoService,並定義如IDemoService等等的AIDL介面。

情景: 一個native service 通過init 創建一個socket 並綁定在 /dev/socket/demo, 並且允許某些process 訪問.

(1). 在file.te中定義socket 的類型
  type demo_socket, file_type;

(2). 在file_contexts中綁定socket 的類型
  /dev/socket/demo_socket u:object_r:demo_socket:s0

(3). 允許所有的process 訪問,使用宏unix_socket_connect(clientdomain, socket, serverdomain)
  unix_socket_connect(appdomain, demo, demo)

(1). 在device/mediatek/mt6763/sepolicy/basic/non_plat目錄下創建一個demo.te。

(2). 在demo.te 中定義demo 類型,init 啟動service 時類型轉換。並可以根據demo 需要訪問的文件以及設備, 定義其它的許可權在demo.te 中。
  type demo, domain;
  type demo_exec, exec_type, file_type;
  init_daemon_domain(demo)

(3). 綁定執行檔 file_context 類型
  /vendor/bin/demo u:object_r:demo_exec:s0

(4). 創建demo的入口執行檔demo_exec、並配置相應的許可權。

(1). 將SELinux 調整到Permissive 模式復測
使用eng/userdebug 版本,adb shell setenforce 0 將SELinux 模式調整到Permissive 模式,然後復測。如果還能復現問題,則與SELinux 無關; 如果原本很容易復現, 而Permissive mode 不能再復現, 那麼就可能與SELinux相關。

(2). 查看LOG 中是否有標準的SELinux Policy Exception.
在Kernel LOG / Main Log 中查詢關鍵字 "avc: denied" 看看是否有與目標進程相關的SELinux Policy Exception, 並進一步確認這個異常是否與當時的邏輯相關。

一般情況我們在符合Google sepolicy策略及neverallow策略的前提下,根據LOG中的內容,需要什麼許可權就加什麼許可權。例如LOG:
2020-03-27 14:11:02.596 1228-1228/com.android.systemui W/FaceIdThread: type=1400 audit(0.0:481): avc: denied { read } for name="als_ps" dev="tmpfs" ino=10279 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:als_ps_device:s0 tclass=chr_file permissive=0

LOG說明如下:

一般我們需要重點關注的是四個:permission、source type、target type、target class

根據這四個就可以配置出的所需要的selinux許可權:
   allow [source type] [target type]: [target class] [permission]
例1:
03-27 03:45:22.632 2958 2958 W Camera: type=1400 audit(0.0:314): avc: denied { read } for name="u:object_r:graphics_debug_prop:s0" dev="tmpfs" ino=2649 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:graphics_debug_prop:s0 tclass=file permissive=0

解決方案:
按正常的套公式,應該是這樣修改platform_app.te,增加:
  allow platform_app graphics_debug_prop:file r_file_perms;
這里我們利用system/sepolicy/te_macros中定義的宏get_prop:

更多相關的宏定義請參考:system/sepolicy/public/te_macros。
所以最終簡化後,修改platform_app.te,增加:
  get_prop(platform_app, graphics_debug_prop)

例2:
03-27 14:11:02.596 1228-1228/com.android.systemui W/BackThread: type=1400 audit(0.0:481): avc: denied { read } for name="als_ps" dev="tmpfs" ino=10279 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:als_ps_device:s0 tclass=chr_file permissive=0

解決方案:
修改platform_app.te增加:
  allow platform_app als_ps_device:chr_file r_file_perms;

(1). 不符合neverallow規則或者修改了neverallow規則
編譯報錯:
  neverallow check failed at xxx
CTS測試項failed:
  android.cts.security.SELinuxNeverallowRulesTest#testNeverallowRulesXXX
這類問題在android O vendor和system分離之後,尤其容易出現。基本上這類問題都是因為修改或者增加的te配置不符合neverallow規則,導致編譯報錯。而為了解決編譯報錯,又修改了neverallow規則,最終在跑CTS時,沒法通過相關的測試項。

解決思路:

(2). init進程fork新進程沒有做domain切換
CTS測試項failed:
  android.security.cts.SELinuxDomainTest # testInitDomain

解決思路:
fork進程時,參考3.4節中做domain切換。

本文主要參考了MTK-Online的Quick-start中《SELinux 問題快速分析》的內容,感謝原作者們的辛勤付出。另外,結合源碼和自身開發實踐,增加了一些自身理解和實踐內容。

② 【Camera專題】Camera驅動源碼全解析_下

1、手把手擼一份驅動 到 點亮 Camera
2、Camera dtsi 完全解析
3、Camera驅動源碼全解析上
4、Camera驅動源碼全解析下
上篇文章分析了C文件函數的實現,本文繼續分析h文件的配置信息。

推薦文章:
MIPI CSI2學習(一):說一說MIPI CSI2
高通camera驅動分析

參照sensor規格書或者咨詢fae,配置:

2.1 sensor幀的輸出和關閉

sensor以流的方式 輸出幀.

2.2 開啟sensor 端的group 功能

開啟sensor 端的group 功能,將曝光(line),gain等打包,保證在同一幀進去生效

2.3 sensor嵌入式數據

2.4 sensor初始化相關寄存器

2.5 sensor解析度相關寄存器

以上的sensor寄存器配置一般有fae廠商提供,驅動工程師盡可能的掌握相關寄存器代表的含義。
如控制寬高、幀率、曝光等等寄存器

我們只用到16位,因此
sensor_id_reg_addr = 0x300b,
sensor_id = 0x0D42,

曝光時間以行長為單位; PCLK以Hz為單位;
行長以周期數為單位,幀長以行長數為單位;其中周期數就是頻率
T 周期以ms為單位;
f 頻率以Hz為單位;
f = 1 / T;

可以參考這篇文章:
camera曝光和幀率_songqiangzmt的博客

比如這里又3個寄存器,每個寄存器是8bit:
max_linecount = 0x ff ff -8

暫時沒弄清楚

這里指的是暗電流值,
一般來說 raw8 都是 16, raw10為 16x4=64, raw12 =16x4x4

感測器可以流式傳輸許多不同的 數據類型(DT)
該數據被包裝在不同的流中。 在一個流中,可以有一個或多個不同的DT。 一種 虛擬通道(VC) 分配給每個流。 DT和VC的組合應為唯一,並分配了一個通道ID(CID)。
有關如何指定CID的要求/限制。 當前的MIPI CSI_Rx支持四個VC,每個VC最多可以有四個CID,如下表所示。

感測器可能具有內置的pattern generator。 通過設置專用寄存器,感測器可以將生成的圖案輸出。

當出現圖像異常時,可以使用此功能看看sensor本身輸出是否有問題。

binning_factor主要是用來控制拍照亮度跟預覽亮度一致的,當然也可以解決預覽噪點過大的問題!
3A演算法里,曝光時間 snap_exp_time *= (float)(binning_multiplier);

3A源碼

賦值源碼

關鍵日誌:

CSI :Camera Serial Interface 定義了一個位於處理器和攝像模組之間的高速串列介面

為使CSI_Tx(感測器)和CRI_Rx(設備)正常工作,需要一段時間它們之間需要同步。
此時間在此處設置為計時器時鍾滴答數。 它必須介於公式計算的MIN和MAX值之間
MIN [Settle count * T(Timer clock)] > T(HS_SETTLE)_MIN
MAX [Settle count * T(Timer clock)] < T(HS-PREPARE)+T(HS_ZERO) - 4*T(Timer clock)

settle_cnt(即穩定計數)– 必須根據感測器輸出特性配置該值,以確保感測器的 PHY
發送器與 MSM 的 PHY 接收器無障礙同步。
對於 28 nm 以及更小的 MSM 晶元,使用以下公式計算穩定計數:
settle_cnt = T(HS_SETTLE)_avg /T(TIMER_CLK),
其中 T(HS_SETTLE)_avg = (T(HS_SETTLE)_min + T(HS_SETTLE)_max) / 2,如傳
感器數據表所指示

如果sensor可以直接流式傳輸HDR幀,該函數才有用。

這里的 rolloff compensations = Lens Shading Correction (LSC)
有些sensor可以自己內部做lsc補償。rolloff_config就是用了配置sensor的這些信息。

注意:如果你使用了sensor LSC補償,平台端 lsc補償就要關閉,否則雙倍補償,可能會造成圖片失真。

typedef enum {
SENSOR_DELAY_EXPOSURE, /* delay for exposure /
SENSOR_DELAY_ANALOG_SENSOR_GAIN, / delay for sensor analog gain /
SENSOR_DELAY_DIGITAL_SENSOR_GAIN, / delay for sensor digital gain /
SENSOR_DELAY_ISP_GAIN, / delay for sensor ISP (error) gain*/
SENSOR_DELAY_MAX,
} sensor_delay_type_t;

SENSOR_DELAY_EXPOSURE – Sets the exposure of frame N at frame N + delay
SENSOR_DELAY_ANALOG_SENSOR_GAIN – Sets the analog gain register at frame N + delay
SENSOR_DELAY_DIGITAL_SENSOR_GAIN – Sets the digital gain register at frame N + delay
SENSOR_DELAY_ISP_GAIN – Passes the isp digital gain to the isp mole at frame N + delay

如果出現ae閃爍問題,可以嘗試修改延遲,讓gain和expose同步。

This is the readout time (in nanoseconds) of the sensor』s analog-to-digital converter. Usually it is
the minimum line time when the sensor is running at the maximum pixel clock.
NOTE: This is the sensor mole』s own information. Refer to the sensor vendor for more information

noise_coeff 小波里用來定義雜訊的模板
雜訊系數模型: N(x) = sqrt(Sx + O)

這些參數一般由tunning團隊修改。

關於角度

注意:
如果 <MountAngle>360</MountAngle>; 這個值配置成360度,那麼以dtsi配置的角度為准。

源碼:

關於幀率
https://www.cnblogs.com/ZHJEE/p/10351155.html

繼續當一名咸魚( ̄︶ ̄)!

③ (轉)java 中的tools.jar和dt.jar分別是干什麼的求答案

設置在classpath里是為了讓你 import *
web系統都用到tool.jar1.
rt.jar 默認就在 根classloader的載入路徑裡面 放在claspath是多此一舉
不信你可以去掉classpath裡面的rt.jar
然後用 java -verbose XXXX 的方式運行一個簡單的類 就知道 JVM的系統根Loader的路徑裡面
不光rt.jar jre\lib下面的大部分jar 都在這個路徑里2.
tools.jar 是系統用來編譯一個類的時候用到的 也就是javac的時候用到
javac XXX.java
實際上就是運行
java -Calsspath=%JAVA_HOME%\lib\tools.jar xx.xxx.Main XXX.java
javac就是對上面命令的封裝 所以tools.jar 也不用加到classpath裡面3.
dt.jar是關於運行環境的類庫,主要是swing的包 你要用到swing時最好加上Sun的Java文檔中是這么說的

④ 1..為什麼java程序,環境變數classpath中 tools.jar dt.jar是必須

1:
dt.jar和tools.jar是兩個java最基本的包,裡麵包含了從java最重要的lang包到各種高級功能如可視化的swing包,是java必不可少的。
rt.jar是JAVA基礎類庫,dt.jar是關於運行環境的類庫,tools.jar是工具類庫
設置在classpath里是為了讓你 import *
這三個jar最基本也是最常用的,包含了大部分能用到的,如果你能非要用其他的,那麼也要在這裡面設置
2:
如果用IDE,那麼就不需要設置classpath,設置path都不需要(eclipse需要配置eclipse.ini),java_home是虛設,在Windows-Preferences-Java-->Installed JRES,配置你的jdk目錄,IDE會自動找到你項目的編輯命令和類庫(path和classpath)

3:

class文件運行當然需要lib支持,可以最簡單的

public class HelloWorld{
public static void main(String args[]){
System.out.print("Test File");
}
}
d:\>javac HelloWorld.java
d:\>
d:\>java -classpath ./junit.jar HelloWorld //重新指定類庫
錯誤: 找不到或無法載入主類 HelloWorld
d:>

⑤ 怎麼在github上編譯 apache zeppelin

用於做數據分析和可視化

一、二進制安裝

1)下載二進制包

wget http://mirrors.tuna.tsinghua.e.cn/apache/incubator/zeppelin/0.5.6-incubating/zeppelin-0.5.6-incubating-bin-all.tgz

2)解壓縮

tar -xzvf zeppelin-0.5.6-incubating-bin-all.tgz

cd zeppelin-0.5.6-incubating-bin-all

bin/zeppelin-daemon.sh start

註:默認埠是8080,若此埠被佔用,到conf下

cp zeppelin-site.xml.template zeppelin-site.xml

vim zeppelin-site.xml

<property>

<name>zeppelin.server.addr</name>

<value>172.16.1.29</value>

<description>Server address</description>

</property>

<property>

<name>zeppelin.server.port</name>

<value>8080</value>

<description>Server port.</description>

</property>

修改zeppelin.server.port埠,zeppelin.server.addr默認是0.0.0.0可以不修改,也可以修改成本機ip(雲伺服器一定要ip addr看一下本機的ip,而不是綁定的外網ip),java版本1.7。

訪問Zeppelin

localhost:8080 訪問到zepplin主頁。

註:1.主界面默認埠為8080,若此埠被佔用,則啟動會出錯。可以到conf目錄下

[root@public_view_databank conf]# cp zeppelin-site.xml.template zeppelin-site.xml

修改其中的參數

<property>

<name>zeppelin.server.addr</name>

<value>0.0.0.0</value>

<description>Server address</description>

</property>

<property>

<name>zeppelin.server.port</name>

<value>9090</value>

<description>Server port.</description>

</property>

修改zeppelin.server.port

Zeppelin.server.addr可以默認0.0.0.0也可以修改成本地ip

二、源碼安裝

1)下載源碼包
Zeppelin 0.5.6-incubating:
wget http://mirror.bit.e.cn/apache/incubator/zeppelin/0.5.6-incubating/zeppelin-0.5.6-incubating.tgz
Zeppelin 0.6.0-SNAPSHOT:
git clone https://github.com/apache/zeppelin.git
2)配置環境
# Requirements
+ Git
+ Java 1.7
+ Tested on Mac OSX, Ubuntu 14.X, CentOS 6.X, Windows 7 Pro SP1
+ Maven (if you want to build from the source code)
+ Node.js Package Manager (npm, downloaded by Maven ring build phase)
# 編譯環境構建
## git install
[root@gitlab-machine ~]# git version
git version 1.7.1

## install jdk
[root@gitlab-machine~]#wget http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz

[root@gitlab-machine ~]# tar -zxf jdk-7u79-linux-x64.tar.gz -C /opt/

[root@gitlab-machine ~]# cd /opt/

[root@gitlab-machine opt]# ln -s jdk1.7.0_79 jdk

[root@gitlab-machine opt]# vim ~/.bash_profile 追加
export JAVA_HOME=/opt/jdk

export PATH=.:$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

[root@gitlab-machine opt]# source ~/.bash_profile
[root@gitlab-machine opt]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

## install maven
[root@gitlab-machineopt]#wget http://www.eu.apache.org/dist/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.tar.gz

[root@gitlab-machine opt]# tar -zxf apache-maven-3.3.3-bin.tar.gz

[root@gitlab-machine opt]# ln -s apache-maven-3.3.3 maven

[root@gitlab-machine opt]# echo "export MAVEN_HOME=/opt/maven" >> ~/.bash_profile

[root@gitlab-machineopt]# echo "export PATH=$MAVEN_HOME/bin:$PATH:$HOME/bin" >> ~/.bash_profile

[root@gitlab-machine opt]# source ~/.bash_profile
[root@gitlab-machine opt]# mvn -version
Apache Maven 3.3.3 (; 2015-04-22T19:57:37+08:00)
Maven home: /opt/maven
Java version: 1.7.0_79, vendor: Oracle Corporation
Java home: /opt/jdk1.7.0_79/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-504.el6.x86_64", arch: "amd64", family: "unix"

## install node.js

yum install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum repolist

[root@gitlab-machine opt]# yum search nodejs npm|wc -l
21

[root@gitlab-machine opt]# sudo yum install nodejs npm --enablerepo=epel

[root@gitlab-machine opt]# node -v
v0.10.42

[root@gitlab-machine opt]# npm -v
1.3.6

[root@gitlab-machine opt]# cd /data/

## build zeppline
[root@gitlab-machine opt]# cd /data/

[root@gitlab-machinedata]#wget https://github.com/apache/zeppelin/archive/v0.5.6.zip
[root@gitlab-machine data]# unzip v0.5.6.zip
[root@gitlab-machine data]# cd zeppelin-0.5.6/
[root@gitlab-machine
zeppelin-0.5.6]# nohup mvn clean package -Pspark-1.6 -Phadoop-2.6
-Pyarn -Ppyspark -DskipTests > nohup.out &
[root@gitlab-machine zeppelin-0.5.6]# jobs
[1]+ Running nohup mvn clean package -Pspark-1.6 -Phadoop-2.6 -Pyarn -Ppyspark -DskipTests > nohup.out &

參考地址:https://github.com/apache/zeppelin/

[root@gitlab-machine zeppelin-0.5.6]# tail -f nohup.out

1.Exception in thread "main" Exception: java.lang.OutOfMemoryError thrown
解決辦法:
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
2.[INFO] Zeppelin: Elasticsearch interpreter ................ SUCCESS [15:56 min]
[INFO] Zeppelin: web Application .......................... FAILURE [03:51 min]
[INFO] Zeppelin: Server ................................... SKIPPED
[INFO] Zeppelin: Packaging distribution ................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20:57 min
[INFO] Finished at: 2016-06-08T02:19:40-04:00
[INFO] Final Memory: 93M/957M
[INFO] ------------------------------------------------------------------------
[ERROR]
Failed to execute goal
com.github.eirslett:frontend-maven-plugin:0.0.23:npm (npm install) on
project zeppelin-web: Failed to run task: 'npm install --color=false'
failed. (error code 126) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <goals> -rf :zeppelin-web

網上查找修改zeppelin-web下的pom.xml
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
</execution>

<execution>
<id>bower install</id>
<goals>
<goal>bower</goal>
</goals>
<configuration>
<arguments>--allow-root install</arguments>
</configuration>
</execution>

<execution>
<id>grunt build</id>
<goals>
<goal>grunt</goal>
</goals>
<configuration>
<arguments>--no-color --force</arguments>
</configuration>
</execution>

</executions>
</plugin>
[root@host-172-16-1-80 zeppelin-web]# npm install
[root@host-172-16-1-80 zeppelin-web]# bower –alow-root install
[root@host-172-16-1-80 zeppelin-web]# grunt –force
[root@host-172-16-1-80 zeppelin-web]# mvn install -DskipTests
啟動zeppelin
[root@bigdata-redhadoop-1 src]# cd zeppelin-0.5.6-incubating
[root@bigdata-redhadoop-1 zeppelin-0.5.6-incubating]# bin/zeppelin-daemon.sh start
Log dir doesn't exist, create /opt/bigcrh/zeppelin/src/zeppelin-0.5.6-incubating/logs
Pid dir doesn't exist, create /opt/bigcrh/zeppelin/src/zeppelin-0.5.6-incubating/run
Zeppelin start [ OK ]

[root@public_view_databank ~]# jps
18710 ZeppelinServer

閱讀全文

與dt編譯vendor相關的資料

熱點內容
有什麼學習高中語文的app 瀏覽:280
安卓手機的表格里怎麼打勾 瀏覽:407
阿里雲伺服器有網路安全服務嗎 瀏覽:966
超解壓兔子視頻 瀏覽:22
單片機怎麼測負脈沖 瀏覽:172
魅族備份的app在哪裡 瀏覽:738
java倒三角列印 瀏覽:112
通達信回封板主圖源碼 瀏覽:44
戰地什麼伺服器 瀏覽:299
安卓為什麼老是閃退怎麼辦 瀏覽:803
樂高機器人的編程軟體下載 瀏覽:223
工作中怎麼使用加密狗 瀏覽:735
雲伺服器的後台找不到 瀏覽:98
php逐行寫入文件 瀏覽:912
javaoracleweb 瀏覽:440
京東加密碼怎麼弄 瀏覽:467
單片機程序員培訓 瀏覽:992
PHP商城源代碼csdn 瀏覽:636
怎麼把電腦里文件夾挪出來 瀏覽:693
java流程處理 瀏覽:685