Android源码问题集锦

ThroubleShoot

1.如何编译出android.jar

make sdk

输出jar路径:
Package SDK Stubs: out/target/common/obj/PACKAGING/android_jar_intermediates/android.jar
Package SDK: out/host/linux-x86/sdk/android-sdk_eng.hl_linux-x86.zip

  • 如果出现如下错误
    build/core/main.mk:644: * : Module ‘bluetooth-health’ in PRODUCT_PACKAGES has nothing to install!
  • 使用make PRODUCT-sdk-sdk来编译,成功

2.如何进行系统签名

1.
2.
3.

3.如何下载openjdk-8

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-dbg
sudo update-alternatives --config java
sudo update-alternatives --config javac

注:最终openjdk-8的安装路径是:/usr/lib/jvm
注:jre只是java running environment ,jdk是java开发工具包

4.如何添加厂商

5.如何更改输出目录

export ANDROID_PRODUCT_OUT=out

6.如何更改Java heap Size

A_LIBRARIES/framework_intermediates/dex-dir/classes.dex.rsp
Out of memory error (version 1.2-rc4 ‘Carnac’ (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by [email protected])).
GC overhead limit exceeded.
Try increasing heap size with java option ‘-Xmx’.

  • 在不清理构建的情况下,可以通过export变量的方式来修改,如下
    export JACK_SERVER_VM_ARGUMENTS=”-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m”
    out/host/linux-x86/bin/jack-admin kill-server
    out/host/linux-x86/bin/jack-admin start-server
  • 修改源码目录下prebuilts/sdk/tools/jack-admin文件的JACK_SERVER_VM_ARGUMENTS变量,
    添加-Xmx4096M(这个根据你自己的情况),接着make clean,make -j48重新构建

7.sdk.atree问题

could not locate source file: ${OUT_DIR}/target/common/obj/PACKAGING/android-support-multidex_intermediates/android-support-multidex.jar

make sdk的时候,出现这个错误。因为我的输出路径是绝对的(/opt/out),所以应该改为相对的就行了。这个问题调试了一天.我不知道google干嘛了,
查看build/tools/atree/atree.cpp,跟踪源码得知对于sdk.atree文件每一行,左边的那一个项都默认加上一个头部来测试是否存在该文件.
files.cpp关键函数:


int locate(FileRecord* rec, const vector<string>& search){
...
//遍历所有头部
 for (vector<string>::const_iterator it=search.begin();
                it!=search.end(); it++) {
        string full = path_append(*it, rec->sourceName);//默认加头部
        struct stat st;
        err = stat(full.c_str(), &st);
        //找到目标文件
        if (err == 0) {
            rec->sourceBase = *it;
            rec->sourcePath = full;
            rec->sourceMod = st.st_mtime;
            rec->sourceSize = st.st_size;
            rec->sourceIsDir = S_ISDIR(st.st_mode);
            return 0;
        }
    }
    //都找不到就GG
    fprintf(stderr, "%s:%d: couldn't locate source file: %s\n",
                rec->listFile.c_str(), rec->listLine, rec->sourceName.c_str());
    return 1;
 }

sdk.atree:

...
development/tools/emulator/skins/QVGA          platforms/${PLATFORM_NAME}/skins/QVGA
development/tools/emulator/skins/WQVGA432      platforms/${PLATFORM_NAME}/skins/WQVGA432
development/tools/emulator/skins/WQVGA400      platforms/${PLATFORM_NAME}/skins/WQVGA400
development/tools/emulator/skins/HVGA          platforms/${PLATFORM_NAME}/skins/HVGA
${OUT_DIR}/target/common/obj/.../android-support-customtabs.jar    extras/android/support/customtabs/libs/android-support-customtabs.jar
...

意思是把文件(HEAD+development/tools/emulator/skins/QVGA),放到out目录/platforms/ PLATFORMNAME/skins/QVGA(HEAD+ {OUT_DIR}/target/common/…),这..就悲剧了.假如我的out目录是/opt/out..绝对路径那么就肯定会错啦.要么你的out目录就是相对的就行了
HEAD+/opt/out…

8.特定厂商特性详细描述

PRODUCT_NAME 最终用户将看到的完整产品名,会出现在“关于手机”信息中。
PRODUCT_MODEL 产品的型号,这也是最终用户将看到的。
PRODUCT_LOCALES 该产品支持的地区,以空格分格,例如:en_GB de_DE es_ES fr_CA。
PRODUCT_PACKAGES 该产品版本中包含的 APK 应用程序,以空格分格,例如:Calendar Contacts。
PRODUCT_DEVICE 该产品的工业设计的名称。
PRODUCT_MANUFACTURER 制造商的名称。
PRODUCT_BRAND 该产品专门定义的商标(如果有的话)。
PRODUCT_PROPERTY_OVERRIDES 对于商品属性的定义。
PRODUCT_COPY_FILES 编译该产品时需要拷贝的文件,以“源路径 : 目标路径”的形式。
PRODUCT_OTA_PUBLIC_KEYS 对于该产品的 OTA 公开 key 的列表。
PRODUCT_POLICY 产品使用的策略。
PRODUCT_PACKAGE_OVERLAYS 指出是否要使用默认的资源或添加产品特定定义来覆盖。
PRODUCT_CONTRIBUTORS_FILE HTML 文件,其中包含项目的贡献者。
PRODUCT_TAGS 该产品的标签,以空格分格。

9.如何阅读android源码

通过AndroidStudio可以方便快捷阅读源码。

  • 首先确保已经编译通过,检查out/host/linux-x86/framework/idegen.jar是否存在。
    不存在就mmm development/tools/idegen
  • 接着回到源码根目录,执行. development/tools/idegen/idegen.sh,就会出现android.ipr,android.iml两个文件
  • 打开studio,导入工程,选择android.ipr文件
  • 可以参考README

10.jar的jdk版本编译

Unsupported version number [51.0] for class format
由于jar是jdk1.7编译的,在jdk1.6无法使用

Android源码问题集锦_第1张图片

11.aidl的添加

LOCAL_SRC_FILES += \
src/com/rsbc/launcher/libs/media/IMediaPlaybackService.aidl

12.libs的添加

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
butterknife-bc:libs/butterknife8-0-1.jar \
gson-bc:libs/gson-2.5.jar \
okhttp-bc:libs/okhttp-2.3.0.jar \
photoview-bc:libs/photoview.jar \
android-support-v4f:libs/android-support-v4.jar
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4f butterknife-bc gson-bc okhttp-bc photoview-bc

13.修改framework去除底部虚拟键

1.通过修改framework/base/core/res/res/values/dimens.xml,把navigation_bar_heightnavigation_bar_langscape修改为0
2.重新编译,先到framework/base/core/res执行mm命令,再到framework/base执行mm

14.focusInTouchMode模式无法第一时间响应

15.SystemServer

添加系统服务可以在frameworks/base/services/java/com/android/server/SystemServer文件中添加

16.error: insufficient permissions for device: verify udev rules.

参考udev规则
SUBSYSTEM==”usb”, ATTRS{idVendor}==”0502”, MODE=”0666”

bash括号详解

推荐地址学习

文章推荐

1.Andorid系统介绍
Nexus5编译集锦

你可能感兴趣的:(Android源码问题集锦)