Можно ли использовать частные фреймворки Samsung в своем приложении?
Последние два дня я изучал возможность использования частных фреймворков Samsung в своем собственном приложении, в частности /system/frameworks/seccamera.jar. Пока ничего не получалось, поэтому мне интересно, возможно ли это вообще.
Некоторый фон
Я разрабатываю приложение, которое включает в себя сканирование QR-кодов и, следовательно, очень зависит от качества изображения с камеры. Поэтому я изо всех сил пытаюсь получить как можно больше контроля над камерой на уровне приложений. Одной из особенностей, которые значительно повышают скорость и надежность сканирования, является способность камеры выполнять точечный замер экспозиции. Тем не менее, нет общедоступного API для определения режима измерения экспозиции.
Однако с помощью встроенного приложения "Камера" в Galaxy Tab 2 вы можете указать несколько режимов измерения экспозиции, в том числе режим точечного замера. Поэтому я решил исследовать это дальше.
Что я уже пробовал
- Я извлек файлы apk и odex для встроенного приложения Camera с помощью Eclipse из / system / frameworks
- Я прогнал файл odex через baksmali и завел горсть файлов.smali
- Я искал через них "jectionMetering"и нашел класс com.sec.android.seccamera.SecCamera, который поддерживает указание режима измерения экспозиции через его внутренний класс Parameters.
Я определил, что этот класс находится в seccamera.jar (seccamera.odex), поэтому я деодексировал его отдельно:
java -jar baksmali-1.3.3.jar --deodex seccamera.odex -o seccamera
Затем я снова связал это:
java -jar smali-1.3.3.jar seccamera/ -o seccamera.dex
И наконец, я запустил dex-file через dex2jar, чтобы создать библиотеку jar:
../dex2jar-0.0.9.8/dex2jar.sh seccamera.dex
который я связал как внешнюю банку с моим проектом Eclipse. Я обнаружил, что класс SecCamera имеет почти такой же API, что и общедоступный android.hardware.Camera, поэтому он значительно упрощает конвертацию моего кода.
Проект компилируется без ошибок, но почти сразу падает при запуске со следующей ошибкой:
06-28 16:49:31.648: E/AndroidRuntime(2329): FATAL EXCEPTION: main
06-28 16:49:31.648: E/AndroidRuntime(2329): java.lang.NoClassDefFoundError: com.google.zxing.client.android.camera.PreviewCallback
06-28 16:49:31.648: E/AndroidRuntime(2329): at com.google.zxing.client.android.camera.CameraManager.<init>(CameraManager.java:70)
06-28 16:49:31.648: E/AndroidRuntime(2329): at com.treelev.biennale.MainActivity.onResume(MainActivity.java:212)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1158)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.Activity.performResume(Activity.java:4539)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2448)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2486)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2000)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.access$600(ActivityThread.java:128)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.os.Looper.loop(Looper.java:137)
06-28 16:49:31.648: E/AndroidRuntime(2329): at android.app.ActivityThread.main(ActivityThread.java:4514)
06-28 16:49:31.648: E/AndroidRuntime(2329): at java.lang.reflect.Method.invokeNative(Native Method)
06-28 16:49:31.648: E/AndroidRuntime(2329): at java.lang.reflect.Method.invoke(Method.java:511)
06-28 16:49:31.648: E/AndroidRuntime(2329): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
06-28 16:49:31.648: E/AndroidRuntime(2329): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
06-28 16:49:31.648: E/AndroidRuntime(2329): at dalvik.system.NativeStart.main(Native Method)
com.google.zxing.client.android.camera.PreviewCallback
это один из классов моего проекта, который я позаимствовал у проекта ZXing, так что он явно есть. Я должен был изменить это так, чтобы это реализовало SecCamera.PreviewCallback
вместо Camera.PreviewCallback
, Может быть, это виновник здесь.
Перед этой ошибкой есть пара других предупреждений:
06-28 16:49:31.625: I/dalvikvm(2329): Failed resolving Lcom/google/zxing/client/android/camera/PreviewCallback; interface 264 'Lcom/sec/android/seccamera/SecCamera$PreviewCallback;'
06-28 16:49:31.625: W/dalvikvm(2329): Link of class 'Lcom/google/zxing/client/android/camera/PreviewCallback;' failed
06-28 16:49:31.625: E/dalvikvm(2329): Could not find class 'com.google.zxing.client.android.camera.PreviewCallback', referenced from method com.google.zxing.client.android.camera.CameraManager.<init>
06-28 16:49:31.625: W/dalvikvm(2329): VFY: unable to resolve new-instance 111 (Lcom/google/zxing/client/android/camera/PreviewCallback;) in Lcom/google/zxing/client/android/camera/CameraManager;
06-28 16:49:31.625: D/dalvikvm(2329): VFY: replacing opcode 0x22 at 0x000c
06-28 16:49:31.632: I/dalvikvm(2329): Could not find method com.sec.android.seccamera.SecCamera.release, referenced from method com.google.zxing.client.android.camera.CameraManager.closeDriver
06-28 16:49:31.632: W/dalvikvm(2329): VFY: unable to resolve virtual method 1436: Lcom/sec/android/seccamera/SecCamera;.release ()V
06-28 16:49:31.632: D/dalvikvm(2329): VFY: replacing opcode 0x6e at 0x0007
06-28 16:49:31.632: I/dalvikvm(2329): Could not find method com.sec.android.seccamera.SecCamera.open, referenced from method com.google.zxing.client.android.camera.CameraManager.openDriver
06-28 16:49:31.632: W/dalvikvm(2329): VFY: unable to resolve static method 1435: Lcom/sec/android/seccamera/SecCamera;.open ()Lcom/sec/android/seccamera/SecCamera;
06-28 16:49:31.632: D/dalvikvm(2329): VFY: replacing opcode 0x71 at 0x0005
06-28 16:49:31.632: I/dalvikvm(2329): Could not find method com.sec.android.seccamera.SecCamera.setPreviewDisplay, referenced from method com.google.zxing.client.android.camera.CameraManager.openDriver
06-28 16:49:31.632: W/dalvikvm(2329): VFY: unable to resolve virtual method 1439: Lcom/sec/android/seccamera/SecCamera;.setPreviewDisplay (Landroid/view/SurfaceHolder;)V
06-28 16:49:31.632: D/dalvikvm(2329): VFY: replacing opcode 0x6e at 0x0016
Итак, что я здесь делаю не так? Можно ли вообще использовать частные фреймворки в моем пользовательском приложении (в отличие от исправления существующего приложения)?
1 ответ
При использовании таких внешних библиотек вы должны сообщить менеджеру пакетов, чтобы связать их во время выполнения
в этом случае вы добавляете следующий xml к элементу
<uses-library android:name="seccamera" />
android читает /system/etc/permissions/seccamera.xml при загрузке и отображает имя библиотеки seccamera в файл, упомянутый в xml (в данном случае /system/framework/seccamera.jar)
затем, когда вы пометите ее как используемую библиотеку, ОС свяжет этот код во время выполнения, и вы сможете свободно использовать классы
похоже, вы уже разобрались с трудной частью, заставляя затмение скомпилировать ее
Что касается "кражи" кода, пока вы не передаете восстановленный seccamera.jar кому-либо и используете его только для ссылки на функции из вашего кода (не включайте его в apk), я не вижу никаких реальных проблем
но Samsung может изменить API позже без предупреждения и сломать ваше приложение
Вы также можете пометить его как необязательный 1, или он откажется устанавливать на устройства без этой библиотеки