如何从源代码构建Android 4.3浏览器?

时间:2013-12-06 14:31:14

标签: android browser android-source

How to build the default browser application in android Os 4.0类似,您如何从源代码构建Android 4.3浏览器应用程序?

当我在Eclipse中导入了源代码(https://github.com/android/platform_packages_apps_browser)的签出时,我无法构建它,因为由于依赖内部和隐藏的Android API而导致很多错误。我首先尝试使用Ievgenii Nazaruk的指示链接到另一个问题(http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/),但我被困在第2部分,因为我的Nexus 7(2013)平板电脑的framework.jar不包含classes.dex条目。

1 个答案:

答案 0 :(得分:0)

Ievgenii Nazaruk在解决大部分问题(http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/)方面值得信赖。我只是更新了运行Android 4.3的Nexus 7(2013)平板电脑的说明,以及最新版本的ADT Plugin for Eclipse

开始使用:

  • 确保Eclipse安装了最新的ADT插件以及最新的Android SDK。在撰写本文时,最新的Android SDK版本是22.3。

    Mac用户提示:Homebrew有一个适用于Android SDK的软件包,可以安装: brew install android-sdk

  • 在Eclipse中,打开Android SDK Manager并安装Android 4.3(API 18)SDK平台。同时在“其他”下安装Android支持库。

  • 使用USB线将Android 4.3设备连接到计算机,如果尚未设置,请设置USB debugging。通过运行验证adb是否看到您的设备:
    adb devices
  • 安装smali and baksmali。在撰写本文时,smali / baksmali的当前版本为2.0.2。
  • 安装dex2jar。自制用户:brew install dex2jar
  • 安装bbe。自制用户:brew install bbe

在下文中,我使用$ANDROID_HOME来引用Android SDK的位置。

访问Android的内部/隐藏API

android.jar中的$ANDROID_HOME/platforms/android-18/被剥夺了所有内部Android类和隐藏API,其中一些是构建浏览器所必需的。我们将按照Ievgenii Nazaruk的说明创建一个包含所有内部/隐藏API的自定义Android SDK平台。

  1. 创建一个临时文件夹并cd

  2. 在临时文件夹中创建framework文件夹,然后复制bouncycastle.odexcore-junit.odexcore.odexext.odexframework.odex从您设备的/system/framework文件夹:

    mkdir framework && cd framework
    adb pull /system/framework/bouncycastle.odex
    adb pull /system/framework/core-junit.odex
    adb pull /system/framework/core.odex
    adb pull /system/framework/ext.odex
    adb pull /system/framework/framework.odex
    cd ..
    
  3. 使用baksmali提取core.odexext.odexframework.odex

    baksmali -a 18 -x framework/core.odex -d framework
    baksmali -a 18 -x framework/ext.odex -d framework
    baksmali -a 18 -x framework/framework.odex -d framework
    

    这些命令将在临时文件夹中创建一个out/文件夹。

  4. 我们将使用smali创建一个DEX文件,但首先我们需要删除out/目录中的一些生成的SMALI文件,因为有太多的smali要处理( “意外的顶级异常:org.jf.util.ExceptionWithContext:无符号短值超出范围”):

    rm -rf out/java out/javax/net out/javax/security out/javax/sql out/javax/xml
    smali -a 18 -o android.dex out
    
  5. 使用dex2jarandroid.dex转换为JAR:

    d2j-dex2jar android.dex
    
  6. 现在我们要创建自定义Android 4.3平台的android.jar。为此,我们需要来自真实Android 4.3平台android.jar的一些文件:

    mkdir android_jar && cd android_jar
    unzip $ANDROID_HOME/platforms/android-18/android.jar resources.arsc
    unzip $ANDROID_HOME/platforms/android-18/android.jar 'com/google/common/*'
    unzip $ANDROID_HOME/platforms/android-18/android.jar 'java/*'
    unzip $ANDROID_HOME/platforms/android-18/android.jar 'javax/net/*'
    unzip $ANDROID_HOME/platforms/android-18/android.jar 'javax/security/*'
    unzip $ANDROID_HOME/platforms/android-18/android.jar 'javax/sql/*'
    unzip $ANDROID_HOME/platforms/android-18/android.jar 'javax/xml/*'
    unzip $ANDROID_HOME/platforms/android-18/android.jar 'org/apache/http/*'
    unzip $ANDROID_HOME/platforms/android-18/android.jar 'res/*'
    unzip ../android-dex2jar.jar
    
  7. 要创建我们的自定义Android 4.3平台,我们首先要复制$ANDROID_HOME/platforms/android-18

    cp -R $ANDROID_HOME/platforms/android-18 $ANDROID_HOME/platforms/android-18-custom
    unlink $ANDROID_HOME/platforms/android-18-custom/android.jar
    jar cf $ANDROID_HOME/platforms/android-18-custom/android.jar *
    
  8. 在文本编辑器中打开$ANDROID_HOME/platforms/android-18-custom/build.prop。您需要更改两行:

    ro.build.version.sdk=-18
    ro.build.version.release=4.3-custom
    

    使用ro.build.version.sdk = -18的原因是因为它必须是一个数字,并且每个Android SDK平台必须不同。

  9. 签出源代码

    1. 在GitHub上克隆浏览器源代码的git repo:
      git clone https://github.com/android/platform_packages_apps_browser.git

    2. 有几个“android-4.3”标签,但都引用相同的提交:84e92b9a43097a1252d7311204d2c4ce00c5a78a

      从该提交创建本地分支:
      git checkout -b Nexus_7_2013 tags/android-4.3.1_r1

    3. 在Eclipse中导入项目。请参阅How to import existing Android project into Eclipse?

    4. 您需要add three missing filesadd a <uses-sdk> tag to AndroidManifest.xmlrename the authority URLs of the Browser's ContentProviderscomment out references to com.google.common.annotations.VisibleForTesting。或者,我有一个包含这些更改的git repo设置:https://github.com/dtrebbien/platform_packages_apps_browser/tree/Nexus_7_2013

    5. 将v4和v13 Android支持库添加到构建路径。请参阅http://developer.android.com/tools/support-library/setup.htmlUpdated SDK version, getting ClassNotFoundException: android.support.v4.view.ViewPager

    6. 切换到自定义Android 4.3平台。右键单击Eclipse中的项目,然后选择Properties。选择左侧的Android。选中API级别为-18的“Android 4.3”目标旁边的框。这是我们在上一节中创建的自定义Android SDK平台。

    7. 删除ADT插件的“Forbidden:com / android / internal / **”限制

      我基本上遵循了Part 4中的Ievgenii Nazaruk的说明,但我发现如果我添加'x',修改后的AndroidClasspathContainerInitializer.class文件将无效。相反,我将“内部/ **”的“i”改为首都“我”。我还使用了bbe而不是Notepad ++:

      unzip com.android.ide.eclipse.adt_*.jar
      mv com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.class com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.class.bak
      bbe -e 's~internal/**~Internal/**~' -o com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.class com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.class.bak
      jar uf com.android.ide.eclipse.adt_*.jar com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.class
      

      运行

      现在为有趣的部分。首先清理项目,然后运行为 - &gt; Android应用程序。您现在应该在Android 4.3设备上拥有功能齐全的股票浏览器应用程序!