Tag: dalvik

如果类实现了更新的接口,Android推荐的安全支持更新api的方法有错误。 为什么?

为了支持不同的Api级别,我使用的是这里描述的技术: http : //android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too。 HTML 以下是文章中的示例: public static VersionedGestureDetector newInstance(Context context, OnGestureListener listener) { final int sdkVersion = Integer.parseInt(Build.VERSION.SDK); VersionedGestureDetector detector = null; if (sdkVersion < Build.VERSION_CODES.ECLAIR) { detector = new CupcakeDetector(); } else if (sdkVersion < Build.VERSION_CODES.FROYO) { detector = new EclairDetector(); } else { detector = new FroyoDetector(context); } detector.mListener = listener; return […]

在使用多个dex文件时,是否有必要将同一个包的类保留在同一个dex中

关于标题 “相同包的类”表示共享相同包访问的类。 请注意,类abcFoo没有类abBar的包访问权 。 因为如果前者的修饰符是默认值,后者无法访问前者。 问题 如果我将同一个包中的两个类分成两个dex文件,即使我正确加载它们,我也会在运行时遇到一些错误,logcat喜欢: I / dalvikvm(6498):DexOpt:非法方法访问(从Lcom / fish47 / multidex / TestMatchWord调用Lcom / fish47 / multidex / Foo; .isWholeWord(Lcom / fish47 / multidex / Foo;)Z;) I / dalvikvm(6498):找不到方法com.fish47.multidex.core.Foo.isWholeWord,从com.fish47.multidex.core.TestMatchWord.test_english方法引用 W / dalvikvm(6498):VFY:无法解析虚方法758:Lcom / fish47 / multidex / Foo; .isWholeWord(Lcom / fish47 / multidex / Foo;)Z 推测 这是代码,它会弹出以下错误消息: vm / analysis / Optimize.c […]

Android Dx Error1,无法转换为Dalvik格式

我对这个问题感到绝望:我想用一个额外的.jar导出/运行我的Android应用程序。我添加到buildpath中。 我确定我正确地添加了它,还有其他5个.jars,它们都工作正常。 有了这个特别的,我得到了上面提到的错误。 我已经尝试过在这个问题中找到的所有内容: “转换为Dalvik格式失败,错误1”在外部JAR上 和其他几个链接谷歌吐了出来。 主要的问题是,我实际上不明白我追加的消息想要告诉我什么,因为如果我将所有的jar子添加到“正常”的javaproject中,它运行得非常好…… 在Android 4.0.3上开发, proguard 4.8, adt 16.0.1.v201112150204-238534, eclipse 3.7.1.r37 请帮我 [2012-07-18 10:45:48 – myapp] Dx警告:忽略没有关联的EnclosingMethod属性的匿名内部类(iaik.xml.crypto.XSecProvider $ 1)的InnerClasses属性。 这个类可能是由一个没有以现代.class文件格式为目标的编译器生成的。 建议的解决方案是使用最新的编译器从源代码重新编译类,而不指定任何“-target”类型选项。 忽略此警告的后果是,对此类的reflection操作将错误地指示它不是内部类。 …… [2012-07-18 10:45:48 – myapp] Dx警告:忽略没有关联的EnclosingMethod属性的匿名内部类(iaik.xml.crypto.XSecProvider $ 2)的InnerClasses属性。 这个类可能是由一个没有以现代.class文件格式为目标的编译器生成的。 建议的解决方案是使用最新的编译器从源代码重新编译类,而不指定任何“-target”类型选项。 忽略此警告的后果是,对此类的reflection操作将错误地指示它不是内部类。 在不构建核心库时,不明智或错误地使用核心类(java。*或javax。*)。 这通常是由于在使用IDE(例如Eclipse)时无意中在应用程序的项目中包含了核心库文件。 如果你确定你不是故意定义一个核心类,那么这就是最可能的解释。 但是,您实际上可能正在尝试在核心命名空间中定义一个类,您可能已经从其中获取了一个类,例如,来自非Android虚拟机项目。 这肯定是行不通的。 它至少会危害您的应用与该平台的未来版本的兼容性。 它的合法性通常也是有问题的。 如果您真的打算构建一个核心库 – 它只适合作为创建完整虚拟机分发的一部分,而不是编译应用程序 – 那么使用“–core-library”选项来抑制此错误消息。 如果你继续使用“–core-library”但实际上正在构建一个应用程序,那么预先警告你的应用程序在某些时候仍然无法构建或运行。 请为愤怒的客户做好准备,例如,一旦升级操作系统,您的应用程序就会停止运行。 你应该为这个问题负责。 如果您合法地使用恰好位于核心软件包中的某些代码,那么最简单的安全替代方法是重新打包该代码。 也就是说,将有问题的类移动到您自己的包命名空间中。 这意味着它们永远不会与核心系统类冲突。 […]

了解Dalvik代码的反汇编?

我正在和我写的一个小型Hello World Android应用程序中使用smali和baksmali 。 我的源代码是: package com.hello; import android.app.Activity; import android.os.Bundle; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 然后被拆解为: .class public Lcom/hello/Main; .super Landroid/app/Activity; .source “Main.java” # direct methods .method public constructor ()V .locals 0 .prologue .line […]

在Android中,如何使用Javareflection调用sun.misc.Unsafe方法?

虽然有类似的问题(如A , B和C ),但他们的答案并没有解决我的问题。 我使用Android Studio 1.5.1定位Android API 18(在Android KitKat 4.4之前,所以我正在处理Dalvik,而不是ART运行时)。 我的问题是: (1)当我使用下面的代码时,我可以打印Android中可用的所有sun.misc.Unsafe方法的列表,所以我想我可以使用reflection访问它们,但我不知道如何使用reflection调用它们。 (2)如果(1)是可能的,如何在Android中通过reflection使用sun.misc.Unsafe方法找到magicNumber(在下面的代码中)地址? (3)如果(1)是可能的但是(2)是不可能的,如何在任何本地存储器地址中放入一个整数(比如int test = 123)并使用Android中的sun.misc.Unsafe方法打印其存储器地址reflection? String ClassName = “sun.misc.Unsafe”; int magicNumber = 0x23420023 ; try { Class classToInvestigate = Class.forName(ClassName); Constructor[] aClassConstructors = classToInvestigate.getDeclaredConstructors(); for(Constructor c : aClassConstructors){ System.out.println(“********************* constructor=”+c); } Method[] aClassMethods = classToInvestigate.getDeclaredMethods(); for(Method m : aClassMethods){ System.out.println(“********************* method=”+m); } […]

是什么导致Android Dalvik java.lang.VerifyError“数组索引的无效的reg类型”?

我最近升级了用于构建从19.1.0到21.0.2的应用程序的Android构建工具。 该应用程序编译,但当我启动它时,我收到此错误: net.i2p.android W/dalvikvm﹕ Invalid reg type for array index (1103759864) net.i2p.android W/dalvikvm﹕ VFY: rejected Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement;.multiply (Lnet/i2p/crypto/eddsa/math/FieldElement;)Lnet/i2p/crypto/eddsa/math/FieldElement; net.i2p.android W/dalvikvm﹕ VFY: rejecting opcode 0x44 at 0x001c net.i2p.android W/dalvikvm﹕ VFY: rejected Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement;.multiply (Lnet/i2p/crypto/eddsa/math/FieldElement;)Lnet/i2p/crypto/eddsa/math/FieldElement; net.i2p.android W/dalvikvm﹕ Verifier rejected class Lnet/i2p/crypto/eddsa/math/ed25519/Ed25519FieldElement; net.i2p.android W/dalvikvm﹕ Exception Ljava/lang/VerifyError; thrown while initializing Lnet/i2p/crypto/eddsa/spec/EdDSANamedCurveTable; net.i2p.android W/dalvikvm﹕ Exception Ljava/lang/VerifyError; thrown while initializing Lnet/i2p/crypto/SigType; net.i2p.android W/dalvikvm﹕ […]

在android中将word文档转换为pdf

我知道stackoverflow中有很多问题是关于同样的问题,但我没有得到我想要的东西。 我甚至尝试过使用Qoppa软件的jwordconvert.jar ,但是唉! 它说 Unable to execute dex: Java heap space Conversion of dalvik format failed. 现在我在Android市场上看到了一个应用程序,它被命名为来自ThinkTI.com.br Word To Pdf 。 它只是做了我想让我的程序做的事情。 所以任何人都可以告诉我这个应用程序背后的机制或类似或更好的方法来做到这一点….

在Android中实现类似Spring的包扫描

我正在尝试为我正在开发的Android框架实现类似于Spring的component-scan的包扫描function。 基本上,我希望能够指定一个基本包,例如com.foo.bar并检索具有特定注释的所有Class实例。 我不想用我的框架注册每个组件,因为这会破坏自动扫描的目的。 根据我的研究,似乎Java无法使用reflection检索包名称的资源。 但是,我简要地研究了Reflections框架 ,我想知道是否有与Android兼容的等价物。 如果没有,或许有一种稍微不那么明显的方式来实现我想做的事情。 我查看了Spring源代码,看看他们是如何实现这一目标的,但我不认为他们在做什么会在Dalvik运行时内工作。 更新 目前,下面的代码是我能够检索包含特定注释的所有类的最佳代码,但坦率地说这是一个非常糟糕的解决方案。 它对ClassLoader做了一些非常安全的假设,并且它扫描(并加载)所有应用程序类。 public Set<Class> getClassesWithAnnotation(Class annotation) { Set<Class> classes = new HashSet<Class>(); Field dexField = PathClassLoader.class.getDeclaredField(“mDexs”); dexField.setAccessible(true); PathClassLoader classLoader = (PathClassLoader) Thread.currentThread().getContextClassLoader(); DexFile[] dexs = (DexFile[]) dexField.get(classLoader); for (DexFile dex : dexs) { Enumeration entries = dex.entries(); while (entries.hasMoreElements()) { String entry = entries.nextElement(); Class entryClass […]

为什么字节码在直接字段访问时调用Object-> getClass()

我反编译Java(实际上是Dalvik)字节码。 在方法的开头,我直接访问实例成员的字段(即不通过getter)。 看来Java在被访问的实例成员( Object.getClass()上调用了Object.getClass() ),但是没有在任何地方使用结果。 这是某种检查吗? 为什么需要这个电话? 我怀疑这是因为我直接访问一个字段(在该类中定义),但我没有看到连接。 Java代码和反编译的字节码如下。 (注意,最后一条指令将lifeTime加载为常量0x0001因为在MyOtherClass ,我将lifeTime作为public final字段,并且当前从代码初始化。) MyOtherClass other = mOther; if (mAge >= other.lifeTime) { // lifeTime is initialized to 0x0001 end(); return; } .line 53 move-object/from16 v0, p0 iget-object v0, v0, Lcom/example/engine/MyClass1;->mOther:Lcom/example/engine/MyOtherClass; move-object/from16 v16, v0 .line 54 .local v16, other:Lcom/example/engine/MyOtherClass; move-object/from16 v0, p0 iget v0, v0, Lcom/example/engine/MyClass1;->mAge:I move/from16 […]

java.lang.noclassdeffounderror:com.google.android.gms.R $ styleable没什么帮助我的

我有这样的活动类代码: package com.pavel.exchanger; import android.os.Bundle; import android.app.Activity; import android.support.v4.app.FragmentActivity; import android.view.Menu; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import android.support.v4.app.Fragment; public class SearchExchangerActivity extends FragmentActivity { static final LatLng HAMBURG = new LatLng(53.558, 9.927); static final LatLng KIEL = new LatLng(53.551, 9.993); private GoogleMap map; @Override […]