سؤال

أنا أحاول تصحيح الأصلية المكتبة المشتركة أن بلدي التطبيق يستخدم من خلال JNI.أنا يمكن أن نعلق على تشغيل التطبيق على ما يرام مع "gdbserver --إرفاق pid" ولكن أنا بحاجة فعلا إطلاق التطبيق الخاص بي عندما كنت إطلاق gdbserver الأمر.

هناك مليون بلوق يضرب على هذا الموضوع ولكن أيا منها لا يبدو واضحا كيف يمكنك إطلاق التطبيق الخاص بك.كلهم يقولون أن مجرد نوع "gdbserver 10.0.2.2:1234 ./MyProgram" ولكن ما هو بالضبط "MyProgram".هو أن MyProgram.apk ؟ هو MyProgram.لذلك ؟ هو ذلك الملف الذي يتم إنشاؤه عند تثبيت التطبيق?إذا كان الأمر كذلك ، ما هي طريقها ؟

هل كانت مفيدة؟

المحلول

في حين أنه من الممكن تطوير الدائمة الحرة التطبيقات التي يمكن إطلاقها مباشرة من قذيفة وغيرها تصف يبدو تشغيل التعليمات البرمجية الخاصة بك داخل إطار التطبيق الروبوت.ولذلك لا يكون قابل للتنفيذ و بدلا من أن يكون APK الذي يحتوي على Dalvik فئة الملفات جنبا إلى جنب مع الموارد الأخرى بما في ذلك الأم الكائن المشترك.

إطلاق تطبيق في APK ينطوي على عدة خطوات

  1. على system_server عملية يتلقى نية طلب التطبيق الخاص بك.
  2. البويضة الملقحة العملية قال شوكة إيقاف عملية جديدة وتشغيل طريقة الفئة الخاصة بك.
  3. يتم تشغيل التطبيق الخاص بك في عملية جديدة.

بينما لا يمكنك إطلاق APK مباشرة عن طريق تمرير قابل للتنفيذ إلى gdbserver, من السهل إلى حد ما تؤدي إطلاقه من قذيفة باستخدام am الأوامر.

$ adb -d shell
# am
usage: am [subcommand] [options]

    start an Activity: am start [-D] <INTENT>
        -D: enable debugging

    send a broadcast Intent: am broadcast <INTENT>

    start an Instrumentation: am instrument [flags] <COMPONENT>
        -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
        -e <NAME> <VALUE>: set argument <NAME> to <VALUE>
        -p <FILE>: write profiling data to <FILE>
        -w: wait for instrumentation to finish before returning

    start profiling: am profile <PROCESS> start <FILE>
    stop profiling: am profile <PROCESS> stop

    <INTENT> specifications include these flags:
        [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
        [-c <CATEGORY> [-c <CATEGORY>] ...]
        [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
        [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
        [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
        [-n <COMPONENT>] [-f <FLAGS>] [<URI>]


# am start -n com.android.browser/.BrowserActivity
Starting: Intent { cmp=com.android.browser/.BrowserActivity }
#

بمجرد تشغيل التطبيق, استخدام gdbserver --attach <pid> مثل لديك من قبل.إذا كنت محظوظا التطبيق الخاص بك ينتظر بعض التفاعل مع المستخدم قبل الاتصال في التعليمات البرمجية الأصلية لتعطيك فرصة لنعلق و تعيين نقاط إيقاف في جدب.

نصائح أخرى

وجوجل يوفر حلا الرسمي لمشكلتك: "NDK-جدب '

ويتم تضمينه في NDK. IIRC، فإنه يتطلب أن يكون لديك نسخة من gdbserver المجمعة حتى داخل APK الخاص بك؛ IIRC، وهذا سوف يحدث تلقائيا إذا بنيت APK الخاص بك مع "NDK والبناء، وتحديد الحجج المناسبة.

يرجى مراجعة وثائق غوغل في $ NDK / مستندات / NDK-BUILD.html و$ NDK / مستندات / NDK-GDB.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top