aosp 12.0 源码,分支 android-12.0.0_r3 可以参考之前写的 android12.0(S) Pixel 3XL (QCOM 845) 编译刷机
AndroidStudio 版本 Android Studio Arctic Fox | 2020.3.1 Patch 4
gradle 版本 gradle-7.0.2-bin.zip gradle:7.0.4
二手 Pixel 3 XL一台可直接烧写上面编译的 rom(没有真机也可用模拟器)
完整的 Launcher3 可直接运行调试源码已经上传 GitHub
aosp 中 Launcher3 源码路径为 packages/apps/Launcher3
整体源码结构如下
乍一看还是有些复杂的,万变不离其宗,我们找准切入点即可。源码中的app编译规则都在根目录 Android.bp 或者 Android.mk中,
可以看到 Launcher3 中两个都有,打开 bp 文件查看并未找到编译 apk 的规则,那必定是在 mk 中。
mk 中信息量有点大,定义了编译3个 apk
LOCAL_PACKAGE_NAME := Launcher3Go
LOCAL_PACKAGE_NAME := Launcher3QuickStep
LOCAL_PACKAGE_NAME := Launcher3QuickStepGo
我们首先需要确认当前设备中使用哪一个 apk,可以通过指令 adb shell pm path com.android.launcher3
通过指令确认目前设备中运行 Launcher3 对应apk为 Launcher3QuickStep.apk
再回到 mk 中对应编译规则为
packages\apps\Launcher3\Android.mk
#
# Build rule for Quickstep app.
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_MODULE_TAGS := optional
# 依赖静态android类库 Launcher3QuickStepLib 可以理解为AS中 module
LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3QuickStepLib
LOCAL_PROGUARD_ENABLED := disabled
ifneq (,$(wildcard frameworks/base))
LOCAL_PRIVATE_PLATFORM_APIS := true
else
LOCAL_SDK_VERSION := system_current
LOCAL_MIN_SDK_VERSION := 26
endif
# 指定编译产物 apk 名称
LOCAL_PACKAGE_NAME := Launcher3QuickStep
# 编译产物路径是否在 priv-app 下
LOCAL_PRIVILEGED_MODULE :=
# 编译产物路径是否在 system_ext 下
LOCAL_SYSTEM_EXT_MODULE := true
# 覆盖编译,编译 Launcher3QuickStep 就会忽略 Home Launcher2 Launcher3,不生成对应 apk
LOCAL_OVERRIDES_PACKAGES := Home Launcher2 Launcher3
# 依赖 frameworks/base/data/etc/com.android.launcher3.xml
LOCAL_REQUIRED_MODULES := privapp_whitelist_com.android.launcher3
# 资源文件源码
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/quickstep/res
#网上没找到准确的解释,根据编译得到 apk 中的 xml 查看后猜测最终是将这里定义的两个 xml 和下面 quickstep/AndroidManifest.xml 合并
LOCAL_FULL_LIBS_MANIFEST_FILES := \
$(LOCAL_PATH)/quickstep/AndroidManifest-launcher.xml \
$(LOCAL_PATH)/AndroidManifest-common.xml
LOCAL_MANIFEST_FILE := quickstep/AndroidManifest.xml
LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.launcher3.*
LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
LOCAL_LICENSE_CONDITIONS := notice
LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE
include $(BUILD_PACKAGE)
Launcher3QuickStep.apk
|
|需要android类库 Launcher3QuickStepLib
看完对应 mk 发现仅仅只依赖 Launcher3QuickStepLib 接下来看看这家伙是何方神圣,同样也定义在 Android.mk
packages\apps\Launcher3\Android.mk
#
# Build rule for Quickstep library.
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_AAPT2_ONLY := true
LOCAL_MODULE_TAGS := optional
# 依赖静态java库,最终打包到 apk 中 可以理解为AS中 libs 下 jar
LOCAL_STATIC_JAVA_LIBRARIES := \
SystemUI-statsd \
SystemUISharedLib
ifneq (,$(wildcard frameworks/base))
LOCAL_PRIVATE_PLATFORM_APIS := true
else
LOCAL_SDK_VERSION := system_current
LOCAL_MIN_SDK_VERSION := 26
endif
LOCAL_MODULE := Launcher3QuickStepLib
LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
LOCAL_LICENSE_CONDITIONS := notice
LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE
LOCAL_PRIVILEGED_MODULE := true
# 依赖静态android类库 Launcher3CommonDepsLib
LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3CommonDepsLib
# java 源代码
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
$(call all-java-files-under, quickstep/src) \
$(call all-java-files-under, src_shortcuts_overrides)
# 资源文件源码
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/quickstep/res
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_MANIFEST_FILE := quickstep/AndroidManifest.xml
include $(BUILD_STATIC_JAVA_LIBRARY)
Launcher3QuickStep.apk
|
|android类库-Launcher3QuickStepLib
|
|静态java库-SystemUI-statsd
|静态java库-SystemUISharedLib
|android类库-Launcher3CommonDepsLib
好嘛,开始套娃了。接下来我们又要看 Launcher3CommonDepsLib 这家伙藏在哪里,在 android.bp 中被发现
packages\apps\Launcher3\Android.bp
//
// Build rule for Launcher3 dependencies lib.
//
android_library {
name: "Launcher3CommonDepsLib",
//对应Java源码
srcs: ["src_build_config/**/*.java"],
//又依赖 Launcher3ResLib
static_libs: ["Launcher3ResLib"],
sdk_version: "current",
min_sdk_version: min_launcher3_sdk_version,
//对应 xml 源码
manifest: "AndroidManifest-common.xml",
lint: {
baseline_filename: "lint-baseline-common-deps-lib.xml",
},
}
// Library with all the dependencies for building Launcher3
android_library {
name: "Launcher3ResLib",
//没有java源码
srcs: [ ],
//对应资源文件源码
resource_dirs: ["res"],
//依赖静态java库
static_libs: [
"LauncherPluginLib",
"launcher_quickstep_log_protos_lite",
"androidx-constraintlayout_constraintlayout",
"androidx.recyclerview_recyclerview",
"androidx.dynamicanimation_dynamicanimation",
"androidx.fragment_fragment",
"androidx.preference_preference",
"androidx.slice_slice-view",
"androidx.cardview_cardview",
"iconloader_base",
],
manifest: "AndroidManifest-common.xml",
sdk_version: "current",
min_sdk_version: min_launcher3_sdk_version,
lint: {
baseline_filename: "lint-baseline-res-lib.xml",
},
}
java_library {
name: "LauncherPluginLib",
//依赖静态java库
static_libs: ["PluginCoreLib"],
srcs: ["src_plugins/**/*.java"],
sdk_version: "current",
min_sdk_version: min_launcher3_sdk_version,
}
java_library_static {
name: "launcher_quickstep_log_protos_lite",
srcs: [
"quickstep/protos_overrides/*.proto",
],
sdk_version: "current",
proto: {
type: "lite",
local_include_dirs:[
"quickstep/protos_overrides",
],
},
//依赖静态java库
static_libs: [
"libprotobuf-java-lite",
"launcher_log_protos_lite"
],
}
卧底马,终于套娃结束了,来看下
Launcher3QuickStep.apk
|
|android类库-Launcher3QuickStepLib
|
|静态java库-SystemUI-statsd
|静态java库-SystemUISharedLib
|android类库-Launcher3CommonDepsLib
|
|android类库-Launcher3ResLib
|
|静态java库-LauncherPluginLib
|
|静态java库-PluginCoreLib
|静态java库-launcher_quickstep_log_protos_lite
|
|静态java库-libprotobuf-java-lite
|静态java库-launcher_log_protos_lite
|
|静态java库-libprotobuf-java-lite
|android类库-androidx-constraintlayout_constraintlayout
|android类库-androidx.recyclerview_recyclerview
|android类库-androidx.dynamicanimation_dynamicanimation
|android类库-androidx.fragment_fragment
|android类库-androidx.preference_preference
|android类库-androidx.slice_slice-view
|android类库-androidx.cardview_cardview
|静态java库-iconloader_base
静态java库从aosp12 源码编译 out 目录下搜索得到,一共 9 个 jar 文件
\192.168.123.100/share/Pixel12/alps/out/soong$ find ./ -name xxxx.jar
-rw-rw-r-- 1 cczheng cczheng 13164863 10月 3 15:33 framework.jar
-rw-rw-r-- 1 cczheng cczheng 126323 1月 26 09:41 iconloader_base.jar
-rw-rw-r-- 1 cczheng cczheng 190376 10月 3 15:53 launcher_log_protos_lite.jar
-rw-rw-r-- 1 cczheng cczheng 9223 10月 3 14:19 LauncherPluginLib.jar
-rw-rw-r-- 1 cczheng cczheng 18387 10月 3 14:21 launcher_quickstep_log_protos_lite.jar
-rw-rw-r-- 1 cczheng cczheng 478345 10月 3 15:53 libprotobuf-java-lite.jar
-rw-rw-r-- 1 cczheng cczheng 5057 10月 3 16:01 PluginCoreLib.jar
-rw-rw-r-- 1 cczheng cczheng 238871 10月 3 13:32 SystemUISharedLib.jar
-rw-rw-r-- 1 cczheng cczheng 6587 10月 3 13:29 SystemUI-statsd.jar
android类库 androidx 相关直接在 gradle 中引入即可, Launcher 相关的需要我们新建 module,一共 3 个 module
工程创建成功后,删除 androidTest 和 test 文件夹 和 res 文件夹 和 MainActivity.java
导入源码
无
导入资源文件
无
上面说到的三个 AndroidManifest.xml
quickstep/AndroidManifest-launcher.xml
AndroidManifest-common.xml
quickstep/AndroidManifest.xml
合并得到最终 AndroidManifest.xml,就将 application 中内容和外面权限合并
module Launcher3QuickStepLib 创建成功后,删除 androidTest 和 test 文件夹
修改 app/build.gradle,增加依赖 Launcher3QuickStepLib
implementation project(path: ‘:Launcher3QuickStepLib’)
导入源码
将 src 、quickstep/src、src_shortcuts_overrides copy 到 Launcher3QuickStepLib/src/main/java 目录下
导入资源文件
将 quickstep/res 中文件 copy 到 app/src/main 目录下
导入 libs
SystemUI-statsd.jar 和 SystemUISharedLib.jar
修改 Launcher3QuickStepLib/build.gradle,增加依赖
implementation files(‘libs\SystemUI-statsd.jar’)
implementation files(‘libs\SystemUISharedLib.jar’)
implementation project(path: ‘:Launcher3CommonDepsLib’)
module Launcher3CommonDepsLib 创建成功后,删除 androidTest 和 test 文件夹,并将 AndroidManifest.xml 中
package 修改为 com.android.launcher3.common 不然和 app 中报名冲突,编译会报错
导入源码
将 src_build_config copy 到 Launcher3CommonDepsLib/src/main/java 目录下
导入资源文件
无
module Launcher3ResLib 创建成功后,删除 androidTest 和 test 文件夹,并将 AndroidManifest.xml 中
package 修改为 com.android.launcher3.res 不然和 app 中报名冲突,编译会报错
修改 Launcher3CommonDepsLib/build.gradle,增加依赖 Launcher3ResLib
implementation project(path: ‘:Launcher3ResLib’)
导入源码
无
导入资源文件
将 res copy 到 Launcher3ResLib/src/main/ 目录下
导入 libs
LauncherPluginLib.jar
PluginCoreLib.jar
launcher_quickstep_log_protos_lite.jar
libprotobuf-java-lite.jar
launcher_log_protos_lite.jar
iconloader_base.jar
修改 Launcher3ResLib/build.gradle,增加依赖
api files('libs\\iconloader_base.jar')
api files('libs\\launcher_log_protos_lite.jar')
api files('libs\\launcher_quickstep_log_protos_lite.jar')
api files('libs\\LauncherPluginLib.jar')
api files('libs\\libprotobuf-java-lite.jar')
api files('libs\\PluginCoreLib.jar')
此处用 api 是因为套娃原因,Launcher3ResLib 中没有 src,都是给引用它的 module 提供便利
再处理 Androidx 相关库依赖,在阿里仓库中搜索对应库版本号
api 'androidx.constraintlayout:constraintlayout:2.1.0'
api 'androidx.recyclerview:recyclerview:1.2.1'
api 'androidx.dynamicanimation:dynamicanimation:1.1.0-alpha03'
api 'androidx.fragment:fragment:1.4.1'
api 'androidx.preference:preference:1.2.0-alpha01'
// api 'androidx.slice:slice-view:1.1.0-alpha02'
api 'androidx.slice:slice-core:1.1.0-alpha02'
api 'androidx.slice:slice-builders:1.1.0-alpha02'
api 'androidx.cardview:cardview:1.0.0-rc02'
做完上面的步骤后,代码都已经准备完成,接下来就是 build 和处理错误了
解决办法 Launcher3CommonDepsLib build.gradle 中改为 api project(path: ‘:Launcher3ResLib’)
解决办法
将 aosp 编译后 framework.jar 引入 AS 中,解决编译时报错。
在这地方卡了好长时间,一开始按照这个试了试
https://blog.csdn.net/u013885959/article/details/84325173
因为我的 gradle 版本太高,按照网上的资料无法使用 XmlParser 和 Node,一开始我降低了 gradle
并确保sdk使用顺序已经是 framework.jar 优于默认版本,怎么试都还是不行,最后找到了解决办法。
将 framework.jar copy 到 app/libs 下,app/build.gradle 中配置
compileOnly files(‘libs\framework.jar’)
compileOnly 很关键,只是编译使用,并不打包到 apk 中,最终运行还是使用设备上的
修改 Launcher3/build.gradle 中增加配置
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add("-Xbootclasspath/p:${project.rootDir}/app/libs/framework.jar")
}
}
}
根据报错其实可以跳转到 launcher_quickstep_log_protos_lite.jar 中,
报错提示在 module Launcher3QuickStepLib 中找不到
解决办法
将 launcher_quickstep_log_protos_lite.jar 从 module Launcher3ResLib 移动到 Launcher3QuickStepLib 中
并修改 Launcher3QuickStepLib/build.gradle 中配置
compileOnly files(‘libs\launcher_quickstep_log_protos_lite.jar’)
这是由于 Google 早已在 Android Studio 3.5 之后做出了变更:
BuildConfig: Deprecate APPLICATION_ID in libraries.
It is at best misleading, so it is marked as deprecated and replaced by LIBRARY_PACKAGE_NAME.
在 library 中已经把 BuildConfig.APPLICATION_ID 字段废弃掉,因为很容易造成误导,因此使用 BuildConfig.LIBRARY_PACKAGE_NAME 代替
解决办法
将报错 module 中 APPLICATION_ID 全替换为 LIBRARY_PACKAGE_NAME
解决办法
全局搜索 disabledIconAlpha 属性,先将其注释。一共 5 个地方
解决办法
全局搜索 loadingIconColor 属性,先将其注释。一共 2 个地方
这两问题先暂时这样处理,后面会有解决方法
在 Launcher3QuickStepLib 和 Launcher3CommonDepsLib 中都存在 BuildConfig
解决办法
去掉 Launcher3CommonDepsLib 中 BuildConfig.java,因为看起来没用
至此已经可以成功 build 出 apk 了
接下来就把 apk 运行起来看看是否正常
adb install -r E:\android\AS_WorkSpace\Launcher3\app\build\outputs\apk\debug\app-debug.apk
Performing Streamed Install
adb: failed to install E:\android\AS_WorkSpace\Launcher3\app\build\outputs\apk\debug\app-debug.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: Package Verification Result]
解决办法
修改 app/build.gradle 中 versionCode 32 versionName “12.1” ,先查看设备上原始 apk 版本,重新运行
如果遇到签名不一致的问题,先将设备里的 Launcher3 apk 给 rm 掉
Installation failed due to: ‘Failed to commit install session 813937487 with command cmd package install-commit 813937487. Error: -127: Package com.android.launcher3 attempting to declare permission com.android.launcher3.permission.WRITE_SETTINGS in group android.permission-group.SYSTEM_TOOLS owned by package com.android.launcher3 with incompatible certificate’
解决办法
在 app/src/main/AndroidManifest.xml 中增加如下语句,重新运行
解决办法
为了测试,在 app/src/main/AndroidManifest.xml 中,增加
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
<category android:name="android.intent.category.LAUNCHER_APP" />
</intent-filter>
虽然声明了权限
但普通 app 还是无法获取这个权限的
解决办法
给 apk 系统签名后再运行
根据错误堆栈信息找到问题出在 iconloader_base.jar 中,里面包含一个 R.class,所有的资源 id 全都
为 0,这就是为什么出现上面的崩溃 Resource ID #0x0
解决办法
将 iconloader_base.jar 作为 module 引入,在 aosp 源码中找到 iconloader_base 代码位置
frameworks/libs/systemui/iconloaderlib/
新建 module Launcher3IconLoadeBase
和上面一样操作,删除无用文件夹,然后导入java源码和资源文件
还记得上面编译错误 5 和 6 么,attr/disabledIconAlpha 和 attr/loadingIconColor 找不到,
巧了这两兄弟就在 iconloaderlib 源码中,这下就可以解决上面的问题。
修改 Launcher3ResLib/build.gradle 中引入依赖
// api files(‘libs\iconloader_base.jar’)
api project(path: ‘:Launcher3IconLoadeBase’)
再次重新运行
运行结果图
各个 build.gradle 详细配置
\AS_WorkSpace\Launcher3\build.gradle
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.4"
}
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add("-Xbootclasspath/p:${project.rootDir}/app/libs/framework.jar")
}
}
}
}
AS_WorkSpace\Launcher3\app\build.gradle
dependencies {
implementation project(path: ':Launcher3QuickStepLib')
compileOnly files('libs\\framework.jar')
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
AS_WorkSpace\Launcher3\Launcher3QuickStepLib\build.gradle
dependencies {
implementation files('libs\\SystemUI-statsd.jar')
implementation files('libs\\SystemUISharedLib.jar')
compileOnly files('libs\\launcher_quickstep_log_protos_lite.jar')
api project(path: ':Launcher3CommonDepsLib')
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
AS_WorkSpace\Launcher3\Launcher3CommonDepsLib\build.gradle
dependencies {
api project(path: ':Launcher3ResLib')
/* implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'*/
}
AS_WorkSpace\Launcher3\Launcher3ResLib\build.gradle
dependencies {
// api files('libs\\iconloader_base.jar')
api project(path: ':Launcher3IconLoadeBase')
api files('libs\\launcher_log_protos_lite.jar')
// api files('libs\\launcher_quickstep_log_protos_lite.jar')
api files('libs\\LauncherPluginLib.jar')
api files('libs\\libprotobuf-java-lite.jar')
api files('libs\\PluginCoreLib.jar')
api 'androidx.constraintlayout:constraintlayout:2.1.0'
api 'androidx.recyclerview:recyclerview:1.2.1'
api 'androidx.dynamicanimation:dynamicanimation:1.1.0-alpha03'
api 'androidx.fragment:fragment:1.4.1'
api 'androidx.preference:preference:1.2.0-alpha01'
// api 'androidx.slice:slice-view:1.1.0-alpha02'
api 'androidx.slice:slice-core:1.1.0-alpha02'
api 'androidx.slice:slice-builders:1.1.0-alpha02'
api 'androidx.cardview:cardview:1.0.0-rc02'
/*implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'*/
}
AS_WorkSpace\Launcher3\Launcher3IconLoadeBase\build.gradle
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby-debug的后继者 关于ruby-Ruby
是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/
我正在尝试创建一个与compass一起使用的本地配置文件,这样我们就可以处理开发人员机器上的不同导入路径。到目前为止,我已经尝试将文件导入到异常block中,以防它不存在,然后进一步使用该变量:local_config.rbVENV_FOLDER='venv'config.rbVENV_FOLDER='.'beginrequire'local_config.rb'rescueLoadErrorendputsVENV_FOLDER通常我是一名Python开发人员,所以我希望导入将VENV_FOLDER的值更改为venv,但它仍然是。之后。有没有一种方法可以导入local_config.r
关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭10年前。ImprovethisquestionLinux专家正在转向Mac(10.8)。因为我懒...我使用MacPorts安装MacVim。它似乎安装没有错误。我只需要mvim中的python、ruby和perl支持。$/opt/local/bin/mvim--version|egrep'patches|python|ruby|perl'Includedpatches:1-244,246-646+multi_lang-mzscheme+