ADB kullanarak bir cihazın panosuna yazmak mümkün mü?


26

Köklü bir Android cihazının panosuna nasıl yazılacağını (ve mümkünse, okumayı) öğrenmekle ilgileniyorum.

Bunu USB üzerinden ADB kullanarak yapmayı umuyorum ve nadiren yapmayı planladığım bir şey olduğu için bunu yapmama yardımcı olacak uygulamaları yüklemekle ilgilenmiyorum.

Beni doğru yönde yönlendiren herhangi bir öneri veya yardım büyük memnuniyetle karşılanacaktır.


Emülatörlere daha kolay yaklaşmak isteyen herkes için, buraya bakın: stackoverflow.com/questions/3391160/…
Mygod

Yanıtlar:


21

Evet, bunu gerçekten yapabilirsiniz. Panoyu kontrol ettiğinizde biraz zahmetli görünüyor, ama gayet iyi çalışıyor.

Öncelikle, mevcut pano içeriğini service call clipboard 1bir adb kabuğundan (veya önce kabuklamadan adb shell service call clipboard 1) inceleyebilirsiniz. Bir yeniden başlatma işleminden sonra başlangıçta boş başlayabilir, örneğin:

# service call clipboard 1
Result: Parcel(
  0x00000000: 00000000 00000001 00000000 00000000 '................'
  0x00000010: 00000000 00000000                   '........        ')
#

service call clipboard 2Temel olarak 3 parametre alan iki metni ve panoya koymak istediğiniz dizeyi kullanarak panoya metin koyabilirsiniz:

# service call clipboard 2 i32 1 i32 0 s16 "Hi there"
Result: Parcel(00000000    '....')

Dürüst olmak gerekirse, ilk iki parametrenin ne olduğundan emin değilim. Yığın Taşması ile ilgili bir cevap , ilk int'nin "parseldeki öğe sayısı" (bu durumda bir tane) ve ikincisinin dize uzunluğu olduğunu ileri sürdü. Ancak, ikinci parametre için 0 kullandım ve iyi çalışıyor ve bu özel işlevle eşleşen hiçbir belge bulamıyorum ... bu yüzden buna değer.

Her durumda, temel olarak 3 alanlı bir Parcel nesnesi oluşturup panoya geçiriyor. Pano daha sonra Parsel'in paketini açar ve pano içeriği olarak geçen dize değerini ayarlar. Bunu daha sonra değeri almaya gittiğinde görebilirsiniz:

# service call clipboard 1
Result: Parcel(
  0x00000000: 00000000 00000001 00000000 00000008 '................'
  0x00000010: 00690048 00740020 00650068 00650072 'H.i. .t.h.e.r.e.'
  0x00000020: 00000000 00000000                   '........        ')
#

Benzer şekilde, bir metin giriş alanına uzun basar ve bunu yaptıktan sonra "Yapıştır" ı tıklarsanız, call service clipboard 2yukarıdaki satırdan ayarlanan metni alırsınız (ve tamamen normal görünür).

(Yukarıdaki örnekler, CyanogenMod 7 çalıştıran HTC EVO cihazımdan geliyor)


1
Sonunda WPA anahtarımı yapıştırabilir ve yönlendiricime bağlayabilirim: D. Teşekkür ederim.
earthmeLon

3
@earthmeLon, WPA anahtarınızı kopyalamanın kolay bir yolunu bulmaya çalışıyorsanız, bir dahaki sefere kendinize e-postayla göndermeyi ve e-postadan kopyala / yapıştır'ı ya da içeren bir metin dosyasını bilgisayarınıza kopyalamayı daha kolay bulabilirsiniz USB üzerinden cihazınızı açın, ardından oradan açın ve kopyalayın. PC'den yazmanıza (veya yapıştırmanıza) izin veren ve telefonda görünmesini sağlayan Wifi Klavye gibi başka seçenekler de var.
GAThrawn

4
WPA anahtarım hassas. HİÇ yerel olmayan herhangi bir ağ üzerinden yayınlanmamalıdır. @Gathrawn önerileri için teşekkürler. Sonunda bu işlevsellik için daha fazla kullanım bulacağım: D
earthmeLon

6
Ben olsun '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')yaparkencall service clipboard 2
cprcrack

3
Parolanızı ya da herhangi bir metni androiddeki bir metin alanına kopyalamanız gerekirse, ayrıca "abd kabuğu giriş metni" Dize "" - Panodan vazgeçtim ...
Philippe

14

Bu metodolojiyi kullandım ve 4.x'te iyi çalıştı, fakat lolipopta başarısız oldu. Alternatif bir çözüm ararken, şunu buldum: /programming/3391160/paste-text-on-android-emulator

tam olarak istediğiniz gibi değil, ama kendim için çoğu zaman metinleri panoya kopyalamak istiyorum çünkü parola alanına yapıştırmak istiyorum.

ek bir bonus olarak, işte bültenim ( 2015-04-24, metindeki boşluklara izin vermek için düzenlendi ):

#!/bin/bash

if [[ "$1" != "" ]]
then
    TEXT=$1
else
    read -s -p "Enter text you want to insert: " TEXT
fi

ESCAPED_TEXT=`echo $TEXT | sed "s/\s/\%s/g"`
adb shell input text "$ESCAPED_TEXT"

İpin iki katına çıkmanızın nedeni iki kabuğun olmasıdır: kabuğunuz ve adb kabuğu . Ancak, bunun işareti ve işareti gibi kabuğunda özel bir anlamı olan diğer karakterler için başarısız olacağını düşünüyorum .
Dan Dascalescu

Bu kaçmayı uygun bir şekilde yapmak adb kabuğunun görevi olacaktır, ancak görünüşe göre tamamen yapmaz. Sürümümde (1.0.31) yukarıda kullanılan boşluk kaçış gerekli değil, ancak her türlü özel karakterin kaçması gerekiyor (ancak bunu güvenli bir şekilde yapmak mümkün değil).
Matthijs Kooijman

Özel karakterleri kullanmanın daha iyi bir yolu stdin içinden boru gibi yapmaktır, bunun gibi: echo "$TEXT" | adb shell xargs -0 input text\ 0 (NUL) karakterleri hariç herhangi bir metni ele alması gerekir. Ne yazık ki, eski adb sürümleri stdin'i adb komut satırında belirtilen bir komuta iletmez. Bu daha yeni adb sürümlerinde sabittir, ancak çalışması için Android N gerekir .
Matthijs Kooijman

Kaçan boşluğa gelince, görünüşte inputAndroid tarafından kullanılan komut için gerekli değil adb shell. Ayrıca, bu cevaba göre sadece SDK sürüm 22 ve altı (Lollipop ve altı, inanıyorum) için gerekli .
Matthijs Kooijman

4

İşte betiğin yukarıdaki galeri tarafından geliştirilmiş bir sürümü. Bu komut dosyasında olduğu gibi, panoya yazmaz, ancak halihazırda odaklanmış olan giriş alanına gönderir; bu genellikle istediğiniz şekildedir.

Bu komut dosyası, Android kabuğunu onlarla karıştırmamak için özel karakterlerden kaçmak için geliştirilmiştir. Bu, herhangi bir dizginin değişmeden gönderilmesine izin vermelidir. readKomutun (arkadaki) ters eğik çizgiyi yorumlamasını önlemek için , -r ekledim.

Bu, aşağıdaki özel karakterlerin listesi kullanılarak test edildi:

./adb-send-string ' \`~!@#$%^&*()-_=+[{]}|;:",<.>/?'\'

İşte senaryo:

#!/bin/bash
# Send text to android device using adb, emulating keyboard input.
# Based on a script from /android//a/105881/223695
# extended to support special characters

if [[ "$1" != "" ]]
then
    TEXT="$1"
else
    read -s -r -p "Enter text you want to insert: " TEXT
fi

escape() {
    # Encapsulate the string in $'', which enables interpretation of
    # \xnn escapes in the string. This is not POSIX-sh, but an extension
    # documented by bash and also supported by the Android sh.
    echo -n "$'"

    # Process each character in $1 one by one
    for (( i=0 ; i<${#1}; i++ )); do
        # Extract the i'th character
        C="${1:$i:1}"
        if [ "$C" = ' ' ]; then
            # Encode spaces as %s, which is needed for Android's
            # "input text" command below 6.0 Marshmellow
            # See /programming//documentation/android/9408/adb-shell/3958/send-text-key-pressed-and-touch-events-to-android-device-via-adb
            echo -n '%s'
        else
            # Encode everything else as \xnn, to prevent them from being
            # interpreted by the Android shell
            printf '\\x%02x' "'$C"
        fi
    done
    # Terminate the $''
    echo -n "'"
}

ESCAPED_TEXT=`escape "$TEXT"`
adb shell input text "$ESCAPED_TEXT"

3

Ben biraz denedim ve googled ve görünüyor ki call-service-clipboard-yaklaşımı yeni androidlerde çalışmayı durdurdu, benim için 4.4.4 sürümü Android'de başarısız oldu. Yani panoya erişmek (adb-shell'den okumak) için bir uygulamaya ihtiyacınız olacak. Kullandığım github majido gelen saç kesme . Apk de barındırılıyor, bu yüzden onu kendiniz derlemenize gerek yok. Kurulduğunda, yayın komutlarını kullanarak iletişim kurabilirsiniz (uygulama size tam komutları söyleyecektir). Uygulama kök gerektirmez.


Amacınızın ne olduğunu bilmediğimiz için: lütfen gönderinizi düzenleyebilir ve bu uygulamanın ne yaptığını ve nasıl kullanabileceğini dahil edebilir misiniz? İnsanlar zaten yayınınızı "cevap değil" olarak işaretlemeye başladılar, çünkü açıkça yapmak istediğiniz noktayı özlüyorlar. Şimdiden teşekkürler!
Izzy

clipper benim için 'adb shell input text' kullanmaktan daha iyi çalıştı. AdbPaste gtub.com/gcb/AdbPaste 'adb kabuk giriş metnini' kaydırmak için Python betiğinden daha iyi . Bir dosya parametresini desteklemek için kesme makinesini geliştirdim, böylece panoya yalnızca bir veya iki saniye içinde birden fazla sayfa gönderebilirim. Burada geliştirilmiş kod: github.com/RoundSparrow/clipper
RoundSparrow hilltx

0

adb shell inputKarakterleri göndermek için kullanılan başka bir komut dosyası burada bulunabilir: https://github.com/gcb/AdbPaste

Bu, github'dan kopyalanabilen veya doğrudan indirilip çalıştırılabilen bir Python betiğidir:

$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.