关于在运行时动态生成和加载java字节码到运行的Dalvik VM,已经多次询问(和回答)这个问题,但有没有办法在运行时将dex文件/字节码加载到应用程序中?
谢谢
尝试Build Project在控制台中获取此类输出时遇到此问题:
[2010-07-19 23:29:23 - myProject]
trouble processing "javax/net/SocketFactory.class":
[2010-07-19 23:29:23 - myProject]
Attempt to include a core VM class in something other than a core library.
It is likely that you have attempted to include the core library from a desktop
virtual machine into an application, which will most assuredly not work. If
you really intend to build a core library -- which is only appropriate as
part of creating a full virtual machine binary, as opposed to compiling …Run Code Online (Sandbox Code Playgroud) 我的理解是,Google不喜欢Oracle在Java ME中使用JRE的许可政策,所以它只是使用自己的JVM规范重写它,模仿 JRE但行为有点不同,特别是在提高效率和更安全.
因此,如果我的理解是正确的,那意味着当javac在某些Java源代码上运行并编译成"二进制"byetcode时,兼容的JVM将解释与Dalvik不同的字节码(在某些情况下).这是Dalvik与其他(兼容)JVM之间的固有差异.
如果我到目前为止所说的任何内容都不正确,请先纠正我!
现在,如果Android带有自己的编译器(它可能),并以不同的(Dalvik兼容)方式编译Java源代码javac,那么我可以理解一些代码(不是用Android SDK编译)不会运行Android设备:
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> android-compiler --> MySource.class (Dalvik-compliant) --> Dalvik JVM --> running Android app
Run Code Online (Sandbox Code Playgroud)
但是,它看起来像你javac用来编译Android应用程序!?!?所以看起来我们有这个:
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> javac --> MySource.class (JRE-compliant) --> Dalvik JVM --> running Android app (???)
Run Code Online (Sandbox Code Playgroud)
如果javac用于将所有源代码编译为字节码,那为什么Dalvik无法运行某些类型的Java代码呢?
昨天我问了一个非常相似的问题,虽然它在技术上得到了解答(在重新阅读我的问题之后,我发现我根本不够具体)没有人能够解释Dalvik固有的是什么使得无法运行Java代码来自Google Guice或Apache Camel等项目.有人告诉我,为了让Camel在Dalvik上运行,我必须得到Camel的源代码然后它必须"使用Android SDK构建",但我无法明确这意味着什么或暗示.
以Camel为例,你有这个(简化):
RouteBuilder.java --> javac --> RouteBuilder.class --> …Run Code Online (Sandbox Code Playgroud) Dalvik对单个.dex文件中可以拥有的方法数量有着众所周知的限制(约65,536个).我的问题是,继承(但未覆盖)的方法是否会计入此限制.
为了使事情具体化,假设我有:
public class Foo {
public int foo() {
return 0;
}
}
public class A extends Foo { }
public class B extends Foo { }
public class C extends Foo { }
Run Code Online (Sandbox Code Playgroud)
出于65,536方法限制的目的,这是否算作添加一个方法,或添加4?(或者,我想,为了得到合乎逻辑的结论,这算作1种方法还是52种方法,考虑到这也java.lang.Object带来了12种方法).
作为背景,我有一些非常微不足道的生成类具有一些共性,我也遇到了方法限制,所以我想知道是否值得尝试将其中的一些抽象为类等级为了买一些时间.
我正在尝试将我的应用程序与Box,Dropbox和Google Drive集成.所有这三项服务都需要一些第三方罐子.此外,我的应用程序已经需要一些第三方罐子.现在当我尝试从eclipse运行我的应用程序时,我收到以下错误:
无法执行dex:方法ID不在[0,0xffff]中:65536转换为Dalvik格式失败:无法执行dex:方法ID不在[0,0xffff]中:65536
似乎发生此错误是因为我的应用程序有太多方法.我相当肯定这些方法的大部分来自第三方罐子,所以试图通过简化我的代码来解决这个问题是不现实的.我在网上找到了这两个建议.
添加dex.force.jumbo=true到project.properties(并使用adt版本21).我这样做但仍然得到错误.
使用多个dex文件,如下所述:http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html.这似乎是唯一的选择,但我不明白它在我的情况下是如何适用的.问题是像Drive这样的服务有太多的依赖关系.这个解决方案是否要求我在引用其依赖项时修改Drive源以使用inflection?(这显然不是一种选择).
使用proguard缩小删除未使用的代码/方法.使用proguard导出我的应用程序确实有效,文档服务集成在> 4.0设备上按预期工作.但是,在2.3设备上进行测试时会抛出classnotfound错误.
所以,我希望就这个问题提出一些建议.选项2是我案例的解决方案吗?我应该考虑另一个解决方案吗?
我最近在为客户开发的应用程序中发现了随机崩溃.该应用程序在3年后现在拥有约100,000名活跃用户.
我们已经看到了Nexus 4和5的崩溃,两者都是Android 4.4 KitKat.
我们无法在我们自己的运行4.4的Nexus 4和5上重现它.
我们通过我们的支持获得了客户.他告诉我们,在调用新活动时,每次都在同一个地方发生崩溃.他经营的是Dalvik,而不是ART.重置固件后,应用程序运行正常,无法再次重现!
我出于法律原因无法发布源代码或布局,但是有这个堆栈跟踪:
java.lang.RuntimeException: Unable to start activity ComponentInfo{xx.xxx.xxxxx.xxx.xxxxxx.prod/xx.xxx.xxxxx.xxx.PaymentsActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
at android.app.ActivityThread.access$700(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4998)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:4938)
at android.view.View.sendAccessibilityEventUnchecked(View.java:4919)
at android.view.View$SendViewStateChangedAccessibilityEvent.run(View.java:19433)
at android.view.View$SendViewStateChangedAccessibilityEvent.runOrPost(View.java:19465)
at android.view.View.notifyViewAccessibilityStateChangedIfNeeded(View.java:7265)
at android.view.View.setFlags(View.java:8990)
at android.view.View.setVisibility(View.java:6020)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:859)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:547)
at android.view.LayoutInflater.parseInclude(Native Method)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native …Run Code Online (Sandbox Code Playgroud) 什么是可能受2014年5月Oracle v Google决策影响的37个Java API包?
上诉法院认为对该语言至关重要的3个套餐是什么?
如何避免在Java代码中使用受限制的API?
如果社区要创建一个竞争的开放类路径它会是什么样子?
更新:截至2016年5月,谷歌使用这些API已被统一使用.http://arstechnica.com/tech-policy/2016/05/google-wins-trial-against-oracle-as-jury-finds-android-is-fair-use/
在BitmapFactory中获取异常.不确定是什么问题.(我可以猜到这个问题,但不确定为什么会发生这种情况)
ERROR/AndroidRuntime(7906): java.lang.OutOfMemoryError: bitmap size exceeds VM budget ERROR/AndroidRuntime(7906): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:295)
我的代码很简单.我定义了一个带有默认图像的XML布局.我尝试在SD卡上加载一个bm(如果存在 - 它是).如果不是,则显示默认图像.无论如何..这是代码:
public class showpicture extends Activity {
public void onCreate(Bundle savedInstanceState) {
/** Remove menu/status bar **/
requestWindowFeature(Window.FEATURE_NO_TITLE);
final Window win = getWindow();
win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
Bitmap bm;
super.onCreate(savedInstanceState);
setContentView(R.layout.showpicture);
try {
ImageView mImageButton = (ImageView)findViewById(R.id.displayPicture);
bm = Bitmap.createScaledBitmap(BitmapFactory.decodeFile("/sdcard/dcim/Camera/20091018203339743.jpg"),100, 100, true);
parkImageButton.setImageBitmap(bm);
}
catch (IllegalArgumentException ex) {
Log.d("MYAPP",ex.getMessage());
}
catch (IllegalStateException ex) {
Run Code Online (Sandbox Code Playgroud)
它没有bm=Bitmap.createScaledBitmap任何想法?我在论坛上做了一些研究,它指出了这篇文章,
我只是不知道为什么它不起作用.任何帮助都会很棒!谢谢,
克里斯.
有没有proper/easy办法使用Gradle解决64k方法限制?
我的意思是一些自定义Gradle任务使用pre-dexed jar来创建单独的dex文件,而不是单个classes.dex.
谢谢
伊万
目前,我正在努力使用GMS:它引入了20k方法来使用Google Analytics.我使用Proguard去除不需要的东西,但仍然...... 72k方法和计数......
我可以classes.dex使用dx参数--multi-dex拆分两个文件.我实现了手动编辑
sdk/build-tools/android-4.4W/dx
Run Code Online (Sandbox Code Playgroud)
并编辑最后一行,如下所示:
exec java $javaOpts -jar "$jarpath" --multi-dex "$@"
Run Code Online (Sandbox Code Playgroud)
我的APK文件现在包含__classes.dex__ and __classes2.dex__.
我试图用几种方法动态加载第二个文件:
不幸的是仍然没有运气 我真的希望一些Google/Facebook/Square大师可以提供合适的解决方案.
我正在开发一个Android应用程序,有时会出现类似于以下内容的错误:
11-21 16:03:15.219:E/dalvikvm(17170):adjustAdaptiveCoef max = 4194304,min = 1048576,ut = 568 11-21 16:03:16.212:E/dalvikvm(17170):adjustAdaptiveCoef max = 4194304,min = 1048576,ut = 568 11-21 16:03:17.649:E/dalvikvm(17170):adjustAdaptiveCoef max = 4194304,min = 1048576,ut = 568
有谁知道他们的意思,或者他们是否有任何顾虑?