在修改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的源码放到新系统里面,而不是在新系统一行行改)?各位一般如何升的,求一种合理的升级方法。我初学不久,词语可能用得不恰当,标题都不知道用什么关键词,敢情各位不吝赐教。

解决方案 »

  1.   

    LZ  的问题  我就不一一回答了   费劲。  首先你移植4.0的某些功能时,先要了解4.1有哪些特性、对比4,1和4,。0   看4.1在4.0的基础上做了哪些修改功能或者BUG   如果是整个应用移植  与framework底层、其他的没什么挂钩就可以直接放在package/app 或这vender...路径下涉及到framework底层的东西   就需要对比一下4.0和4.1的代码   相应的一个功能、一个功能的添加  修复 慢慢的移植
      

  2.   

    这个工作量实际上并不比在新系统上重写少。其实我并不是害怕看源码,害怕重写。我只是想找一个确认的原因,这个问题就像一个黑洞一样,找不出只有重写这条道,对以后系统更换相当不利。
    还是拿具体点的例子说吧,要不太空洞。比如我要修改 Launcher ,我在 4.0 上写好了,新系统 4.1 出来了,现在我要将 4.0 上写好的 Launcher 移到 4.1 上。 我们知道 Launcher 在源码中属于一个相对独立的 apk(当然可能会引用一些包或so文件),这个不会涉及到 framework 了,但为什么运行不了? 为什么第三方写的 Launcher 桌面在绝大部分的系统中都能用?只看代码真不知道个所以然来
      

  3.   

    分清楚应用和系统的区别
    要是系统那么容易移植
    那么android4.2开源第二天都是4.2的系统了
      

  4.   


    LZ如果想移植Launcher  可以将4.0上面的Launcher.apk【4.0的包名最好不要和4.1的包名一致】  install到4.1系统的板子或手机上 切换到4.0的launcher来调试
      

  5.   

    拿楼主的比如Launcher例子来说把,
    楼主是要将4.0的直接放到4.1上跑起来?还是将4.0上你改的东西在4.1的源码上也修改?
    如果是,那就没多大意义,因为4.1的比4.0的功能是更完善的,比如桌面应用程序、快捷方式、插件支持相互之间托动交换位置;
    如果不是,那就要基于4.1的源码,将你在4.0上改的东西在4.1上重新做一次,说是做一次,其实就是把修改的文件重新改一遍;
    还有像楼主说第三方的桌面,能在android很多版本上跑起来,而Android的自带Launcher却不能,因为系统的应用都有直接调用系统隐藏的方法之类的,而随着版本的升级,那些隐藏Api里面的方法可能参数会变,又或者名字会变,所以不能通用,如果你想通用,那你把那些隐藏的方法全部去了,用其他方式实现
      

  6.   

    我是将修改过的4.0放到4.1上运行,假如我想快速移植,又不需要4.1上其他更完善的功能,比如因为我4.0上修改的效果比较独特,有个性,所以我就想直接使用。根据你的回答,我大概知道答案。其实除了launcher外我们还要修改其他的比如setting.apk/phone.apk/systemUI.apk/lockscreen.apk等与franmwork挂钩的apk,4.0的源码放在4.1上运行可编译完成,但放机器上就出错。
    我要确定到底是什么问题导致出错,方便日后修改啊。不知这位仁兄对此有什么看法,我估计的原因除了4.0与4.1有不一致的api外,最可能导致出错的原因是不同系统编译出来的frameword资源ID是不一样的,所以有些apk在4.0正常,但改到4.1系统由于找不到对应的资源ID或ID改变而出错。可是这些都是我猜测的,并没有得到认证,求高人解答
      

  7.   

    你直接install 4.0版本的Launcher到  4.1的系统上    切换到4.0的launcher时  抓取日志信息   看异常信息  调试啊~~~
      

  8.   


    按你这样的话,你的应用都是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团队的还是其他的?
      

  9.   

    是供应商提供的源码,在google基础上改过了一些,添加了一些功能。
    目前遇到一个有关Framework的问题: Can't convert to dimension: type=0x3 ,查了查没有什么头绪,不知道 type=0x3 代表着什么意思
      

  10.   

    不同版本的资源id是会不一样。你可以检查framewor/base/core/res下的styles.xml,themes.xml,attrs.xml等,比较一下。
    另外framework生成的中间文件R.java也在out目录下,可以比较下你的两个版本哪些不同。所以,用到系统资源,特别是verdor又修改了,那就只有再新的平台上重新编译
      

  11.   

    这个错误我知道了,但是确切的原因没敢肯定。我先说我环境及硬件,我好阐述事件的过程。首先 我有A手机芯片及B手机芯片,A芯片使用的4.0.4 Android版本系统,B芯片与A芯片一样,但由于A / B是不同的芯片,他们的硬件驱动/kernel 等设置是不一致,仅仅是Android应用层相同而已,所以他们是有着相同的Android版本的不同系统。
    以上 两个 测试:
    (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会有帮助,从这些问题可以引申出其他问题。