与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
条目。
答案 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支持库。
adb
是否看到您的设备:adb devices
smali
and baksmali
。在撰写本文时,smali
/ baksmali
的当前版本为2.0.2。dex2jar
。自制用户:brew install dex2jar
bbe
。自制用户:brew install bbe
在下文中,我使用$ANDROID_HOME
来引用Android SDK的位置。
android.jar
中的$ANDROID_HOME/platforms/android-18/
被剥夺了所有内部Android类和隐藏API,其中一些是构建浏览器所必需的。我们将按照Ievgenii Nazaruk的说明创建一个包含所有内部/隐藏API的自定义Android SDK平台。
创建一个临时文件夹并cd
。
在临时文件夹中创建framework
文件夹,然后复制bouncycastle.odex
,core-junit.odex
,core.odex
,ext.odex
和framework.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 ..
使用baksmali
提取core.odex
,ext.odex
和framework.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/
文件夹。
我们将使用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
使用dex2jar
将android.dex
转换为JAR:
d2j-dex2jar android.dex
现在我们要创建自定义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
要创建我们的自定义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 *
在文本编辑器中打开$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平台必须不同。
在GitHub上克隆浏览器源代码的git repo:
git clone https://github.com/android/platform_packages_apps_browser.git
有几个“android-4.3”标签,但都引用相同的提交:84e92b9a43097a1252d7311204d2c4ce00c5a78a
从该提交创建本地分支:
git checkout -b Nexus_7_2013 tags/android-4.3.1_r1
在Eclipse中导入项目。请参阅How to import existing Android project into Eclipse?
您需要add three missing files,add a <uses-sdk> tag to AndroidManifest.xml
,rename the authority URLs of the Browser's ContentProviders和comment out references to com.google.common.annotations.VisibleForTesting
。或者,我有一个包含这些更改的git repo设置:https://github.com/dtrebbien/platform_packages_apps_browser/tree/Nexus_7_2013
将v4和v13 Android支持库添加到构建路径。请参阅http://developer.android.com/tools/support-library/setup.html和Updated SDK version, getting ClassNotFoundException: android.support.v4.view.ViewPager
切换到自定义Android 4.3平台。右键单击Eclipse中的项目,然后选择Properties。选择左侧的Android。选中API级别为-18的“Android 4.3”目标旁边的框。这是我们在上一节中创建的自定义Android SDK平台。
我基本上遵循了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设备上拥有功能齐全的股票浏览器应用程序!