AndroidStudio生成签名信息报错

1
2
3
4
5
6
7
Key was created with errors:
Warning:
JKS 密钥库使用专用格式。建议使用
"keytool -importkeystore -srckeystore
(存放路径)\AndroidSigh.jks -destkeystore
(存放路径)\AndroidSigh.jks -deststoretype pkcs12"
迁移到行业标准格式 PKCS12。

解决方案在终端中输入以下命令:

1
2
3
keytool -genkey -alias (alias名称) -keypass (alias密码) -keyalg RSA -keysize 2048 -validity 36500 -keystore (存放路径)\(保存jks文件名称).jks -storepass (keyStore密码)

//然后根据提示信息填写即可(上面命令中的括号要删掉)

1. ViewModelProviders

build.gradledependencies 中加入

1
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

在使用的地方导入:

1
import androidx.lifecycle.ViewModelProviders;

即可使用:

1
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

该方法 2.1.0 已弃用 ViewModelProviders.of() ,改为

1
2
3
4
5
//导入 import androidx.lifecycle.ViewModelProvider;
myViewModel = ViewModelProvider(this).get(MyViewModel.class);

//或者
myViewModel = ViewModelProvider(getActivity()).get(MyViewModel.class);

2. DataBinding

build.gradle 的 defaultConfig中加入

1
2
3
dataBinding{
enabled true
}

Sync Now一下,把下面代码套在布局最外层,即可使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>

</data>


//============
//这里写自己的布局


</layout>

解决方案:

  1. 修改Flutter SDK中的flutter.gradle文件,通过 flutter>packages>flutter_tools>gradle>flutter.gradle(注意这是Flutter SDK安装位置不是Android Studio的)路径找到flutter.gradle,打开flutter.gradle文件,修改配置:

注释掉google()jcenter(),加入阿里的配置项

1
2
3
maven {url 'https://maven.aliyun.com/repository/google'}
maven {url 'https://maven.aliyun.com/repository/jcenter'}
maven {url 'https://maven.aliyun.com/nexus/content/groups/public'}

修改后:

1
2
3
4
5
6
7
8
9
10
11
12
13
buildscript {
repositories {
//注释掉 google()和jcenter()
// google()
// jcenter()
maven {url 'https://maven.aliyun.com/repository/google'}
maven {url 'https://maven.aliyun.com/repository/jcenter'}
maven {url 'https://maven.aliyun.com/nexus/content/groups/public'}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
}
}
  1. 手动下载gradle进行配置

    找到创建的flutter项目:

    通过路径flutterdemo001/android/gradle/wrapper/gradle-wrapper.properties找到对应文件打开后:

1
2
3
4
5
6
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip


找到distributionUrl对应的地址https://services.gradle.org/distributions/gradle-4.10.2-all.zip就是gradle的下载地址,注意文件中https后面有个\,复制到浏览器记得要删掉

点击下载 gradle-4.10.2-all.zip

点击下载其他版本gradle

下载完成后,进行解压。
然后打开目录:Macintosh HD 》 用户 》当前登录用户名称》.gradle》wrapper》dists⁩,
可能有些电脑未打开隐藏文件可见,是看不到.gradle文件夹的,它是一个隐藏文件夹。
使用快捷键shift+command+.来切换隐藏文件可见还是隐藏。找到dists文件夹后,把解压后的gradle拷贝一份放到dists文件夹下即可。

根目录下的build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
google()

//代码托管库,设置后可以在项目中引用jcenter上的开源项目
jcenter()
}


//引用anroid插件
dependencies {

//声明gradle插件,插件版本号
classpath 'com.android.tools.build:gradle:3.5.3'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
jcenter()

}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

app目录下的build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266

//声明是Android应用程序还是库模块
//com.android.appliccation 标识应用程序,可以直接运行
//com.android.library 标识这是一个库模块,依附于别的应用程序运行

apply plugin: 'com.android.application'


//配置项目构建的各种属性
android {

//程序在编译时会检查lint,有任何错误提示会停止build,我们可以关闭这个开关
lintOptions{
//即使报错也不会停止打包
abortOnError false
//打包release版本的时候是否进行检测
checkReleaseBuilds false
}


//编译SDK的版本,也就是API Level
compileSdkVersion 28
//build tools的版本,其中包括了打包工具aapt 、 dx
//这个目录工具位于 sdk目录/build-tools/ 下
buildToolsVersion '28.0.3'


//关闭Android Studio的PNG合法性检查
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false

//默认配置
defaultConfig {
//应用程序的包名
applicationId "com.ifeiyv.android001"

//最小的SDK版本,如果设置小于这个版本,或者大于maxSdkVersion将无法安装这个应用
minSdkVersion 19

//目标sdk版本,充分测试过的版本(建议版本)
targetSdkVersion 28

//版本号 每次更新增减
versionCode 1

//版本号,用户看到的版本号
versionName "1.0"

//指定打包成Jar文件时候的文件名称
archivesBaseName = "demo-$versionName"


//Native Development Kit
//原生开发工具包是一组可以让您在Android应用中利用C和c++代码的工具,可用以从您自己的源代码构建,或者利用现有的预构建库.
ndk{
//设置(so)文件名称
moduleName "testfeiyv"
ldLibs "log","z","m","jnigraphics","android"

//显示指定支持的ABIs
abiFilters "armeabi","x86","armeabi-v7a"

//C++11
cFlags "-sd=c++11 -fexceptions"

stl "gnustl_static"
}

//当方法数超过65535的时候允许打包成多个dex文件,动态加载dex
//(方法的索引使用的是一个short值,而short最大值是65535)
multiDexEnabled true

//Instrumentation单元测试
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

sourceSets{
main{
//指定清单文件
manifest.srcFile 'AndroidManifest.xml'
//指定res资源目录
res.srcDirs = ['res']
//asset资源文件
assets.srcDir = ['assets']
//jni代码目录
jni.srcDirs 'src/main/jni'
//jni库目录
jniLibs.srcDir 'src/main/jniLibs'
//指定Java源代码目录
java.srcDirs = ['src']
//指定resource目录
resources.srcDirs = ['src']
//指定aidl目录
aidl.srcDirs = ['src']
//指定source目录
renderscript.srcDirs = ['src']
}

//指定debug模式的路径
debug.setRoot('build-types/debug')
//指定release模式的路径
release.setRoot('build-types/release')
}

//mltiDex的一些相关配置,这样配置可以使编译速度更快
dexOptions{
//让它不要对Lib做preDexing
preDexLibraries = fasle
//开启incremental dexing,优化编译效率。这个功能Android Studio默认是关闭的
incremental true
//增加java堆内存大小
javaMaxHeapSize "4g"
}

//签名配置
signingConfigs{
release{
//密钥文件路径
storeFile file("feiyv.keystore")
//密钥文件密码
storePassword "feiyvpwd"
//key 别名
keyAlias "fy"
//key密码
keyPassword "fypwd"
}
debug{
//密钥文件路径
storeFile file("feiyv.keystore")
//密钥文件密码
storePassword "feiyvpwd"
//key 别名
keyAlias "fy"
//key密码
keyPassword "fypwd"
}
}


//指定生成安装文件的配置,常有两个子包:release,debug,注:直接运行的都是debug安装文件
buildTypes {
//release版本的配置,即生成发布版文件的配置
release {
//是否支持zip
zipAlignEnabled true
//移除无用的resource文件
shrinkResources true
//是否对代码进行混淆,true标识混淆
minifyEnabled false

//指定混淆时使用的规则文件:
//proguard-android.tex指所有项目通用的混淆规则,proguard-rules.pro当前项目特有的混淆规则
//release的Proguard默认为Module下的proguard-rules.pro文件
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

//是否支持调试
debuggable false

//ndk的一些配置
ndk {
// cFlags "-std=c++11 -fexceptions -O3 -D__RELEASE__" // C++11
// platformVersion = "19"
moduleName "hebbewifisafe" // 设置库(so)文件名称
ldLibs "log", "z", "m", "jnigraphics", "android"
// 引入库,比如要用到的__android_log_print
abiFilters "armeabi", "x86", "armeabi-v7a"// "x86"
cFlags "-std=c++11 -fexceptions" // C++11
stl "gnustl_static"
}
// 采用动态替换字符串的方式生成不同的 release.apk (3.0之后版本的修改方式)
applicationVariants.all { variant ->
variant.outputs.all { output ->
if (!variant.buildType.isDebuggable()) {
// 获取签名的名字 variant.signingConfig.name
// 要被替换的源字符串
def sourceFile = "app-release";
// 替换的字符串
               def replaceFile = "Demo-V${variant.versionName}.${releaseTime()}"
               outputFileName = output.outputFile.name.replace(sourceFile, replaceFile)
}
}
}
jniDebuggable false // 关闭jni调试
}
debug { // debug版本的配置
minifyEnabled false
zipAlignEnabled true
shrinkResources true // 移除无用的resource文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debuggable true
// jniDebuggable true
ndk {
cFlags "-std=c++11 -fexceptions -g -D __DEBUG__" // C++11
}
jniDebuggable true
}

}



productFlavors{
//这里可以设置产品发布的一些东西
//比如一种软件要发布到不同的渠道
//且不同渠道中的包名不同,可以在此处
//甚至可以设置不同的AndroidManifest.xml
tencent{

}
huanwei{

}
all{

}
}


// 所谓ProductFlavors其实就是可定义的产品特性,
// 配合 manifest merger 使用的时候就可以达成在一次编译
// 过程中产生多个具有自己特性配置的版本。
// 这个配置的作用就是,为每个渠道包产生不同的 UMENG_CHANNEL_VALUE 的值。
productFlavors.all{
flavor -> flavor.manifestPlaceholder = [UMENG_CHANNEL_VALUE:name]
}



// 指定当前项目的所有依赖关系:本地依赖、库依赖、远程依赖
// 本地依赖:可以对本地 Jar 包或目录添加依赖关系
// 库依赖:可以对项目中的库模块添加依赖关系
// 远程依赖:可以对 jcenter 库上的开源项目添加依赖
// 标准的远程依赖格式是 域名:组织名:版本号

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:recyclerview-v7:28.0.0'
// implementation 'androidx.appcompat:appcompat:1.0.2'
// implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
// androidTestImplementation 'androidx.test.ext:junit:1.1.0'
// androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

}


// 声明是要使用谷歌服务框架
apply plugin: 'com.google.gms.google-services'


// 第三方依赖库的本地缓存路径
task showMeCache << {
configurations.compile.each { println it }
}

// 使用maven仓库。android有两个标准的library文件服务器,一个jcenter一个maven。两者毫无关系。
// jcenter有的maven可能没有,反之亦然。
// 如果要使用jcenter的话就把mavenCentral()替换成jcenter()
repositories {
mavenCentral()
}


def releaseTime() {
return new Date().format("MMdd.HHmm")
}