مجانا - كيفية مشاركة ملفات APK المقسمة التي تم إنشاؤها أثناء استخدام التشغيل الفوري ، داخل Android نفسه؟




صيغة apk (2)

خلفية

لدي تطبيق ( here ) يسمح ، من بين ميزات أخرى ، بمشاركة ملفات APK.

من أجل القيام بذلك ، يصل إلى الملف عن طريق الوصول إلى مسار packageInfo.applicationInfo.sourceDir (رابط مستندات here ) ، ويشارك فقط الملف (باستخدام ContentProvider عند الحاجة ، كما اعتدت here ).

المشكلة

يعمل هذا بشكل جيد في معظم الحالات ، خاصةً عند تثبيت ملفات APK من Play Store أو من ملف APK مستقل ، لكن عندما أقوم بتثبيت تطبيق باستخدام Android-Studio نفسه ، أرى عدة ملفات APK على هذا المسار ، ولا يوجد أي منها تلك الصالحة التي يمكن تثبيتها وتشغيلها دون أي مشاكل.

في ما يلي لقطة شاشة لمحتوى هذا المجلد ، بعد تجربة نموذج من repo github "Alerter" :

لست متأكدًا من بدء هذه المشكلة ، ولكنها تحدث على الأقل على جهاز Nexus 5x مع نظام التشغيل Android 7.1.2. ربما قبل ذلك.

ما وجدته

يبدو أن هذا يرجع فقط إلى حقيقة أنه يتم تمكين التشغيل الفوري على IDE ، بحيث يمكن أن يساعد في تحديث التطبيق دون الحاجة إلى إعادة بنائه جميعًا:

بعد تعطيله ، أستطيع أن أرى أن هناك APK واحدًا ، تمامًا كما كان في الماضي:

يمكنك أن ترى الفرق في حجم الملف بين ملف APK الصحيح وانقسام واحد.

أيضًا ، يبدو أن هناك واجهة برمجة تطبيقات (API) للحصول على المسارات إلى جميع ملفات APK المقسمة:

https://developer.android.com/reference/android/content/pm/ApplicationInfo.html#splitPublicSourceDirs

السؤال

ما هي أسهل طريقة لمشاركة ملف APK الذي يجب تقسيمه إلى عدة تطبيقات؟

هل هناك حاجة حقا لدمجهم بطريقة أو بأخرى؟

يبدو أنه من الممكن وفقًا للمستندات :

مسارات كاملة لتقسيم ملفات بتقسيم صفري أو أكثر ، عند دمجها مع APK الأساسي المحدد في sourceDir ، تشكل تطبيقًا كاملاً.

ولكن ما هي الطريقة الصحيحة للقيام بذلك ، وهل هناك طريقة سريعة وفعالة للقيام بذلك؟ ربما دون حقا إنشاء ملف؟

هل من الممكن وجود واجهة برمجة تطبيقات (API) للحصول على APK مدمج من كل الأجزاء المنقسمة؟ أو ربما مثل APK موجود بالفعل على أي حال في مسار آخر ، وليس هناك حاجة لدمج؟

تحرير: لاحظت أن جميع تطبيقات الطرف الثالث التي جربتها من المفترض أن تشارك ملف APK للتطبيق المثبت في فشل في القيام بذلك في هذه الحالة.


أنا الرائد التقني فيGoogle for Android Gradle Plugin ، واسمحوا لي أن أحاول الإجابة على سؤالك على افتراض أنني أفهم حالة الاستخدام الخاصة بك.

أولاً ، ذكر بعض المستخدمين أنه لا ينبغي عليك مشاركة البنية الممكّنة لـ InstantRun وهي صحيحة. يتم تخصيص "التشغيل الفوري" الذي يستند إلى تطبيق ما بشكل كبير لصورة الجهاز / المحاكي الحالية التي تنشرها. لذلك ، لنفترض أساسًا أنك تقوم بإنشاء بنية مُمكَّنة من تطبيق الأشعة تحت الحمراء لتطبيقك لجهاز معين يعمل على 21 ، فسوف تفشل فشلاً ذريعًا إذا حاولت استخدام ملفات APK نفسها بالضبط على جهاز يعمل بنظام التشغيل 23. يمكنني الدخول في شرح أعمق بكثير إذا لزم الأمر ولكن يكفي أن نقول إننا نقوم بإنشاء أكواد بايت مخصصة على واجهات برمجة التطبيقات الموجودة في android.jar (وهو بالطبع إصدار محدد).

لذلك ، لا أعتقد أن مشاركة ملفات APK هذه أمر منطقي ، يجب عليك إما استخدام إصدار معطل من IR أو إنشاء إصدار.

الآن للحصول على بعض التفاصيل ، يحتوي كل ملف slice APK على ملف (ملفات) dex واحد ، لذلك من الناحية النظرية ، لا يوجد شيء يمنعك من فك ضغط كل ملفات APK الخاصة بهذه الشريحة ، واستعادة جميع ملفات dex وإعادتها إلى القاعدة .apk / rezip / resign و يجب أن تعمل فقط. ومع ذلك ، سيظل تطبيق تمكين الأشعة تحت الحمراء لذلك سيبدأ تشغيل الخادم الصغير للاستماع إلى طلبات IDE ، وما إلى ذلك ، إلخ ... لا يمكنني تخيل سبب وجيه للقيام بذلك.

أتمنى أن يساعدك هذا.


بالنسبة لي كان التشغيل الفوري كابوسًا ، وأوقات بناء تتراوح من 2 إلى 5 دقائق ، وغالبًا ما تكون مدهشة ، لم يتم تضمين التغييرات الحديثة في عمليات الإنشاء. أوصي بشدة بتعطيل التشغيل الفوري وإضافة هذا السطر إلى gradle.properties:

android.enableBuildCache=true

غالبًا ما يستغرق البناء الأول بعض الوقت للمشروعات الكبيرة (1-2 دقائق) ، ولكن بعد تخزينها مؤقتًا تكون الإنشاءات اللاحقة سريعة بسرعة (أقل من 10 ثوانٍ).

حصلت على هذه النصيحة من reddit user / u / QuestionsEverythang التي أنقذتني الكثير من المتاعب مع التشغيل الفوري!







android-instant-run