2013-03-17 38 views
0

我今天在android源碼做了一些實驗。沒有java進口smali?

讓我告訴了完整的東西,從Android的源 我編譯framework.jar和反編譯它,併產生smali源,並保持它放在一邊。然後從CyanogenMod回購我添加了一個功能的提交到android源和編譯framework.jar反覆反編譯smali源查看smali方面的變化,以便我可以將它們移植到我的ROM。

我正在移植的功能需要導入某些類,例如導入dalvik.system.VMRuntime和使用這些導入類的額外編碼。所以現在我的問題是,我只能看到額外的編碼,即在小代碼中使用這些類,而不是那些導入。因此,當我只移植smali代碼時,我在logcat中得到了java.lang.NoSuchMethodError,它顯示它無法找到該方法。原因很明顯,因爲必要的課程沒有導入,那麼如何在小型代碼中進行?我沒有辦法在smali中做到這一點,因此新引入的方法無法工作。

任何可行的解決方案?

+0

(我不知道smali,所以可能有更好的解決方案) 沒有Java程序需要任何導入語句。要使用例如'ArrayList'你需要導入它或者完全引用它,作爲'java.util.ArrayList'。 也許你可以預處理你添加的代碼,用'dalvik.system.VMRuntime'替換'VMRuntime'等,並刪除所有的導入。 – 2013-03-17 09:45:07

+0

你能舉一個例子說明你將如何避免使用進口產品。 也許你可以舉例說明java.util.Arraylist呢?謝謝 – 2013-03-17 10:01:52

+0

我已將我的評論轉換爲答案,爲我添加的示例騰出空間。 – 2013-03-17 13:43:37

回答

4

進口確實在Java中的唯一的事情就是讓這個你可以提一個類無需指定完整的包名稱。在smali中,沒有導入 - 所有東西都使用包含該包的全限定類名稱。

因此,您的問題絕對與進口無關。這聽起來像你正試圖使用​​一種根本不存在於設備上的方法。

您可以從您的設備中拆卸框架罐,並找到dalvik.system.VMRuntime的定義並查看可用的方法。或者交替添加一些反射電話並將信息記錄到logcat。

值得注意的是,VMRuntime不是公共API的一部分,它可能不存在或在所有設備或未來版本的Android上保持一致。

+0

+1這看起來像是基於比我能提供的更具體的知識。 – 2013-03-17 20:28:59

1

(我不知道smali,所以有可能是一個更好的解決方案)

沒有Java程序,需要過任何import語句。要使用例如ArrayList需要導入或引用它作爲java.util.ArrayList。

例如,一個C++ #include和一個Java導入。 C++ #include直接在程序中插入代碼,通常是您正在使用的類的聲明。獲取聲明的過程在Java中分爲兩個階段。首先,編譯器確定完全限定的類名,然後使用它自己的庫和類路徑來查找該名稱的聲明。 Java導入僅用於計算完全限定的類名,因此對於僅由其完全限定名引用的任何類都不需要。

也許你可以預處理你添加的代碼來代替例如VMRuntime與dalvik.system.VMRuntime等,以便您可以編譯它沒有進口。

下面是一個使用java.util中的類,以不同的方式短節目的例子,沒有任何進口:

public class Test { 
    public static void main(String[] args) { 
    java.util.List<String> list = new java.util.ArrayList<String>(); 
    list.add("bbb"); 
    list.add("aaa"); 
    java.util.Collections.sort(list); 
    System.out.println(list); 
    } 
} 
+0

謝謝:)我會試試看,並讓你知道:) – 2013-03-17 18:34:59