很多上传操作需要文件对象或者 byte 数组,但是 Uri 获取文件对象是不方便的(content 类型的 Uri),但是相对于获取 InputStream 是方便的:
InputStream iStream = getContentResolver().openInputStream(uri);
byte[] inputData = getBytes(iStream);然后 InputStream 获取目标文件的 bytes
很多上传操作需要文件对象或者 byte 数组,但是 Uri 获取文件对象是不方便的(content 类型的 Uri),但是相对于获取 InputStream 是方便的:
InputStream iStream = getContentResolver().openInputStream(uri);
byte[] inputData = getBytes(iStream);然后 InputStream 获取目标文件的 bytes
| android { | |
| applicationVariants.all { variant -> | |
| def assembleTask | |
| if (variant.hasProperty('assembleProvider')) { | |
| assembleTask = variant.assembleProvider.get() | |
| } else { | |
| assembleTask = variant.assemble | |
| } | |
| assembleTask.doLast { | |
| exec { |
PackageManager p = getPackageManager();
ComponentName componentName = new ComponentName(this, MainActivity.class);
p.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);想重新显示,设置 state 为 PackageManager.COMPONENT_ENABLED_STATE_ENABLED 就好了
| import android.content.Context; | |
| import android.graphics.Canvas; | |
| import android.graphics.Color; | |
| import android.graphics.Paint; | |
| import android.os.Build; | |
| import android.util.AttributeSet; | |
| import android.view.MotionEvent; | |
| import android.widget.FrameLayout; |
根据 Build Type 或者 Flavor 来构建(替代之前 Groovy 版自动生成的函数)
fun DependencyHandlerScope.implementationWithFilter(
flavor: String = "",
buildType: String = "",
dependency: Any
): Dependency? = when {
flavor == "" && buildType == "" -> implementation(dependency)sudo 的 hex code 可以用 echo -n 'sudo ' | xxd ~ echo -n 'sudo ' | xxd
00000000: 7375 646f 20 sudo
这样最终的 hex code 就是 0x1(跳转最前) 0x73 0x75 0x64 0x6f 0x20('sudo '的 hex code) 0x5(跳转最后)
在开发 Android 项目时,为了自动化构建输出签名 APK 方便,通常会配置 signingConfigs 项来直接输出签名后的 APK。在构建开源项目时,证书文件一般不会上传到仓库,证书相关的配置也会存在被 ignore 的本地 properties 文件中。之前使用 Travis 构建开源项目时,使用的方式是仓库中存有一个加密的证书文件,通过在 Travis 控制台配置这个加密文件的密钥,以及其他必需的配置项来完成构建。在 Jenkins 里也是类似的方式不过更加方便一些。
首先,可以把证书文件直接上传到 Jenkins 里:
进入 Credentials - System - Global credentials (unrestricted) - Add Credentials,选择 Secret File,选择要上传的签名文件,ID 和 Description 按照需要给一个有含义的文本即可
同级下面,再通过 Add Credentials 添加一项,选择 Username and Password。Username 存储签名需要的 Alias,密码存储 Store Password 和 AliasPassword(这里我自己的约定是这样的,如果不相符可以建立更多的 credential 项)。
在构建项目下面,Build Environment 下面勾选 Use secret text(s) or file(s),Binding 下添加一个 Secret File 和 Username and Password,分别对应 1、2 步添加的两项,绑定三个变量:KEY_PATH、KEY_ALIAS 和 KEY_PASSWD。
| { | |
| "snippet": { | |
| "expanded": true, | |
| "newSnippetPrivate": false, | |
| "sorting": "updated_at", | |
| "sortingReverse": true | |
| }, | |
| "editor" : { | |
| "tabSize": 4 | |
| }, |
python(python3)
cd www_root
python -m http.server
php
android {
//...
defaultConfig {
//...
versionCode getAppVersionCode()
versionName getLastTagName()
//...
}
//...