android - 是否可以在我自己的应用程序中使用私有(private)三星框架?

标签 android galaxy-tab private-methods

在过去的两天里,我一直在探索在我自己的应用程序中使用私有(private)三星框架的可能性,特别是/system/frameworks/seccamera.jar。还没有任何效果,所以我想知道是否有可能。

一些背景

我正在开发一个涉及扫描二维码的应用程序,因此非常依赖相机的图像质量。所以我正在努力从应用程序级别尽可能多地控制相机。大大提高扫描速度和可靠性的功能之一是相机进行点曝光测光的能力。但是,没有用于指定曝光测量模式的公共(public) API。

但是,通过 Galaxy Tab 2 上的内置相机应用程序,您可以指定多种曝光测光模式,其中包括点测光模式。所以我决定进一步调查。

我已经尝试过的

  1. 我使用 Eclipse 从/system/frameworks 中提取了内置相机应用程序的 apk 和 odex 文件
  2. 我通过 baksmali 运行 odex 文件,最后得到了一些 .smali 文件
  3. 我在其中搜索“exposureMetering”并找到了一个类 com.sec.android.seccamera.SecCamera,它支持通过其参数内部类指定曝光测光模式
  4. 我确定这个类驻留在 seccamera.jar (seccamera.odex) 中,所以我单独对其进行了 deodexed:

    java -jar baksmali-1.3.3.jar --deodex seccamera.odex -o seccamera
    
  5. 然后我再次将它 dexed 到一起:

    java -jar smali-1.3.3.jar seccamera/ -o seccamera.dex
    
  6. 最后我通过 dex2jar 运行 dex-file 来创建一个 jar 库:

    ../dex2jar-0.0.9.8/dex2jar.sh seccamera.dex
    

我将其作为外部 jar 链接到我的 Eclipse 项目。我发现 SecCamera 类具有与公共(public) android.hardware.Camera 几乎相同的 API,因此它使我的代码转换更加容易。

项目构建没有错误,但它在启动时几乎立即崩溃并出现以下错误:

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

那么,我在这里做错了什么?是否可以在我的自定义应用程序中使用私有(private)框架(而不是修补现有应用程序)?

最佳答案

当像这样使用外部库时,你必须通知包管理器在运行时链接它们

在这种情况下,您将以下 xml 添加到 AndroidManifest.xml 中的 元素

<uses-library android:name="seccamera" />

android 在启动时读取/system/etc/permissions/seccamera.xml,并将 seccamera lib 名称映射到 xml 提到的文件(在本例中为/system/framework/seccamera.jar)

然后当您将其标记为已用库时,操作系统将在运行时链接该代码,您可以自由使用这些类

看起来你已经找到了困难的部分,让 eclipse 编译它

至于“窃取”代码,只要您不与任何人共享重建的 seccamera.jar 并且仅使用它来引用您代码中的函数(不将其包含到 apk 中),我看不出有任何实际问题

但三星以后可能会在没有警告的情况下更改 API 并破坏您的应用

您可能还想将其标记为不需要 1 , 否则它将拒绝在没有该库的设备上安装

关于android - 是否可以在我自己的应用程序中使用私有(private)三星框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11245728/

相关文章:

android - 带有对话框主题的 Activity 未显示为对话框

Android Location getTime() 添加 1 天错误

android - EditText 显示 2 行文本,而不是 1 行,尽管设置了所有属性(仅在 Galax Tab 10.1,ICS 上)

java - 如何返回多个变量和/或使用私有(private) int 方法?

android - 在改造 2.0 中处理 JSON 响应

javascript - 我想将 JSON 数据从 javascript 传递到 React Native 中的 Native iOS 模块

java - 应用程序中未显示菜单

Android : Samsung Galaxy Tabs and Android 2. 2 设备显示 GPS 日期从 2012 年 1 月 1 日提前 1 天

java - 使用 PowerMock-Mockito 的部分模拟私有(private)方法

c# - 使用线程、事件和私有(private)方法测试类