2012-10-13 89 views
0

根據Java規則,令人驚歎的發現:Android上的JNI 您是not supposed toAndroid JNI是否可以封裝封裝?

此功能可繞過任何地方記錄的訪問限制嗎?這是官方的JNI行爲還是特定於JNI的Android風格?這是一個未定義的行爲? OOP警察現在是否會隨時來我身邊?

據我所知,依靠未發佈的對象字段本質上是危險的,並可能隨時打破;這不是問題。

+1

你知道,你可以在沒有JNI的幫助下做同樣的事情嗎?只需使用反射來設置/獲取對象中的私有字段:http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java –

+0

是的,這在Java中是正常的,但是如果你需要這樣的安全級別,我們可以用'SecurityManager'來阻止這樣的事情。 –

+0

@SamuelAudet'SecurityManager'塊是否也打破了JNI層的封裝? – yohjp

回答

0

令人驚歎的發現:Android上的JNI允許您訪問根據Java規則不應該存在的對象字段。

縮寫JNI不會出現在the question and answers that you linked to的任何地方,除非是作爲這個問題的動態生成鏈接。

這是否記錄在任何地方?

什麼像樣的書在Java開發應涵蓋publicprivate

這是一個官方的JNI的行爲或Android的具體情況?

都沒有。

什麼特定Android是編譯時的措施,讓你很難在一些androidjava,並且javax包添加代碼。

這是一個未定義的行爲?

這取決於你綁定什麼樣的基本名詞或概念來綁定到代名詞「this」。

如果「this」是「訪問私人或其他東西」,那麼行爲不是未定義的。

如果「this」是「訪問Android框架中的某些特定私人內容」,那麼未定義。有許多Android版本,以及許多版本的框架類。他們的內部實現不完全相同。通過Android SDK不會暴露任何事情都是有資格獲得谷歌的變化,設備製造商,ROM國防部維護等

+0

這裏和鏈接問題標籤中的[android-ndk]清楚地指向了JNI。通過「這個」我的意思是「成功訪問另一個包中另一個無關類的本地方法的類的私有或包私有文件」。我會爲後人編輯問題。 –

+0

@SevaAlekseyev:FWIW,在你的鏈接和我在開篇中引用的問題(「訪問Java中的包 - 專用字段」)中沒有'android-ndk'標記。 *鏈接到另一個問題的* android * ndk標籤(「NDK中的共享內存區域」),但這不是我引用的那個,而不是您發現此Java功能的那個。我對引用的混淆表示歉意。 – CommonsWare

+0

不,我已經發現了第一個功能。第二個是我確定我不應該能夠這樣做,無論是通過JNI還是通過Java :) –

1

的問題進行了說明,甚至在2006年

注發佈回的article, or rather proposal解決該JAVS定義了SecurityManager類,但它將所有JNI調用視爲security breach,因此從他們的角度來看,您的問題不是問題,如詢問"why can I get elevation to Administrator when I only install some driver/service?"

但是在Android上,事情更加明確。官方文件describes this class具有以下前言:

傳統安全代碼;不使用。

安全管理員做不是爲執行不受信任的代碼提供了一個安全的環境。不可信的代碼不能在Dalvik虛擬機內安全隔離。

強調的是他們的

如果您正在尋找保證訪問來自JNI本地字段和方法不會消失在Android中,好運的下一個版本更強的話您。另一方面,Android的某些未來版本將更改某些私有字段和方法的名稱或簽名的可能性較高。此外,他們可以改變執行情況,以使該字段保持不變,但必須以不同的方式使用。

最後請注意,所有這些因素不僅適用於私人或包私人方法,也公共方法和字段未使其進入官方文檔!

+0

Tx。就我而言,相關內容在SDK的更高版本(12+)中明確公開。 –