本文主要受到博文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.