本文主要受到博文http://blog.csdn.net/linghu_java/article/details/8283042 启发,感谢原作者。

由于项目需要,需要客制化android settings,所以才有了此文。

code base:android7.0,导入的工程为android/packages/apps/TvSettings/Settings ,其依赖code为:android/frameworks/base/packages/SettingsLib;依赖库为:android-support-v7-recyclerview,
android-support-v7-preference,android-support-v7-appcompat,android-support-v14-preference,
android-support-v17-preference-leanback,android-support-v17-leanback。

1.准备步骤:
(1)需要有android源码并编译成功,找到android/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar, 将其重命名为classes.zip后,解压。

(2)找到sdk中对应android7.0的android.jar包,例如我的路径为:/home/appcounts/Programs/android_sdk/platforms/android-24/android.jar,将其重命名为android.zip,并解压到一个新建的android文件夹去。

(3)将从classes.zip中解压出来的class文件全部替换到android.zip解压出来的路径中去,简单一点就是将classes.zip中解压出的子文件夹替换到~/Desktop/android中。META-INF目录就不用替换了。
(4)到~/Desktop/android目录下执行打包操作,appcounts@Inspiron-5425:~/Desktop/android$ jar -cvfM0 android.jar ./
(5)将重新打包出android.jar放回到sdk路径中去,/home/appcounts/Programs/android_sdk/platforms/android-24/android.jar,注意备份原来的android.jar. 新生成的jar包应该要比官方的大很多。
这样我们就有一个可供IDE(android studio,Eclipse)用的sdk包了,该包解决了IDE中无法调用android code中hide或internal的api。

2.导入工程:
(1)使用Import project,导入我们想要使用的工程;会出错,这里先不用管。

(2)导入依赖的SettingsLib code
导入之后会提示:
Error:Application and test application id cannot be the same: both are ‘com.android.settingslib’ for debugAndroidTest
=>修改SettingsLib module的build.gradle .
(apply plugin: ‘com.android.application’) =>(apply plugin: ‘com.android.library’)
删除(applicationId “com.android.settingslib”)
删除(testApplicationId “com.android.settingslib”)
(3)android support库。
修改SettingsLib module的build.gradle;添加依赖库:

dependencies {
compile ‘com.android.support:support-v4:24.+’
compile ‘com.android.support:preference-v7:24.+’
compile ‘com.android.support:appcompat-v7:24.+’
compile ‘com.android.support:recyclerview-v7:24.+’
compile ‘com.android.support:preference-v14:24.+’
}
修改Settings module的build.gradle;添加依赖库:

dependencies {
compile ‘com.android.support:preference-v7:24.+’
compile ‘com.android.support:appcompat-v7:24.+’
compile ‘com.android.support:recyclerview-v7:24.+’
compile ‘com.android.support:preference-v14:24.+’
compile ‘com.android.support:leanback-v17:24.+’
compile ‘com.android.support:preference-leanback-v17:24.+’
compile project(‘:settingsLib’)
}
(4)设置编译sdk
分别调整app和settingsLib的Compile Sdk Version:android7.0和Build Tools Version:24.0.x

3.修复编译错误
剩下的事情就是来处理编译错误问题了。
经过上面几步之后,rebuild project。
(1)
/home/appcounts/StudioProjects/xSettings/app/src/main/res/values/styles.xml
Error:Error: Found item Style/Setup.Action.TextInput more than one time
删除重复定义的 Style/Setup.Action.TextInput,在源码中编译不错报错,可能是因为编译级别不一样吧,不太清楚。
(2)
/home/appcounts/StudioProjects/xSettings/app/src/main/res/values/floats.xml
Error:Error: Unsupported type ‘float_type’
有若干 float_type的error,在android xml中type有bool,dimen,integer,float,fraction等,好像就是没有float_type. 暂时就将float_type改为dimen。
(3)
/home/appcounts/StudioProjects/xSettings/settingsLib/src/main/java/com/android/settingslib/datetime/ZoneGetter.java
Error:(106, 42) error: package libcore.icu does not exist
没有找到solution,而且暂时用不到,注释就好了~~
(4)
/home/appcounts/StudioProjects/xSettings/settingsLib/src/main/java/com/android/settingslib/BatteryInfo.java
Error:(118, 76) error: local variable shortString is accessed from within inner class; needs to be declared final
将shortString参数在onPostExecute()中转一下在传递给getBatteryInfo()
final boolean ss = shortString;
BatteryInfo batteryInfo = BatteryInfo.getBatteryInfo(context,
batteryBroadcast, batteryStats, elapsedRealtimeUs, ss);
(5)
/home/appcounts/StudioProjects/xSettings/app/src/main/java/com/android/tv/settings/connectivity/setup/SelectFromListWizardFragment.java
Error:(427, 34) error: lambda expressions are not supported in -source 1.7
(use -source 8 or higher to enable lambda expressions)
我使用的jdk是1.8的,但是还是提示lambda有问题;可以使用 retrolambda来解决。
在project的build.gradle的dependencies中加入-> classpath ‘me.tatarka:gradle-retrolambda:3.2.4’
在app modules的build.gradle中加入-> apply plugin: ‘me.tatarka.retrolambda’
(6)
/home/appcounts/StudioProjects/xSettings/settingsLib/src/androidTest/java/com/android/settingslib/wifi/WifiTrackerTest.java
Error:(34, 19) error: package org.mockito does not exist
在SettingsLib的build.gradle中加入 (testCompile “org.mockito:mockito-core:1.10.19”)依然提示找不到包,暂时没有处理,由于是androidTest中的code,所以将androidTest中的java文件删除即可,不影响正常使用。

至此,导入的工程已经可以编译出apk了。
4.签名
参考http://mysuperbaby.iteye.com/blog/1420612
文件位置:可以在android/build/target/product/security/中找到platform.pk8 platform.x509.pem等签名文件,对应不同的权限。
signapk.jar:由/platform/build/tools/signapk/编译产出,可以在/out/host/linux-x86/framework/中找到。

签名:
java -jar signapk.jar platform.x509.pem platform.pk8 MyDemo.apk MyDemo_signed.apk 得到具有对应权限的APK.

  1. 调试
    由于我们的TV平台不能作为从设备(像U盘,手机)等,所以没有办法通过usb接口调试;
    但是可以通过wifi来调试
    (1)将平台和电脑接入同一个局域网;
    在tv终端设置监听端口。需要root权限;
    setprop service.adb.tcp.port 7878
    stop adbd
    start adbd
    ifconfig, 查看tv ip地址,如 192.168.191.10
    (2)在电脑端通过adb连接tv
    adb connect 192.168.191.10:7878
    连接成功后会打印出:connected to xxxx。
    adb devices 可以查看连接的device

更多相关文章

  1. Android 自定义View及其在布局文件中的使用示例(三):结合Android
  2. Android 4.4 SD卡文件读写变化
  3. Android 自动编译、打包生成apk文件 2 - 使用原生Ant方式
  4. Android学习之路(一)之 Android文件简单介绍
  5. Android 上如何移植live555生成库文件
  6. Android NDK 使用第一步,编译c文件,声明jni并调用。
  7. Android中文件的读写

随机推荐

  1. Android创建和删除桌面快捷方式
  2. android view画图笔记-1
  3. Android程序安装和卸载
  4. Android(安卓)Studio 打包apk时遇到的问
  5. Android(安卓)获取 IP 地址
  6. android 动态渐变 字符效果
  7. android开发环境_反编译
  8. ScrollNumber 数字滚动
  9. Android(安卓)Q&A | setOnItemClickListe
  10. Android(安卓)为CheckBoxPreference Pref