2012-09-28 21 views
11

मैं कुछ एंड्रॉइड एपीके को कार्यात्मक परीक्षण के लिए कुछ उपकरण जोड़ने के लिए इंजीनियर किया। मैं चाहता हूँ निम्नलिखित कैसे मैं .smali फाइलों में प्रत्येक विधि करने के लिए की तरहसंशोधित .smali फ़ाइलें

Log.e(TAG, "some descritpion", e); 

कुछ जोड़ सकते हैं के रूप में एक smali दिया पता है।

.class public Ld; 
.super Landroid/view/View; 
.source "SourceFile" 


# instance fields 
.field a:Z 

.field b:Lcom/rovio/ka3d/App; 


# direct methods 
.method public constructor <init>(Lcom/rovio/ka3d/App;)V 
    .locals 2 
    .parameter 

    .prologue 
    const/4 v1, 0x1 

    .line 317 
    invoke-direct {p0, p1}, Landroid/view/View;-><init>(Landroid/content/Context;)V 

    .line 313 
    const/4 v0, 0x0 

    iput-boolean v0, p0, Ld;->a:Z 

    .line 314 
    const/4 v0, 0x0 

    iput-object v0, p0, Ld;->b:Lcom/rovio/ka3d/App; 

    .line 318 
    iput-object p1, p0, Ld;->b:Lcom/rovio/ka3d/App; 

    .line 319 
    invoke-virtual {p0, v1}, Ld;->setFocusable(Z)V 

    .line 320 
    invoke-virtual {p0, v1}, Ld;->setFocusableInTouchMode(Z)V 

    .line 321 
    return-void 
.end method 


# virtual methods 
.method public a(Z)V 
    .locals 4 
    .parameter 

    .prologue 
    const/4 v3, 0x0 

    .line 325 
    invoke-virtual {p0}, Ld;->getContext()Landroid/content/Context; 

    move-result-object v0 

    const-string v1, "input_method" 

    invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; 

    move-result-object v0 

    check-cast v0, Landroid/view/inputmethod/InputMethodManager; 

    .line 326 
    invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder; 

    move-result-object v1 

    invoke-virtual {v0, v1, v3}, Landroid/view/inputmethod/InputMethodManager;->hideSoftInputFromWindow(Landroid/os/IBinder;I)Z 

    .line 327 
    if-eqz p1, :cond_0 

    .line 329 
    invoke-virtual {p0}, Ld;->getWindowToken()Landroid/os/IBinder; 

    move-result-object v1 

    const/4 v2, 0x2 

    invoke-virtual {v0, v1, v2, v3}, Landroid/view/inputmethod/InputMethodManager;->toggleSoftInputFromWindow(Landroid/os/IBinder;II)V 

    .line 330 
    invoke-virtual {p0}, Ld;->requestFocus()Z 

    .line 333 
    :cond_0 
    iput-boolean p1, p0, Ld;->a:Z 

    .line 334 
    return-void 
.end method 

.method public onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; 
    .locals 3 
    .parameter 

    .prologue 
    .line 343 
    new-instance v0, La; 

    iget-object v1, p0, Ld;->b:Lcom/rovio/ka3d/App; 

    const/4 v2, 0x0 

    invoke-direct {v0, v1, p0, v2}, La;-><init>(Lcom/rovio/ka3d/App;Landroid/view/View;Z)V 

    .line 345 
    const/4 v1, 0x0 

    iput-object v1, p1, Landroid/view/inputmethod/EditorInfo;->actionLabel:Ljava/lang/CharSequence; 

    .line 350 
    const v1, 0x80090 

    iput v1, p1, Landroid/view/inputmethod/EditorInfo;->inputType:I 

    .line 351 
    const/high16 v1, 0x1000 

    iput v1, p1, Landroid/view/inputmethod/EditorInfo;->imeOptions:I 

    .line 352 
    return-object v0 
.end method 

उत्तर

28

Log.e() को कॉल करने का वास्तविक कोड काफी सरल है। इसमें कुछ शामिल होगा:

const-string v0, "MyTag" 
const-string v1, "Something to print" 
# assuming you have an exception in v2... 
invoke-static {v0, v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I 

हालांकि, आपको सावधान रहना होगा कि आप किस रजिस्टरों का उपयोग करते हैं। आप उस रजिस्टर को क्लॉबर नहीं करना चाहते हैं जिसके पास एक मूल्य है जिसका उपयोग बाद में किया जाएगा।

तो तुम 2 विकल्प हैं:

  1. का पता लगाएं "सुरक्षित" अप्रयुक्त रजिस्टर, और (मुश्किल हो सकता है)
  2. विधि के रजिस्टर गिनती बढ़ाने के लिए उन का उपयोग करें, और नव निर्मित रजिस्टरों का उपयोग

नंबर 2 के लिए, केवल गॉचा यह है कि नए रजिस्ट्रार रजिस्टर श्रेणी के अंत में नहीं हैं - वे वास्तव में पैरामीटर रजिस्टरों से पहले हैं।

उदाहरण के लिए, चलिए एक विधि लें जिसमें कुल 5 रजिस्ट्रार हैं (.registers 5), जिनमें से 3 पैरामीटर रजिस्टर्स हैं। तो आपके पास v0 और v1 हैं जो गैर-पैरामीटर रजिस्ट्रार हैं, और पी 0-पी 2 जो 3 पैरामीटर रजिस्टर्स हैं, और v2-v4 के लिए उपनाम हैं।

यदि आपको अतिरिक्त 2 रजिस्टरों को जोड़ने की आवश्यकता है, तो आप इसे .registers 7 पर टक्कर देंगे। पैरामीटर रजिस्टर रजिस्टर रेंज के अंत में रहते हैं, इसलिए पी 0-पी 2 अब v4-v6 के लिए अलियाकृत हैं, और v2 और v3 नए रजिस्ट्रार हैं जो उपयोग करने के लिए सुरक्षित हैं।

+0

यही कारण मेरे प्रयासों कभी कभी बेवजह एक दुर्घटना का कारण होगा। धन्यवाद! –

+1

यह एक अच्छा संक्षिप्त उत्तर है, लेकिन मुझे लगता है कि invoke-static के अंत में एक छोटा टाइपो है और इसे एक की जरूरत है; Ljava/लैंग/थ्रोबल – GeekyDeaks

+0

के बाद यह तय है, धन्यवाद। – JesusFreke

10

रजिस्ट्रारों पर एक टिप्पणी जो यीशुफ्रेके के उत्तर पर टिप्पणी के लिए बहुत बड़ी थी। यह उल्लेखनीय है कि यदि आपके पास निर्देशों के बजाय .local निर्देश हैं, तो संख्या योजना अलग होगी। मोटे तौर पर, निर्देशों निम्नलिखित तरीके से संबंधित हैं:

.registers = .locals + NUMBER_OF_PARAMETERS 

तो अगर आप एक समारोह 4 मानकों निर्देशों कि दिखाया जा सकता है कि और 3 और रजिस्टरों का उपयोग करता है .registers 7 या .locals 3 हैं। इस प्रकार

और तुम रजिस्टरों सेटअप मिल जाएगा:

v0 
v1 
v2 
v3 <==> p0 
v4 <==> p1 
v5 <==> p2 
v6 <==> p3 

स्रोत: https://github.com/JesusFreke/smali/wiki/Registers

3

smali कोड जोड़ने के लिए सरल तरीकों में से एक, एक परीक्षण Android एप्लिकेशन में जावा कोड लिखने के लिए है। Apktool का उपयोग करके अलग करें। स्माली फाइलों की पहचान करने के लिए स्माली फाइलों को देखें और इसे अलग किए गए अन्य ऐप्स में इंजेक्शन के लिए इसका इस्तेमाल करें।

डाउनलोड यहाँ apktool: http://ibotpeaches.github.io/Apktool/