在修改Android 系统源码时,比如现在我有两套面向两个不同芯片的4.0.4 Android 源码,以下简称为A源码,B源码,A / B 源码生成的Android系统用户操作及视觉都是一样的。现在我使用A源码生成的 systemUI.apk(状态栏) 放到 B源码生成的系统里面,这时会出现错误。错误情况大多为以下这类型的话:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.phone/com.android.phone.InCallScreen}: android.view.InflateException: Binary XML file line #52: Error inflating class com.android.phone.InCallTouchUi
E/AndroidRuntime( 8656): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1964)
E/AndroidRuntime( 8656): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1989)
E/AndroidRuntime( 8656): at android.app.ActivityThread.access$600(ActivityThread.java:126)
E/AndroidRuntime( 8656): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1155)
E/AndroidRuntime( 8656): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 8656): at android.os.Looper.loop(Looper.java:137)
又比如我有4.0.4 和 4.1 两种面向同一芯片版本的源码,但把 4.0.4 版本的 systemUI.apk(状态栏)放到 4.1系统的里面也同样出错。当然除了systemUI.apk(状态栏),还有 Phone.apk / Setting.apk 这些涉及到 FrameWork 资源的都会。问题1:这个一般是什么原因造成的?是否因为 systemUI.apk(状态栏) 涉及到 FrameWork 资源,而不同版本的FrameWork资源不相同而致使 apk 出错?问题2:是否是不同系统编译出来的资源ID不一样,导致凡是引用到Framework资源ID的多少都会出现问题。敢问系统的资源ID在哪里可以看到。eclipse的R文件可以看到资源ID,但系统 mmm 编译我不知道在哪里。问题3:一般由一个旧系统升级到一个新系统,比如4.0升到4.1,难道只有重写代码这条路,就不能利用之前写的那些(就是把就系统的整个apk的源码放到新系统里面,而不是在新系统一行行改)?各位一般如何升的,求一种合理的升级方法。我初学不久,词语可能用得不恰当,标题都不知道用什么关键词,敢情各位不吝赐教。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.phone/com.android.phone.InCallScreen}: android.view.InflateException: Binary XML file line #52: Error inflating class com.android.phone.InCallTouchUi
E/AndroidRuntime( 8656): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1964)
E/AndroidRuntime( 8656): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1989)
E/AndroidRuntime( 8656): at android.app.ActivityThread.access$600(ActivityThread.java:126)
E/AndroidRuntime( 8656): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1155)
E/AndroidRuntime( 8656): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 8656): at android.os.Looper.loop(Looper.java:137)
又比如我有4.0.4 和 4.1 两种面向同一芯片版本的源码,但把 4.0.4 版本的 systemUI.apk(状态栏)放到 4.1系统的里面也同样出错。当然除了systemUI.apk(状态栏),还有 Phone.apk / Setting.apk 这些涉及到 FrameWork 资源的都会。问题1:这个一般是什么原因造成的?是否因为 systemUI.apk(状态栏) 涉及到 FrameWork 资源,而不同版本的FrameWork资源不相同而致使 apk 出错?问题2:是否是不同系统编译出来的资源ID不一样,导致凡是引用到Framework资源ID的多少都会出现问题。敢问系统的资源ID在哪里可以看到。eclipse的R文件可以看到资源ID,但系统 mmm 编译我不知道在哪里。问题3:一般由一个旧系统升级到一个新系统,比如4.0升到4.1,难道只有重写代码这条路,就不能利用之前写的那些(就是把就系统的整个apk的源码放到新系统里面,而不是在新系统一行行改)?各位一般如何升的,求一种合理的升级方法。我初学不久,词语可能用得不恰当,标题都不知道用什么关键词,敢情各位不吝赐教。
还是拿具体点的例子说吧,要不太空洞。比如我要修改 Launcher ,我在 4.0 上写好了,新系统 4.1 出来了,现在我要将 4.0 上写好的 Launcher 移到 4.1 上。 我们知道 Launcher 在源码中属于一个相对独立的 apk(当然可能会引用一些包或so文件),这个不会涉及到 framework 了,但为什么运行不了? 为什么第三方写的 Launcher 桌面在绝大部分的系统中都能用?只看代码真不知道个所以然来
要是系统那么容易移植
那么android4.2开源第二天都是4.2的系统了
LZ如果想移植Launcher 可以将4.0上面的Launcher.apk【4.0的包名最好不要和4.1的包名一致】 install到4.1系统的板子或手机上 切换到4.0的launcher来调试
楼主是要将4.0的直接放到4.1上跑起来?还是将4.0上你改的东西在4.1的源码上也修改?
如果是,那就没多大意义,因为4.1的比4.0的功能是更完善的,比如桌面应用程序、快捷方式、插件支持相互之间托动交换位置;
如果不是,那就要基于4.1的源码,将你在4.0上改的东西在4.1上重新做一次,说是做一次,其实就是把修改的文件重新改一遍;
还有像楼主说第三方的桌面,能在android很多版本上跑起来,而Android的自带Launcher却不能,因为系统的应用都有直接调用系统隐藏的方法之类的,而随着版本的升级,那些隐藏Api里面的方法可能参数会变,又或者名字会变,所以不能通用,如果你想通用,那你把那些隐藏的方法全部去了,用其他方式实现
我要确定到底是什么问题导致出错,方便日后修改啊。不知这位仁兄对此有什么看法,我估计的原因除了4.0与4.1有不一致的api外,最可能导致出错的原因是不同系统编译出来的frameword资源ID是不一样的,所以有些apk在4.0正常,但改到4.1系统由于找不到对应的资源ID或ID改变而出错。可是这些都是我猜测的,并没有得到认证,求高人解答
按你这样的话,你的应用都是4.0的,其他的都是4.1的,这样看出来不还是4.0的嘛?体验不到4.1的效果,还不如直接全部用4.0的呢;
资源ID错乱是不大可能的,因为你调用的4.0上公开的系统资源4.1上都会有,
那些隐藏的方法之类的,就得一个一个抓log看了,没什么好的方法,哪个方法报错,你就到framework下去找,然后对比4.0和4.1的,找到了直接换一个就行;
我不知道你的4.0、4.1是基于谷歌源码还是CM团队的还是其他的?
目前遇到一个有关Framework的问题: Can't convert to dimension: type=0x3 ,查了查没有什么头绪,不知道 type=0x3 代表着什么意思
另外framework生成的中间文件R.java也在out目录下,可以比较下你的两个版本哪些不同。所以,用到系统资源,特别是verdor又修改了,那就只有再新的平台上重新编译
以上 两个 测试:
(1)现在我有A芯片的手机,结果我使用B芯片系统编译得到的Phone.apk(通话中的那个apk)push到A芯片手机中,就出现了 Can't convert to dimension: type=0x3 这个错误。后来我想起应该使用 A 芯片系统来编译 B 芯片的源码,结果编译得到的 apk就可以在 A 芯片手机上运行了。(2)我使用更高版本(即4.1版本Android系统,面向A芯片的源码,测试手机也是A芯片)的系统编译 A芯片 4.0.4 版本源码,出现的错误很明显,4.1的源码改动了,接口找不到,编译没通过,如果我把这些错误都解决了还不如直接在新系统中修改!收获:
(1)这个错误给我一个警示:似乎不同的系统编译得到的 R.java 是不一样的,尽管他们的Android版本是一致的。但这个都是猜测,我并没有确切的证据,所以我会像19楼提示的那样再对比R.java 。
(2)旧版的不能在新版本上运行错误就明显很多了,源码直接不同,但除了这些我想它还会涉及到 资源id的问题。整理一下,以上这些好像没什么用,但在我脑海里犹如一个黑洞,这个版本的出现,代码的移植多少都会有人遇到吧,但并没有看到有人问这样的问题或相关的分析。我想是我不想重写太多代码,呵呵。我想这个对我了解Android会有帮助,从这些问题可以引申出其他问题。