Pertanyaan Kesalahan "ABI tidak didukung" dalam tampilan web kromium


Saya mengumpulkan, menginstal dan menjalankan dengan sukses tampilan web kustom saya, berdasarkan pada kromium 46 (tag 46.0.2490.71) dengan mengikuti petunjuk ini:

https://www.chromium.org/developers/how-tos/android-build-instructions

dan membangun target ninja "system_webview_apk".

Dan itu sangat bagus!

Sekarang saya mencoba untuk mengintegrasikannya dalam gambar android khusus saya berdasarkan lolipop 5.1.1_r29 yang dibangun dari AOSP. Langkah-langkah build dan instal berfungsi, tetapi ketika aplikasi mencoba untuk menggelembungkan tampilan web, saya memiliki kesalahan berikut:

E/AndroidRuntime:  Caused by: java.lang.IllegalArgumentException: Unsupported ABI: null
 at dalvik.system.VMRuntime.getInstructionSet(VMRuntime.java:324)
 at dalvik.system.VMRuntime.is64BitAbi(VMRuntime.java:337)
 at android.webkit.WebViewFactory.getWebViewNativeLibraryPaths(WebViewFactory.java:286)

(Jejak stack penuh di akhir posting)

Yang aneh adalah, jika saya mengambil tepat APK yang sama, dan menginstalnya dengan ADB:

adb shell stop
adb pull /system/app/webview/webview.apk
adb shell rm -rf /system/app/webview/
adb shell start
adb install webview.apk

Kemudian kesalahan itu hilang dan tampilan web ditampilkan dengan benar.

Selanjutnya, jika saya mengembalikannya lagi di / system / app:

adb uninstall com.android.webview
adb push webview.apk /system/app/webview/webview.apk
adb shell stop
adb shell start

Gagal lagi dengan kesalahan yang sama.

Investigasi saya tentang "ABI Tidak Didukung: null" hanya memberi saya ini: https://code.google.com/p/chromium/issues/detail?id=559720

Tapi sepertinya tidak ada hubungannya.

Saya memerlukan tampilan web berdasarkan kromium 46 (setidaknya) di Android 5.1.1.

Setiap bantuan, petunjuk atau saran akan dihargai :)

Beberapa informasi tambahan:

Di nexus 6:

root@shamu:/ # ll /system/lib/libwebv*
-rw-r--r-- root     root     31282132 2008-04-15 23:40 libwebviewchromium.so
-rw-r--r-- root     root         5376 2015-12-09 15:51 libwebviewchromium_loader.so
-rw-r--r-- root     root         9532 2015-12-09 15:51 libwebviewchromium_plat_support.so

Konfigurasi pembuatan Chromium:

$ cat chromium.gyp_env
{ 'GYP_DEFINES': 'target_arch=arm OS=android', }

$ cat .gclient
solutions = [
  { "name"        : "src",
    "url"         : "https://chromium.googlesource.com/chromium/src.git",
    "deps_file"   : "DEPS",
    "managed"     : False,
    "custom_deps" : {
    },
    "safesync_url": "",
  },
]
cache_dir = None
target_os = ["android"]

Jejak stack penuh:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.webviewui/com.example.webviewui.MainActivity}: android.view.InflateException: Binary XML file line #6: Error inflating class android.webkit.WebView
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
     at android.app.ActivityThread.access$800(ActivityThread.java:151)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:135)
     at android.app.ActivityThread.main(ActivityThread.java:5254)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
  Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class android.webkit.WebView
     at android.view.LayoutInflater.createView(LayoutInflater.java:633)
     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)
     at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
     at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
     at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
     at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378)
     at android.app.Activity.setContentView(Activity.java:2145)
     at com.example.webviewui.MainActivity.onCreate(MainActivity.java:48)
     at android.app.Activity.performCreate(Activity.java:5990)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
  Caused by: java.lang.reflect.InvocationTargetException
     at java.lang.reflect.Constructor.newInstance(Native Method)
     at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
     at android.view.LayoutInflater.createView(LayoutInflater.java:607)
     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
     at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378) 
     at android.app.Activity.setContentView(Activity.java:2145) 
     at com.example.webviewui.MainActivity.onCreate(MainActivity.java:48) 
     at android.app.Activity.performCreate(Activity.java:5990) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
  Caused by: java.lang.IllegalArgumentException: Unsupported ABI: null
     at dalvik.system.VMRuntime.getInstructionSet(VMRuntime.java:324)
     at dalvik.system.VMRuntime.is64BitAbi(VMRuntime.java:337)
     at android.webkit.WebViewFactory.getWebViewNativeLibraryPaths(WebViewFactory.java:286)
     at android.webkit.WebViewFactory.loadNativeLibrary(WebViewFactory.java:397)
     at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:103)
     at android.webkit.WebView.getFactory(WebView.java:2194)
     at android.webkit.WebView.ensureProviderCreated(WebView.java:2189)
     at android.webkit.WebView.setOverScrollMode(WebView.java:2248)
     at android.view.View.<init>(View.java:3588)
     at android.view.View.<init>(View.java:3682)
     at android.view.ViewGroup.<init>(ViewGroup.java:497)
     at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:55)
     at android.webkit.WebView.<init>(WebView.java:544)
     at android.webkit.WebView.<init>(WebView.java:489)
     at android.webkit.WebView.<init>(WebView.java:472)
     at android.webkit.WebView.<init>(WebView.java:459)
     at java.lang.reflect.Constructor.newInstance(Native Method) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
     at android.view.LayoutInflater.createView(LayoutInflater.java:607) 
     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
     at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:378) 
     at android.app.Activity.setContentView(Activity.java:2145) 
     at com.example.webviewui.MainActivity.onCreate(MainActivity.java:48) 
     at android.app.Activity.performCreate(Activity.java:5990) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5254) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)    

5
2017-12-10 13:40


asal


Jawaban:


Ketika mengkompilasi WebView untuk lengan, Chromium (64.0.3282.134, dan kemungkinan versi lainnya) akan menargetkan armv7. Hasil ini menempatkan pustaka asli di bawah folder armeabi-v7a di apk. Ketika ini diinstal pada contoh saya perangkat Android 5.1.1 armv7 Android akan menjalankan dex2opt untuk memproses apk. Dalam melakukannya, ia akan mencari pustaka asli di bawah folder armeabi, bukan folder armeabi-v7a. Karena ini, tidak akan pernah menemukan pustaka dan ketika WebView diluncurkan gagal.

Sumber Chromium memiliki komentar yang mengatakan bahwa itu tidak lagi mendukung armeabi, jadi bangunan untuk itu tampaknya tidak layak. Saya mencoba untuk secara eksplisit membangun untuk versi lengan 6 dan menekan kegagalan kompilasi.

Solusi yang saya temukan adalah ini:

  1. Buka zip APK webview Chromium yang dibangun
  2. Ganti nama folder pustaka dari armeabi-v7a untuk armeabi
  3. Zip semuanya kembali, mengganti nama file yang dihasilkan sebagai apk. (Perhatikan, ketika zipping tidak memampatkan konten. WebView mengharapkan beberapa asetnya untuk tidak dikompresi, dan mengompresi mereka menghasilkan kegagalan runtime).
  4. Menggunakan zipalign dan apksigner untuk mendapatkan apk siap dipasang
  5. Instal file apk yang dihasilkan

Dengan melakukan itu saya mengamati perangkat Android 5.1.1 dapat menemukan pustaka asli dan menggunakannya saat meluncurkan WebView.


1
2018-02-05 21:19



Anda tidak dapat memasang aplikasi sistem hanya dengan mendorong APK / sistem / aplikasi /. Dan itu tidak cukup untuk memiliki perpustakaan asli disalin ke / system / lib /. Anda juga harus membuat entri yang relevan di /data/system/packages.xml file, dengan primaryCpuAbimulai lengan.


0
2018-02-06 11:01