DeskClock源码路径:/repo/packages/apps/DeskClock/
导入DeskClock源码到AndroidStudio
- 1.拷贝源码到AS工程
使用AndroidStudio创建DeskClock工程,指定Android源码相同的包名
把DeskClock中src、res、AndroidManifest.xml、assets复制到创建的AS工程中
查看.mk文件发现依赖datetimepicker工程库,在AS工程中创建一个Module,module类型为AndroidLibrary,同理把对应的源码复制到该module中.效果图如下:
datetimepicker源码路径:/repo/frameworks/opt/datetimepicker/
- 2.导入framework.jar系统库
目的是为了在AndroidStudio上调用系统隐藏API及自定义的framrwork API.
将repo/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar复制出来,重命名为framework.jar;
为了区分系统的jar包,在如上图中app目录下创建ext_libs目录,将framework.jar复制到该目录中;
在build.gradle dependencies{}中添加provided files(‘ext_libs/framework.jar’)编译该库
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
compile project(':datetimepicker')
compile 'com.android.support:support-v13:26.0.0-alpha1'
compile 'com.android.support:design:26.0.0-alpha1'
compile 'com.android.support:gridlayout-v7:26.0.0-alpha1'
provided files('ext_libs/framework.jar')
}
//compile的方式是编译使用,并且打包进apk中
//provided的方式是编译使用,但不打包进apk中
Tips:
Android Studio3.0后依赖方式关键字变更(括号中为2.x版本的关键字):
implementation (compile) // 依赖的库将会参与编译和打包(依赖不会传递,和以下两者推荐使用implementation,implementation会使编译速度有所增快)
api(compile) // 依赖的库将会参与编译和打包(依赖可以传递)
compileOnly(provided) // 只在编译时有效,不会参与打包
runtimeOnly(apk) // 只在生成apk的时候参与打包,编译时不会参与,很少用
testImplementation(testCompile) // 只在单元测试代码的编译以及最终打包测试apk时有效
debugImplementation(debugCompile) // 只在debug模式的编译和最终的debug apk打包时有效
releaseImplementation(releaseCompile) // 仅仅针对Release 模式的编译和最终的Release apk打包
最后修改project的build.gradle
在allprojects中添加以下代码:
allprojects {
repositories {
jcenter()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app\\ext_libs\\framework.jar')
}
}
}
Xbootclasspath/p:path – 让jvm优先于默认的bootstrap去加载path中指定的class
Tips:
-Xbootclasspath是设定在指定路径中装载系统运行时类
我们一般会用到下面两个参数:
-Xbootclasspath/a:path,先搜索缺省路径在搜索path中的路径
-Xbootclasspath/p:path,先搜索path中的路径在搜索缺省路径
- 3.导入其他的依赖库
datetimepicker中添加
compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
DeskClock中添加
compile project(':datetimepicker')
compile 'com.android.support:support-v13:26.0.0-alpha1'
compile 'com.android.support:design:26.0.0-alpha1'
compile 'com.android.support:gridlayout-v7:26.0.0-alpha1'
解决所有报错,成功编译出apk
-
4.配置系统签名
对于Eclipse或AndroidStudio已经编出来的apk手动重新签名:
创建SignApk文件夹,把需要重新签名的apk和platform.x509.pem、platform.pk8、signapk.jar文件拷贝到该目录下
对应文件路径:
platform.x509.pem、platform.pk8:build/target/product/security
signapk.jar:out/host/linux-x86/framework
signapk源码路径:build/tools/signapk
执行以下命令生成系统签名后的apk
java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk
使用AndroidStudio配置系统签名:
1).生成签名文件
在AS工具类上选择Build -->> Generate Signed APK,如果没有就Create new 创建生成一个SignXXX.jks签名文件
在DeskClock工程目录下创建SignApk文件夹保存签名文件
2.)使用keytool-importkeypair对生成的SignXXX.jks签名文件引入系统签名
platform.x509.pem、platform.pk8路径:build/target/product/security
把keytool-importkeypair、platform.x509.pem、platform.pk8和SignXXX.jks签名文放在同一目录下,执行以下命令
./keytool-importkeypair -k [jks文件名] -p [jks的密码] -pk8 platform.pk8 -cert platform.x509.pem -alias [jks的别名]
./keytool-importkeypair -k SignXXX.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias SignXXX
执行完后(需要在Linux下执行),我们就得到系统签名SignXXX.jks,替换SignApk中的签名文件
3.)配置build.gradle编译时直接生成签名的apk
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.android.deskclock70"
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
signingConfigs {
release {
storeFile file("../SignApk/SignXXX.jks")
storePassword '123456'
keyAlias 'SignXXX'
keyPassword '123456'
}
debug {
storeFile file("../SignApk/SignXXX.jks")
storePassword '123456'
keyAlias 'SignXXX'
keyPassword '123456'
}
}
}
直接运行便可生成配置系统签名的apk
代码地址: https://github.com/ansen360/DeskClock
AndroidStudio配置使用自定义SDK
AndroidStudio项目需要调用的API是我们自己framework增加的API时,由于默认使用的官方SDK.因此会找不到对应的API.
解决方案是: 替换AndroidStudio SDK中的SDK为我们系统编译出来的SDK
- 1.在我们系统源码linux中执行make sdk 生成android.jar文件.
路径: repo/out/target/common/obj/PACKAGING/android_jar_intermediates/android.jar
- 2.将linux中android.jar替换掉AndroidStudio SDK中sdk\platforms\android-24\android.jar文件
相关链接直达:
Android系统源码SystemUI导入eclipse编译